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编程大全    
 
posted @   zls366  阅读(737)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示