【问题标题】:WinForm trying to commit DataGridView changes from CellValueChanged eventWinForm 尝试从 CellValueChanged 事件提交 DataGridView 更改
【发布时间】:2012-11-29 02:02:07
【问题描述】:

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

这是一些伪代码:

甲型:

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,并且在上述情况之外的所有其他情况下,数据库正在正确更新

【问题讨论】:

  • 尝试DataGridView.CellEndEdit 事件而不是CellValueChanged

标签: c# winforms events datagridview commit


【解决方案1】:

你需要看看这个来自 MSDN on sql command Builder 的例子。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 2017-01-27
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2016-07-17
    相关资源
    最近更新 更多