我使用DataGridView
AllowUserToAddRows
设置为True
绑定到列表(BindingList<State>
)时出现了一些问题。
通过GUI添加新行时,该行不会添加到BindingList
。
我有一个包含其他实体的集合的实体。例如:国家/地区包含州。因此,datagridview中的新行未添加到国家/地区对象的StateCollection中。
这就是我将BindingList
添加到DataGridView
:
var bl = new BindingList<State>(country.StatesCollection.ToList<State>());
grdData.DataSource = bl;
属性:
EditMode is set to EditOnKeystrokeOrF2
如果需要更多数据,请问我。
答案 0 :(得分:1)
按照您的代码,我使用3个context.MyEntities
个对象初始化MyEntity
。
绑定后,DataGridView
会显示3行以及预期的* NewRow
。因此:
context.MyEntities.Length == 3 // .Count or .Length depending on data structure
((BindingList<MyEntity>)grdData.DataSource).Count == 3
grdData.Rows.Count == 4
将数据输入GUI中的NewRow
后,DataGridView
现在显示4行以及预期的* NewRow
。因此:
context.MyEntities.Length == 3
((BindingList<MyEntity>)grdData.DataSource).Count == 4
grdData.Rows.Count == 5
向DataGridView
添加项目确实将对象添加到BindingList
来源,但未添加到实际的context.MyEntities
来源,我假设是你期望看到这个新项目的添加。
您看到此行为的原因是因为这一行:
var bl = new BindingList<MyEntity>(context.MyEntities.ToList<MyEntity>());
您正在为绑定声明 new 对象。即使context.MyEntities
也是BindingList<MyEntity>
(我怀疑,因为这会否定上述代码行的原因),它将不会使用新条目进行更新。对于所需的行为,您有两个选择:
将context.MyEntities
类型更改为BindingList<MyEntity>
,然后只需将绑定更改为:
grdData.DataSource = context.MyEntities;
处理DataGridView.RowsAdded
并通过手动更新context.MyEntities
a)添加新项目或 b)刷新原始对象:< / p>
private void grdData_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
var source = ((BindingList<MyEntity>)grdData.DataSource);
context.MyEntities = // source converted to the correct Enumerable type
}