【问题标题】:Manually adding a new row to DataGridView does not immediately update the bound DataTable手动向 DataGridView 添加新行不会立即更新绑定的 DataTable
【发布时间】:2015-09-20 15:45:01
【问题描述】:

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

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

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

dgvItems.DataSource = _dsQtyAdjust;
dgvItems.DataMember = "Item Adjust List";
dgvItems.Refresh();

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

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

示例:我在dgvItems_CellValueChanged 事件的末尾设置了一个断点并添加了一个_dtItemAdjustList.Rows.Count 手表,这就是发生的情况。

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

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

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

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

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

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

DataSource = _dtItemAdjustList

就我的新行行为而言,这没有任何区别。

【问题讨论】:

  • 假设Winforms(您没有指定为标签),我发现您使用的数据成员名称不是表名!我会使用这种格式绑定 DatagridviewName.DataSource=DataTableName.
  • @EmmadKareem 抱歉,忘记在我的问题中澄清这一点。我尝试以两种方式绑定 DataGridView,但没有任何区别。我已经用这些信息编辑了我的问题。
  • 名称是_dtItemAdjustList.TableName=="Item Adjust List" 吗?
  • @EmmadKareem 是的。我确实找到了一个似乎可以完美运行的解决方案。我使用 BindingSource 而不是直接将我的 DataGridView 绑定到我的 DataTable。我将其发布为答案。感谢您抽出宝贵时间回复,非常感谢。

标签: winforms c#-4.0 datagridview datatable


【解决方案1】:

好的,经过大量的反复试验和在线搜索,我找到了一个似乎可行的解决方案。

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

代码示例:

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); 
}

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

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

【讨论】:

  • 很高兴你发表了全文!
  • 就我而言,只需调用bsItemAdjust.Endedit() 就可以让我的类似代码工作。我添加了重复的行,或者基础数据表没有得到任何东西。
猜你喜欢
  • 1970-01-01
  • 2021-04-10
  • 2023-04-02
  • 2012-10-03
  • 2015-12-26
  • 2018-11-08
  • 2010-09-09
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多