C# WPF从后台代码生成行列可变的表格
概述
WPF常用的表格控件是DataGrid,这个控件在前台XAML编写的话,一般列已经固定,然后给每个列去绑定数据,但是如果我的列不固定,随着运算结果变动呢?这时候DataGrid,就比较难实现这个需求,这节我就从后台代码去添加控件去实现这个功能.
效果演示
实现方法
-. 前台XAML:
1 2 3 4 5 6 | <dxlc:LayoutControl> <Grid HorizontalAlignment= "Left" VerticalAlignment= "Top" cal:Message.Attach= "[Event Loaded]=[Grid_Loaded($source,$eventArgs)]" /> </dxlc:LayoutControl> |
这里我把grid放到了dxlc:LayoutControl中,这样可以实现grid尺寸超出界面分配的长宽时,横纵出现滑动条:如下图
-.后台代码:
数据模型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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对象:
1 2 3 4 | public void Grid_Loaded( object sender, RoutedEventArgs e) { resultDisplayGrid = (Grid)sender; } |
③添加数据集合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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}"); } } |
④数据表格生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | 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相对尺寸
1 2 3 | var rowDefinition = new RowDefinition(); resultDisplayGrid.RowDefinitions.Add(rowDefinition); rowDefinition.Height = new GridLength(30, GridUnitType.Pixel); //绝对尺寸 |
自动尺寸:
1 | columnDefinition.Width = GridLength.Auto; |
-. link的使用:按照集合中EdgePositions数量降序排列后获取第一个列表值
1 | WidthMetrologyData.OrderByDescending(index => index.EdgePositions.Count).FirstOrDefault().EdgePositions.Count; |
-.生成控件并添加到grid中,并通过SetValue设置控件在grid中的行列位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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编程大全
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!