[英]Data Binding with `List<T>`
我写了一个小程序来记录数据更改,它使用DataGridView,并且它的数据源是一个List,但是我对DataBingding有一个疑问。
DataTable dataTable = GetBalance();
List<StockBalance> balances = ReadDataTable(dataTable);
List<StockBalance> stockBalances = (List<StockBalance>)dataGridView1.DataSource ?? new List<StockBalance>();
stockBalances.AddRange(balances);
dataGridView1.DataSource = stockBalances;
上面的代码无法刷新DataGridView,而stockBalances包含所有新数据时,余额表中的数据将不会显示在DataGridView中,但是下面的代码可以归档:
balances.AddRange(stockBalances);
dataGridView1.DataSource = balances;
我想原因是List和StockBalance是引用类型,但是我不知道如何验证它,不是吗?
希望有人可以帮助我,谢谢。
当数据发生更改时, DataGridView
(实际上是任何绑定控件)都需要从数据源接收通知,以便知道它需要更新。 这需要一个实现IBindingList
接口的对象。 List<T>
没有实现该接口,因此网格不知道何时列表中的数据发生更改,因此不会更新。
您应该做的是将列表绑定到BindingSource
,然后将其绑定到网格。 在这种情况下,当您对列表进行更改时,可以调用BindingSource
的适当方法,例如ResetBindings
,以向网格提供适当的通知。
请注意,当我说“通知”时,是指一个事件。 IBindingList
对象引发其ListChanged
事件,然后控件处理该事件。
您可以使用Binding源 :
var source = new BindingSource();
List<StockBalance> balances = ReadDataTable(dataTable);
List<StockBalance> stockBalances = (List<StockBalance>)dataGridView1.DataSource ?? new List<StockBalance>();
stockBalances.AddRange(balances);
source.DataSource = stockBalances;
dataGridView1.AutoGenerateColumns=true;
dataGridView1.DataSource = source;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.