WinForm DataGridView实时更新表格数据

前言

一个特殊的项目没有用第三方控件库,但用到了DataGridView,由于是客户端产生的数据,所以原始数据源就是一个集合。

根据需要会向集合中添加数据项,或是修改某些数据项的值,但DataGridView并没有提供像RefreshDataSource类似接口。

以为有很简单的解决办法[是的,我指的就是个函数调用],找了一会儿却发现都挺麻烦的样子。最后采用了自己熟悉的做法。

DataGridView绑定数据源:

List<T> source = new List<T>();

DataGridView1.DataSource = new BindingSource { DataSource = source };

解决方法一

[Added201907092253,此方法不太适合于集合作为数据源,需要进一步转换,但切合标题所以写在这儿了]

把数据项T类中的属性作为DataColumn加到DataTable中,然后将DataTable作为表格数据源即可:DataGridView1.DataSource=dataTable;

集合source中的每个T实例就是DataTable中的一行数据。以法二中的Character为例简单在下面写一下代码(现打有错请见谅):

System.Data.DataTable dt = new DataTable(“tableName”);

dt.Columns.Add(new DataColumn { ColumnName= “Name” });   // 列名按需,表格中列标题好像显示的是列名

dt.Columns.Add(new DataColumn { ColumnName= “年龄” }); 

dt.Columns.Add(new DataColumn { ColumnName= “Gender” }); 

dt.Columns.Add(new DataColumn { ColumnName= “Stature” }); 

DataGridView1.DataSource = dt;

// 添加数据

DataRow dr = dt.NewRow();

dr[“年龄”] = 27;

dt.Rows.Add(dr);

dt.AcceptChanges();

// 改变数据

dt.Rows[0][“Gender”] = “1”; 

解决方法二

数据项T类实现System.ComponentModel.INotifyPropertyChanged接口。MSDN上有该接口示例代码,有时间我再补充完整。

来了~1203

接着上面说哈,T is Character,下面是Character类,实现INotifyPropertyChanged接口。

 1     public class Character : INotifyPropertyChanged
 2     {
 3         event PropertyChangedEventHandler m_propertyChanged;
 4         event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
 5         {
 6             add { m_propertyChanged += value; }
 7             remove { m_propertyChanged -= value; }
 8         }
11 
12         string m_name;
13         public string Name
14         {
15             get { return m_name; }
16             set
17             {
18                 if (m_name != value)
19                 {
20                     m_name = value;
22                     // if(m_propertyChanged != null) m_propertyChanged(this, new propertyChangedEventArgs("Name"));
23                     m_propertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
26                 }
27             }
28         }
29 
30         int m_age;
31         public int Age
32         {
33             get { return m_age; }
34             set
35             {
36                 if (m_age != value)
37                 {
38                     m_age = value;41                     m_propertyChanged?.Invoke(this, new PropertyChangedEventArgs("Age"));
44                 }
45             }
46         }
47 
48         int m_gender;
49         public int Gender
50         {
51             get { return m_gender; }
52             set
53             {
54                 if (m_gender != value)
55                 {
56                     m_gender = value;59                     m_propertyChanged?.Invoke(this, new PropertyChangedEventArgs("Gender"));
62                 }
63             }
64         }
65 
66         float m_stature;
67         public float Stature
68         {
69             get { return m_stature; }
70             set
71             {
72                 if (Math.Round(m_stature) != Math.Round(value))
73                 {
74                     m_stature = value;77                     m_propertyChanged?.Invoke(this, new PropertyChangedEventArgs("Stature"));
80                 }
81             }
82         }
83 
84     }

简单说下过程,当外部访问数据源对象即Character的属性的Set方法时,如果属性值发生更改,则属性赋新值,

同时引发属性更改事件,参数即发生更改了的属性名。

 

转载于:https://www.cnblogs.com/xuanhu/p/9795547.html

    原文作者:山清水秀iOS
    原文地址: https://blog.csdn.net/weixin_30904593/article/details/97312621
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞