Winforms 手动向DataGridView添加新行不会立即更新绑定的DataTable
我有一个用.net-4.0编写的c#windows窗体应用程序 我有一个datagridview(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
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没有得到任何东西。