分享Winform datagridview 动态生成中文HeaderText

缘起

很久以前给datagridview绑定列的时候都是手动的,记得以前用Display自定义属性来动态给datagridview绑定列。后来发现不行,于是还在博问发了问题:

后来热心网友帮我回答了这个问题,一试还真可以。再次记录一下。

测试流程:

1) View Entity:

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
/// <summary>
   /// IPC完工成品情况查询实体
   /// </summary>
   public class GdvSourceProductRpt
   {
       [DisplayName("客户名称")]
       public string custerName { get; set; }
       [DisplayName("成品订单号")]
       public string orderNo { get; set; }
 
       [DisplayName("产品名称")]
       public string InvName { get; set; }
 
       [DisplayName("制令")]
       public string mo_code { get; set; }
 
       [DisplayName("物料号")]
       public string goods_code { get; set; }
 
       [DisplayName("订单量")]
       public int order_count { get; set; }
 
       [DisplayName("制令数")]
       public int mo_count { get; set; }
 
       [DisplayName("成品产量")]
       public int scanNum { get; set; }
 
       [ProgressBarCell(Style = 1)]
       [DisplayName("完成度")]
       public double rate { get; set; }
   }

 2)DataGridView的DataSource设置为窗体里的 BindingSource,DataGridView自动完成中文列名的显示

这个是手工操作按下不表

3)实现动态绑定列,实现多个数据源在一个DataGridView里显示

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
/// <summary>
       /// 动态绑定DataGridView的列
       /// </summary>
       /// <param name="t"></param>
       /// <param name="dgv"></param>
       protected virtual void BingGridColumn(Type t,DataGridView dgv)
       {
           dgv.Columns.Clear();
           var props = t.GetProperties().Where(prop => prop.GetCustomAttributes(typeof(DisplayNameAttribute), false).Any());
           int col_width = dgv.Width / props.Count() - 8;
           foreach (var prop in props)
           {
               DisplayNameAttribute attrib = (DisplayNameAttribute)prop.GetCustomAttributes(typeof(DisplayNameAttribute), false).FirstOrDefault();
               if (prop.GetCustomAttributes(typeof(ProgressBarCellAttribute), false).Any())
               {
                   DataGridViewProgressBarColumn dc = new DataGridViewProgressBarColumn();
                   dc.Name = "col" + prop.Name;
                   dc.HeaderText = attrib.DisplayName;
                   dc.DataPropertyName = prop.Name;
                   dc.Width = col_width;
                   dgv.Columns.Add(dc);
               }
               else
               {
                   DataGridViewTextBoxColumn dc = new DataGridViewTextBoxColumn();
                   dc.Name = "col" + prop.Name;
                   dc.HeaderText = attrib.DisplayName;
                   dc.DataPropertyName = prop.Name;
                   dc.Width = col_width;
                   dgv.Columns.Add(dc);
               }
           }
       }

 使用:

效果:

顺便贴一下代码,如何实现DataGridView进度条列。

 

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
public class DataGridViewProgressBarCell : DataGridViewCell
   {
       public DataGridViewProgressBarCell()
       {
           this.ValueType = typeof(decimal);
       }
 
       //设置进度条的背景色;
       public DataGridViewProgressBarCell(Color progressBarColor)
           : base()
       {
           ProgressBarColor = progressBarColor;
       }
 
       protected Color ProgressBarColor = Color.Green; //进度条的默认背景颜色,绿色;
       protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
       {
           using (SolidBrush backBrush = new SolidBrush(cellStyle.BackColor))
           {
               graphics.FillRectangle(backBrush, cellBounds);
           }
           base.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
           using (SolidBrush brush = new SolidBrush(ProgressBarColor))
           {
               if (value == null)
                   value = 0;
               decimal num = System.Convert.ToDecimal(value);
               float percent = (float)(num / System.Convert.ToDecimal(100));
               graphics.FillRectangle(brush, cellBounds.X, cellBounds.Y + 1, cellBounds.Width * percent, cellBounds.Height - 3);
               string text = string.Format("{0}%", num);
               SizeF rf = graphics.MeasureString(text, cellStyle.Font);
               float x = cellBounds.X + (cellBounds.Width - rf.Width) / 2f;
               float y = cellBounds.Y + (cellBounds.Height - rf.Height) / 2f;
               Color txtColor = Color.Lime;
               if (System.Convert.ToDecimal(value) < 10)
                   txtColor = Color.OrangeRed;
               if (System.Convert.ToDecimal(value) < 50 && System.Convert.ToDecimal(value) > 20)
                   txtColor = Color.DarkBlue;
               graphics.DrawString(text, cellStyle.Font, new SolidBrush(txtColor), x, y);
           }
       }
   }

 

1
2
3
4
5
6
7
8
public class DataGridViewProgressBarColumn : DataGridViewColumn
   {
       public DataGridViewProgressBarColumn()
           : base(new DataGridViewProgressBarCell())
       {
           CellTemplate = new DataGridViewProgressBarCell();
       }
   }

 

posted @   数据酷软件  阅读(1685)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示