4

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

表单有SqlDataAdapter _da 和四个 SqlCommands 绑定到它。DataGridView 直接绑定到 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 值。

我真的被困在猜测发生了什么。

4

3 回答 3

2

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

this.BindingContext[_names].EndCurrentEdit();
于 2012-11-24T22:59:44.857 回答
1

获得您想要的行为(我认为)的最简单方法是引入绑定源 - 将数据表设置为该绑定源的数据源,然后将绑定源设置为网格。

单元格值更改后变为:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    bs.EndEdit();
    _da.Update(_names);
}
于 2012-11-24T23:02:38.657 回答
0

NECRO 回答:最简单的方法是使用另一个数据集进行更改:

private void UpdateDB()
{
    using (SqlConnection conn = new SqlConnection(SQLString.ConnStr))   // All new connection
    {
        try
        {
            dataAdapter.SelectCommand = new SqlCommand(SQLString.QryStr, conn);
            cmd.DataAdapter = dataAdapter;

            changeSet = dataSet.GetChanges();
            if (changeSet != null)
            {
                dataAdapter.Update(changeSet, "tstRegion");
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }
}

请注意,原始数据集的更改是更改数据集中的所有内容。

于 2017-10-05T20:11:21.450 回答