C# WPF從后臺代碼生成行列可變的表格

z概述

? ? ? WPF常用的表格控件是DataGrid,這個控件在前臺XAML編寫的話,一般列已經固定,然后給每個列去綁定數據,但是如果我的列不固定,隨著運算結果變動呢?這時候DataGrid,就比較難實現這個需求,這節我就從后臺代碼去添加控件去實現這個功能.

效果演示

ab85c99d56f525c86fe3272f2878c22e.png

實現方法

-. 前臺XAML:

<dxlc:LayoutControl><Grid HorizontalAlignment="Left" VerticalAlignment="Top" cal:Message.Attach="[Event Loaded]=[Grid_Loaded($source,$eventArgs)]" /></dxlc:LayoutControl>

這里我把grid放到了dxlc:LayoutControl中,這樣可以實現grid尺寸超出界面分配的長寬時,橫縱出現滑動條:如下圖

f156c08f3f5401664c807c95d7950a6b.png

-.后臺代碼:

數據模型:

public class WidthMetrologyDTO{/// <summary>/// /// </summary>public bool IsMeasureSuccess { get; set; }/// <summary>/// /// </summary>public double Degree { get; set; }/// <summary>/// /// </summary>public string ImageFilePath { get; set; }/// <summary>/// /// </summary>public double Width { get; set; }public double EdgeNum { get; set; }public List<EdgePosition> EdgePositions { get; set; }}public class EdgePosition{public double EdgesAmplitude { get; set; }}

①定義grid以及數據集合:

public Grid resultDisplayGrid;public?BindableCollection<WidthMetrologyDTO>?WidthMetrologyData?{?get;?set;?}= new BindableCollection<WidthMetrologyDTO>();

②控件加載時獲取grid對象:

public void Grid_Loaded(object sender, RoutedEventArgs e){resultDisplayGrid = (Grid)sender;}

③添加數據集合:

public?void?ResultDispaly(){try{WidthMetrologyData.Clear();WidthMetrologyData.Add(new?WidthMetrologyDTO{Width?=?345.1,EdgeNum?=?3,EdgePositions?=?new?List<EdgePosition>{new?EdgePosition(){EdgesAmplitude?=?1.1},new?EdgePosition(){EdgesAmplitude?=?2.2},new?EdgePosition(){EdgesAmplitude?=?3.3},},});WidthMetrologyData.Add(new?WidthMetrologyDTO{Width?=?345.2,EdgeNum?=?2,EdgePositions?=?new?List<EdgePosition>{new?EdgePosition(){EdgesAmplitude?=?4.4},new?EdgePosition(){EdgesAmplitude?=?5.5},},});WidthMetrologyData.Add(new?WidthMetrologyDTO{Width?=?345.3,EdgeNum?=?4,EdgePositions?=?new?List<EdgePosition>{new?EdgePosition(){EdgesAmplitude?=?6.6},new?EdgePosition(){EdgesAmplitude?=?7.7},new?EdgePosition(){EdgesAmplitude?=?8.8},new?EdgePosition(){EdgesAmplitude?=?9.9},},});WidthMetrologyData.Add(new?WidthMetrologyDTO{Width?=?345.0,EdgeNum?=?1,EdgePositions?=?new?List<EdgePosition>{new?EdgePosition(){EdgesAmplitude?=?0.66},},});AddResultGrid();}catch?(Exception?ex){//logger.Debug($"ResultData?add?fail?:?{ex}");}}

④數據表格生成

public void AddResultGrid(){try{resultDisplayGrid.Children.Clear();var gridColumns = 2 + WidthMetrologyData.OrderByDescending(index => index.EdgePositions.Count).FirstOrDefault().EdgePositions.Count;var gridRows = 16;//添加grid行for (int i = 0; i < gridColumns; i++){var columnDefinition = new ColumnDefinition();resultDisplayGrid.ColumnDefinitions.Add(columnDefinition);if (i == 1){columnDefinition.Width = new GridLength(2, GridUnitType.Star);//相對尺寸}else{columnDefinition.Width = new GridLength(1, GridUnitType.Star);}//columnDefinition.Width = GridLength.Auto;}//添加grid列for (int i = 0; i < gridRows; i++){var rowDefinition = new RowDefinition();resultDisplayGrid.RowDefinitions.Add(rowDefinition);rowDefinition.Height = new GridLength(30, GridUnitType.Pixel);//絕對尺寸}//添加數據//var controlWidth = 100;//var controlHeight = 30;for (int degreeIndex = 0; degreeIndex < WidthMetrologyData.Count; degreeIndex++){var rowsCount = 3;var columnsCount = WidthMetrologyData[degreeIndex].EdgePositions.Count;for (int row = 0; row < rowsCount; row++)for (int column = 0; column < columnsCount + 2; column++){TextBlock tb = new TextBlock();//tb.Width = controlWidth;//tb.Height = controlHeight;//tb.HorizontalAlignment = HorizontalAlignment.Left;//tb.VerticalAlignment = VerticalAlignment.Center;Border border = new Border();border.BorderBrush = System.Windows.Media.Brushes.BlueViolet;border.BorderThickness = new Thickness(1);border.Child = tb;border.SetValue(Grid.RowProperty, row + degreeIndex * 4);border.SetValue(Grid.ColumnProperty, column);resultDisplayGrid.Children.Add(border);if (row == 0 && column >= 2){tb.Text = (column - 1).ToString();}else if (row == 1 && column >= 2){tb.Text = WidthMetrologyData[degreeIndex].EdgePositions[column - 2].EdgesAmplitude.ToString();}else if (row == 2 && column >= 2){if (column == 2){tb.Text = WidthMetrologyData[degreeIndex].Width.ToString();//tb.Width = columnsCount * controlWidth;tb.SetValue(Grid.ColumnSpanProperty, columnsCount);}else{continue;}}if (column == 0){if (row == 0){switch (degreeIndex){case 0:tb.Text = "第一組"; break;case 1:tb.Text = "第二組"; break;case 2:tb.Text = "第三組"; break;case 3:tb.Text = "第四組"; break;default: break;}//tb.Height = 3 * controlHeight;tb.SetValue(Grid.RowSpanProperty, 3);}else{continue;}}if (column == 1){switch (row){case 0:tb.Text = "ID"; break;case 1:tb.Text = "Value"; break;case 2:tb.Text = "Fraction"; break;default:tb.Text = string.Empty; break;}//tb.Width = controlWidth;}}}resultDisplayGrid.Width = (gridColumns + 1)* 40;//resultDisplayGrid.Height = gridRows * controlHeight;}catch (Exception ex){//logger.Error($"Add result  grid fail,{ex}");}}

解釋:

-. grid添加行以及尺寸設置:ridUnitType.Pixel代表絕對尺寸,GridUnitType.Star相對尺寸

var rowDefinition = new RowDefinition();resultDisplayGrid.RowDefinitions.Add(rowDefinition);rowDefinition.Height = new GridLength(30, GridUnitType.Pixel);//絕對尺寸

自動尺寸:

columnDefinition.Width = GridLength.Auto;

-. link的使用:按照集合中EdgePositions數量降序排列后獲取第一個列表值

WidthMetrologyData.OrderByDescending(index => index.EdgePositions.Count).FirstOrDefault().EdgePositions.Count;

-.生成控件并添加到grid中,并通過SetValue設置控件在grid中的行列位置

TextBlock tb = new TextBlock();//tb.Width = controlWidth;//tb.Height = controlHeight;//tb.HorizontalAlignment = HorizontalAlignment.Left;//tb.VerticalAlignment = VerticalAlignment.Center;Border border = new Border();border.BorderBrush = System.Windows.Media.Brushes.BlueViolet;border.BorderThickness = new Thickness(1);border.Child = tb;border.SetValue(Grid.RowProperty, row + degreeIndex * 4);border.SetValue(Grid.ColumnProperty, column);resultDisplayGrid.Children.Add(border);

源碼

鏈接:https://pan.baidu.com/s/1mgzyTRVwvq1XpJ6y0iyVww?

提取碼:6666

技術群:添加小編微信并備注進群

小編微信:mm1552923 ??

公眾號:dotNet編程大全? ??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287444.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件架構實踐文章鏈接

2019獨角獸企業重金招聘Python工程師標準>>> 架構 InfoQ: 又拍網架構中的分庫設計 SNS網站數據庫技術分析 - 51CTO.COM 數據庫水平切分的實現原理解析 - iBATIS - Java - JavaEye論壇 基于amoeba的mysql分布式數據庫學習&#xff08;一&#xff09; - Java - JavaEy…

【看動漫學編程】程序員在異世界生個娃 第2篇:外掛已準備就緒

前言 作者文筆比較水&#xff0c;還請見諒。 以下內容還將使用視頻動態漫畫表現&#xff0c;剪輯完將會貼出鏈接。 小說劇情為劇情需要&#xff0c;過渡到知識點&#xff0c;部分篇幅可能沒有技術知識點還望諒解。 由于沒有經費支持&#xff0c;所以畫出來的東西是我自己用代碼…

java剪切txt文件_用Java把剪切板的內容實時保存到txt

test類&#xff1a;提示用戶程序已啟動&#xff0c;提示保存位置&#xff0c;清空剪切板。package com.ariya.service;import com.ariya.service.impl.ClipboardServiceImpl;/*** author Ariya* 程序入口*/public class Test {public static void main(String[] args) {Clipboa…

【三維激光掃描】第一章:三維激光掃描入門基礎知識

隨著地理空間信息服務產業的快速發展,地理空間數據的要求越來越高。對地理空間數據的要求正朝著大信息量、高精度、可視化和可挖掘方向發展。地面激光雷達技術是一門新興的測繪技術,已逐漸成為廣大科研和工程技術人員全新的解決問題的手段。地面三維激光掃描技術與全站儀測量…

Android之kotlin里面本地圖片BitmapFactory.decodeFile轉bitmap失敗問題

1 問題 我們手機本地有個圖片文件比如如下 /storage/emulated/0/Android/data/package_name/cache/1586444511539.png 我們需要png轉bitmap&#xff0c;然后設置到ImageView里面顯示 var bitmap BitmapFactory.decodeFile(imagePath);if (bitmap null) returnelse mImagevi…

3、面向對象-繼承-多態

1、繼承子類可以繼承父類的一切&#xff0c;一個子類只能有一個父類&#xff0c;一個父類可以有多個子類//父類class Ren{public $name;public $sex;public $yuyan;function Say() {echo $this->name."正在講話&#xff01;";}}//美國人的子類class America ex…

整理iOS9適配中出現的坑

一、NSAppTransportSecurity iOS9讓所有的HTTP默認使用了HTTPS&#xff0c;原來的HTTP協議傳輸都改成TLS1.2協議進行傳輸。直接造成的情況就是App發請求的時候彈出網絡無法連接。解決辦法就是在項目的info.plist 文件里加上如下節點&#xff1a; NSAppTransportSecurity - NSAl…

由c# dynamic是否裝箱引發的思考

前言前幾天在技術群里看到有同學在討論關于dynamic是否會存在裝箱拆箱的問題,我當時第一想法是"會"。至于為啥會有很多人有這種疑問&#xff0c;主要是因為覺得dynamic可能是因為有點特殊&#xff0c;因為它被稱為動態類型,可能是因為這里的動態對大家造成的誤解,認為…

【看動漫學編程】程序員在異世界生個娃 第3篇:搞不好我就是個王者

前言 作者文筆比較水&#xff0c;還請見諒。 以下內容還將使用視頻動態漫畫表現&#xff0c;剪輯完將會貼出鏈接。 小說劇情為劇情需要&#xff0c;過渡到知識點&#xff0c;部分篇幅可能沒有技術知識點還望諒解。 由于沒有經費支持&#xff0c;所以畫出來的東西是我自己用代碼…

PHP會話控制考察點

為什么要使用會話控制技術 HTTP協議是無狀態的&#xff0c;也就是說HTTP沒有一個內建的機制來維護兩個事務之間的狀態。當一個用戶完成一個請求發起第二個請求的時候&#xff0c;服務器無法知道這次請求是來自于上一次的客戶。而用戶登錄、購物車等&#xff0c;這些是需要服務器…

數據庫SQL語句學習筆記(6)-使用函數處理數據

1.SQL也可以用函數來處理數據&#xff0c;函數一般是在數據上執行的&#xff0c;為數據的轉換和處理提供了方便。但是每一個數據庫管理系統&#xff08;DBMS&#xff09;都有特定的函數&#xff0c;事實上&#xff0c;只有少數幾個函數被所有的DBMS等同地支持。例如&#xff0c…

java3n 1_1005 繼續(3n+1)猜想(JAVA)

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目里&#xff0c;情況稍微有些復雜。當我們驗證卡拉茲猜想的時候&#xff0c;為了避免重復計算&#xff0c;可以記錄下遞推過程中遇到的每一個數。例如對 n3 進行驗證的時候&#xff0c;我們需要計算 3、5、8、4、2、1&…

【遙感物候】Matlab求解一元六次多項式,計算植被生長季始期

一元六次多項式能很好的逼近濾波后的曲線,與二次多項式相比,在擬合植被整個生長季曲線方面有更好的優勢,該方法常用來描述北方溫帶和高緯度地區時序NDVI生長季模式。因此,本文使用一元六次多項式來擬合植被整個生長季曲線,效果很好。那么擬合后,這樣解方程呢求生長季參數…

Android之給控件添加水紋波效果

1 問題 給控件添加水紋波效果&#xff0c;點擊起來像點中了&#xff0c;不然效果太粗糙了&#xff0c;沒反應。 2 實現 給控件添加如下屬性 android:background"?android:attr/selectableItemBackground"波紋有邊界 android:background"?android:attr/sele…

《看聊天記錄都學不會C語言?太菜了吧》(1)我在大佬群里問基礎問題沒人理?

若是大一學子或者是真心想學習的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手…

個人博客作業_week2

1. 是否需要有代碼規范 1.這些規范都是官僚制度下產生的浪費大家的編程時間、影響人們開發效率&#xff0c;浪費時間的東西。 我不同意這個論點。 有句俗語’無規矩不成方圓‘&#xff0c;這亙古傳承的至理同樣適用于寫代碼。制定代碼撰寫規范并不是 迫于壓力完成上級的任務&am…

最全面透徹的RabbitMQ指南

概念RabbitMQ是實現了高級消息隊列協議&#xff08;AMQP&#xff09;的開源消息代理軟件&#xff08;亦稱面向消息的中間件&#xff09;。RabbitMQ服務器是用Erlang語言編寫的&#xff0c;而集群和故障轉移是構建在開放電信平臺框架上的。所有主要的編程語言均有與代理接口通訊…

TensorFlow中RNN實現的正確打開方式

上周寫的文章《完全圖解RNN、RNN變體、Seq2Seq、Attention機制》介紹了一下RNN的幾種結構&#xff0c;今天就來聊一聊如何在TensorFlow中實現這些結構&#xff0c;這篇文章的主要內容為&#xff1a; 一個完整的、循序漸進的學習TensorFlow中RNN實現的方法。這個學習路徑的曲線較…

【遙感物候】Hants NDVI時間序列諧波分析法數據重構,植被生長季曲線效果可佳(附Hants軟件下載)

NDVI時間序列諧波分析法(Harmonic Analysis of NDVI Time-Series)(簡稱Hants )對時間序列數據進行平滑。該方法是一種新的物候分析方法,可用于定量化的監測植被動態變化。其核心算法是傅里葉變換和最小二乘法擬合, 即把時間波譜數據分解成許多不同頻率的正弦曲線和余弦曲線,…

Android之在Java socket作為服務器里面返回數據頭部怎么寫入瀏覽器需要下載文件的文件名

1 問題 Android app里面寫了一個Java socket的簡單服務器,在瀏覽器里面輸入相應的IP和端口訪問服務器下載文件,Java socket怎么寫返回數據的頭部信息,瀏覽器才知道需要下載文件的名字呢? 2 關于Content-Disposition 在常規的HTTP應答中,Content-Disposition 響應頭指示回…