gpt4 book ai didi

c# - DataTable 与 DataGridView 的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 12:12:28 26 4
gpt4 key购买 nike

请向我解释发生了什么。我创建了一个 WinForms .NET 应用程序,它在表单上有 DataGridView,并且应该在使用 DataGridView 内联编辑时更新数据库。

Form 有 SqlDataAdapter _da 并绑定(bind)了四个 SqlCommand。 DataGridView 直接绑定(bind)到 DataTable _names。

这样的 CellValueChanged 处理程序:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
_da.Update(_names);
}

虽然 _names DataTable 已更新,但不更新数据库状态。 _names 的所有行都具有 RowState == DataRowState.Unchanged

好的,我修改了处理程序:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
DataRow row = _names.Rows[e.RowIndex];
row.BeginEdit();
row.EndEdit();
_da.Update(_names);
}

此变体确实将修改后的单元格写入数据库,但是当我尝试将新行插入网格时,我收到有关缺少索引为 e.RowIndex 的行的错误

所以,我决定进一步改进处理程序:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (_names.Rows.Count<e.RowIndex)
{
DataRow row = _names.Rows[e.RowIndex];
row.BeginEdit();
row.EndEdit();
}
else
{
DataRow row = _names.NewRow();
row["NameText"] = dataGridView1["NameText", e.RowIndex].Value;
_names.Rows.Add(row);
}
_da.Update(_names);
}

现在,当我向网格中插入新行时,真正奇怪的事情发生了:网格保持原样,直到 _names.Rows.Add(row);在此行之后,将三行插入到表中 - 两行具有相同的值,另一行具有 Null 值。

稍作修改的代码:

DataRow row = _names.NewRow();
row["NameText"] = "--------------"
_names.Rows.Add(row);

插入具有三个不同值的三行:一个是输入到网格中的值,第二个是“------------”值,第三个是 Null 值。

我真的陷入了猜测正在发生的事情。

最佳答案

我有一个解决方案,但让我解释一下发生了什么。当 CellValueChanged 事件被触发时,DataGridView 已经识别出您对单元格进行了更改,并且它实际上已经将值推送到表中,但是表仍处于编辑模式,因此已修改行的 RowState 仍未更改。此外,插入的行在表格中甚至还不可见。要强制表反射(reflect)这些更改,请调用窗体的 BindingContext 的 EndCurrentEdit() 方法:

this.BindingContext[_names].EndCurrentEdit();

关于c# - DataTable 与 DataGridView 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com