前言
一个特殊的项目没有用第三方控件库,但用到了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