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

Winforms 手动向DataGridView添加新行不会立即更新绑定的DataTable,winforms,c#-4.0,datagridview,datatable,Winforms,C# 4.0,Datagridview,Datatable,我有一个用.net-4.0编写的c#windows窗体应用程序 我有一个datagridview(dgvItems),我通过编程将其绑定到导入函数末尾的dataset和datatable 我有一个导入按钮,可以将选定excel文件中的数据导入一个名为\u dtItemAdjustList的表,导入数据后,我将该表绑定到我的网格。我用于绑定网格的代码是: dgvItems.DataSource = _dsQtyAdjust; dgvItems.DataMember = "Item Adjust L

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

我有一个datagridview(
dgvItems
),我通过编程将其绑定到导入函数末尾的dataset和datatable

我有一个导入按钮,可以将选定excel文件中的数据导入一个名为
\u dtItemAdjustList
的表,导入数据后,我将该表绑定到我的网格。我用于绑定网格的代码是:

dgvItems.DataSource = _dsQtyAdjust;
dgvItems.DataMember = "Item Adjust List";
dgvItems.Refresh();
到目前为止一切正常,如果我在datagridview中编辑导入的数据,它会在编辑每个单元格后更新绑定表
\u dtItemAdjustList

当我试图手动向datagridview添加一行时,我的问题就出现了,它不会立即将新行添加到绑定的datatable中

示例:我在我的
dgvItems\u CellValueChanged
事件的末尾放置了一个断点,并添加了一个
\u dtItemAdjustList.Rows.Count
观察发生的情况

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

现在,我单击最后一行*并在“我的项目”列和“点击”选项卡中键入一些内容,断点触发,但我的行数仍然只显示5,我在新行中再填充一些单元格,但每次我离开一个单元格时,我的CellValueChanged事件触发,行数保持在5

接下来,我添加了第二个手动行,现在,在我为第二个新行填写的第一个单元格中添加了制表符之后,我的行计数器立即变为6,但从技术上讲,此时我已将2手动行添加到导入的5,因此计数器应为7

这会重复,基本上每个手动添加到datagridview的新行都不会添加到绑定的datatable中,直到添加另一行或返回并重新编辑现有行上的单元格

编辑 忘了提一下,我尝试用两种方式绑定DataGridView:

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

DataSource = _dtItemAdjustList

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

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

我没有将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); 
}
我在一次测试后发现了这个解决方案,它似乎工作得很好


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

假设Winforms(您没有指定为标记),我发现您使用的datamember名称不是表名!我将使用以下格式绑定DatagridviewName.DataSource=DataTableName。@EmmadCareem抱歉,我忘记在问题中澄清这一点。我试着以两种方式绑定DataGridView,但没有任何区别。我已经用这些信息编辑了我的问题。名称dtItemAdjustList也是如此。TableName==“项目调整列表”?@EmmadCareem Yes。我确实找到了一个似乎非常有效的解决方案。我使用了BindingSource,而不是直接将DataGridView绑定到DataTable。我把它作为答案贴了出来。感谢您花时间回复,非常感谢。很高兴您发布了完整的故事!在我的例子中,我需要调用
bsitemdadjust.Endedit()
,才能使类似的代码正常工作。我添加了重复的行,或者底层datatable没有得到任何东西。