手动向 DataGridView 添加新行不会立即更新绑定的 DataTable

Cor*_*ius 3 datatable datagridview winforms c#-4.0

我有用 .net-4.0 编写的 c# windows 窗体应用程序

我有一个 datagridview ( dgvItems),我在导入函数末尾以编程方式绑定到数据集和数据表。

我有一个导入按钮,可以将数据从选定的 Excel 文件导入到名为 的表中_dtItemAdjustList,导入数据后,我将该表绑定到我的网格。我用来绑定网格的代码是:

dgvItems.DataSource = _dsQtyAdjust;
dgvItems.DataMember = "Item Adjust List";
dgvItems.Refresh();
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切工作正常,如果我在 datagridview 中编辑导入的数据,它会在_dtItemAdjustList编辑每个单元格后更新绑定表。

当我尝试手动向 datagridview 添加一行时,我的问题出现了,它不会立即将该新行添加到绑定的数据表中。

示例:我在活动结束时设置了一个断点dgvItems_CellValueChanged并添加了一个_dtItemAdjustList.Rows.Count手表,下面是发生的情况。

导入数据并编辑现有导入行之一后,手表会显示正确的行数,比如说5

现在我单击最后一个 * 行,然后在我的 item# 列中输入一些内容并点击选项卡,断点触发,但我的行数仍然只显示5,我在新行中又填写了一些单元格,但每次我留下一个单元格和我的 CellValueChanged 事件触发,行数保持为5

接下来,我添加第二个手动行,现在,在我从为第二个新行填写的第一个单元格中跳出后,我的行计数器变为6,但从技术上讲,此时我已将2 个手动行添加到我导入的5行中,所以计数器应读数7

这样重复,基本上每个新手动添加到 datagridview 的行都不会添加到绑定数据表中,直到a)添加另一行或b)我返回并重新编辑现有行上的单元格。

编辑忘记提及我尝试通过两种方式绑定我的 DataGridView:

DataSource = _dsQtyAdjust //dataset Name
DataMember = "Item Adjust List" // Table Name in the dataset

DataSource = _dtItemAdjustList
Run Code Online (Sandbox Code Playgroud)

就我的新行行为而言,这没有什么区别。

Cor*_*ius 5

好吧,经过大量的试验、错误和在线搜索,我找到了一个似乎有效的解决方案。

我没有将 DataGridView 直接绑定到 DataTable,而是创建了一个 BindingSource,将 BindingSource 绑定到 DataTable,然后将 DataGridView 绑定到 BindingSource,最后在我的事件中,我使用了和 的dgvItems_CellValueChanged组合来使其工作。EndEdit()NotifyCurrentCellDirty(true/false)

代码示例:

public partial class frmQuantityAdjustment : Form
{
    // In my forms partial class I created a new public BindingSource
    public BindingSource bsItemAdjust = new BindingSource();
}

private void frmQuantityAdjustment_Load(object sender, EventArgs e)
{
    // In my form_Load event I bound the BindingSource to my DataTable
    // and then the DataGridView to the BindingSource
    bsItemAdjust.DataSource = _dtItemAdjustList;
    dgvItems.DataSource = bsItemAdjust;
    dgvItems.Refresh();
}

private void dgvItems_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    // Finally at the end of my CellValueChanged event I added the
    // following code
    bsItemAdjust.EndEdit();
    dgvItems.NotifyCurrentCellDirty(true);
    dgvItems.EndEdit();
    dgvItems.NotifyCurrentCellDirty(false); 
}
Run Code Online (Sandbox Code Playgroud)

我在这个线程上遇到了这个解决方案,经过一些测试,它似乎工作得很好。

现在,我的 DataGridView 中的新行已添加到 CellValueChanged 事件末尾的绑定 DataTable 中。