在 DataGridView 中添加新行不会添加到 BindingList<T>
Adding new row in DataGridView doesn't add to BindingList<T>
我在使用 DataGridView
并将 AllowUserToAddRows
设置为绑定到列表 (BindingList<State>
) 的 True
时遇到了一点问题。
通过 GUI 添加新行时,该行不会添加到 BindingList
。
我有一个实体,其中包含与其他实体的集合。例如:Country 包含 States。因此,datagridview 中的新行未添加到国家/地区对象的 StateCollection 中。
这就是我将 BindingList
添加到 DataGridView
的方式:
var bl = new BindingList<State>(country.StatesCollection.ToList<State>());
grdData.DataSource = bl;
属性:
EditMode is set to EditOnKeystrokeOrF2
如果需要更多数据,请问我。
按照您的代码,我用 3 MyEntity
个对象初始化了 context.MyEntities
。
绑定后,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>());
您正在为您的绑定声明一个 新 对象。即使 context.MyEntities
也是 BindingList<MyEntity>
(我怀疑这会否定上述代码行的原因),它也不会用新条目更新。对于所需的行为,您有两个选择:
将 context.MyEntities
类型更改为 BindingList<MyEntity>
,然后只需将您的绑定更改为:
grdData.DataSource = context.MyEntities;
处理 DataGridView.RowsAdded
并通过 a) 添加新项目 或 b) 刷新手动更新 context.MyEntities
原始对象:
private void grdData_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
var source = ((BindingList<MyEntity>)grdData.DataSource);
context.MyEntities = // source converted to the correct Enumerable type
}
我在使用 DataGridView
并将 AllowUserToAddRows
设置为绑定到列表 (BindingList<State>
) 的 True
时遇到了一点问题。
通过 GUI 添加新行时,该行不会添加到 BindingList
。
我有一个实体,其中包含与其他实体的集合。例如:Country 包含 States。因此,datagridview 中的新行未添加到国家/地区对象的 StateCollection 中。
这就是我将 BindingList
添加到 DataGridView
的方式:
var bl = new BindingList<State>(country.StatesCollection.ToList<State>());
grdData.DataSource = bl;
属性:
EditMode is set to EditOnKeystrokeOrF2
如果需要更多数据,请问我。
按照您的代码,我用 3 MyEntity
个对象初始化了 context.MyEntities
。
绑定后,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>());
您正在为您的绑定声明一个 新 对象。即使 context.MyEntities
也是 BindingList<MyEntity>
(我怀疑这会否定上述代码行的原因),它也不会用新条目更新。对于所需的行为,您有两个选择:
将
context.MyEntities
类型更改为BindingList<MyEntity>
,然后只需将您的绑定更改为:grdData.DataSource = context.MyEntities;
处理
DataGridView.RowsAdded
并通过 a) 添加新项目 或 b) 刷新手动更新context.MyEntities
原始对象:private void grdData_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { var source = ((BindingList<MyEntity>)grdData.DataSource); context.MyEntities = // source converted to the correct Enumerable type }