在DataGridView中添加新行不会添加到BindingList <t>

时间:2015-06-11 14:49:58

标签: c# datagridview row bindinglist

我使用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

如果需要更多数据,请问我。

1 个答案:

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

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

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