繁体   English   中英

用`列表进行数据绑定 <T> `

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM