在 DataGridView 中获取用户添加的行

Getting user added row in DataGridView

提问人:Tim 提问时间:2/17/2015 更新时间:7/21/2022 访问量:2400

问:

我有以下绑定到 List 的 DataGridView:

List<Object> list = new List<Object>();
System.Windows.Forms.DataGridView dataGridView1;
dataGridView1.DataSource = new BindingSource(list, null);
dataGridView1.UserAddedRow += new System.Windows.Forms.DataGridViewRowEventHandler(this.dataGridView1_UserAddedRow);

void dataGridViewMilight_UserAddedRow(object sender, DataGridViewRowEventArgs e) {

    // e.Row.DataBoundItem is always null?
}

如何获取已添加到列表中的对象?

C# Win窗体

评论


答:

-2赞 Phil Wright 2/17/2015 #1

提供的 DataGridViewRowEventArgs 实例的 Row 属性是新创建的行。

void dataGridViewMilight_UserAddedRow(object sender,
                                      DataGridViewRowEventArgs e) 
{
    DataGridViewRow newRow = e.Row;
}

评论

0赞 Tim 2/17/2015
我正在尝试访问该行对应的列表中的对象。为此,我尝试了 e.Row.DataBoundItem,但它似乎总是空的。
0赞 Phil Wright 2/17/2015
哦,我不确定。尝试在源列表中设置一个断点,以便在添加新对象时使用断点。然后运行代码,查看对象实例实际添加到源代码管理的时间点,并查看堆栈以查看它何时出现在网格中。这可能会提供一些线索。
2赞 Jean-Xavier Bardant 6/22/2018 #2

绑定到 DataView 的 DataGridView 也遇到了类似的问题。我想在创建 DataRow 时为隐藏(未绑定)字段提供默认值,但从未有任何绑定项。

我通过处理 DataView 引发的 ListChanged 事件(当事件的 ListChangedType 属性等于 ItemAdded 时)解决了这个问题。如果使用 BindingList 而不是列表或任何实现 IBindingList 的类,则可以处理相同的事件。

评论

1赞 Sal 8/6/2019
我建议使用 DefaultValuesNeeded 事件在新用户添加的行中预填充某些字段。
0赞 Jean-Xavier Bardant 7/21/2022
据我了解,如果您需要提供绑定到网格的值,DefaultValuesNeeded 是一个不错的选择。如果还需要为未绑定 DataGridViewColumn 的字段提供值,则需要处理源的 ListChanged 事件或使用隐藏列。无论如何,对于大多数用例来说,您的解决方案似乎更简单,因为它不依赖于数据源的性质。