c# - WinForm 尝试提交来自 CellValueChanged 事件的 DataGridView 更改

标签 c# winforms events datagridview commit

我有 2 个用 C# 4.0 编写的表单。 FormA 有一个 DataGridView,通过 DataAdapter 和 BindingSource 连接到 MS SQL 数据库。网格有一个复选框。当用户勾选复选框时,将调用 FormB。 FormB 有一个"is"/“否”按钮。如果 FormB 的 DialogResult 为"is",则应使用复选框的新值更新数据库 - 用户无需按 FormA 上的任何其他项目。

这是一些伪代码:

表格A:

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (dataGridView1.IsCurrentCellDirty)
        {
            dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        DialogResult dialogRes = new FormB().ShowDialog();
        if (dialogRes == DialogResult.Yes)
        {
             dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
             dataGridView1.EndEdit();
             table.EndInit();
             dataAdapter.Update(table);
        }
    }

结果不会保存到数据库中。如果我在按钮事件上放置相同的“保存/更新”功能,它就可以正常工作。所以一定是因为 CellValueChanged 事件需要完成(并且可能需要触发其他事件)才能成功提交更改!?

请帮忙,我快疯了......

编辑:使用 CellEndEdit 具有相同的效果 - 没有。 我已经设置了 SqlCommandBuilder,并且在除上述情况之外的所有其他情况下都正确更新了数据库

最佳答案

您需要查看 MSDN 上有关 sql 命令生成器的示例。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx

为了让适配器使用 Update() 方法,它需要设置命令来执行任务。当您填充数据时,命令生成器用于根据给定的 Select 命令生成这些命令:-

public static DataSet SelectSqlRows(string connectionString,
    string queryString, string tableName)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(queryString, connection);
        SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

        connection.Open();

        DataSet dataSet = new DataSet();
        adapter.Fill(dataSet, tableName);

        //code to modify data in DataSet here

        builder.GetUpdateCommand();

        //Without the SqlCommandBuilder this line would fail
        adapter.Update(dataSet, tableName);

        return dataSet;
    }
}

关于c# - WinForm 尝试提交来自 CellValueChanged 事件的 DataGridView 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821592/

相关文章:

c# - 线程、进程和 Application.Exit()

javascript - 停止输入键提交也会停止多行文本编辑中的输入键

c# - 使用 Visual C# .NET 自定义表单设计器

events - 使用向上和向下键时,如何在 GWT CellTable 中获取选定的行?

javascript - 没有无限的while循环,还有其他方法可以实现 “listening”函数吗?

c# - 从 C# 连续处理 SQL 队列(可能是服务代理)

c# - 如何在 IIS 托管网站中接收自定义 webhook?

c# - 谁能提供 SQLite "SetTimeout"的 C# 示例?

c# - 如何创建、读取和写入 XML C# windows 窗体?

c# - 获取点击的图片框数组索引