在 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>(我怀疑这会否定上述代码行的原因),它也不会用新条目更新。对于所需的行为,您有两个选择:

  1. context.MyEntities 类型更改为 BindingList<MyEntity>,然后只需将您的绑定更改为:

    grdData.DataSource = context.MyEntities;
    
  2. 处理 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
    }