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)
就我的新行行为而言,这没有什么区别。
好吧,经过大量的试验、错误和在线搜索,我找到了一个似乎有效的解决方案。
我没有将 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 中。