我有两个用C#4.0编写的表单。 FormA有一个DataGridView,它连接到一个带有DataAdapter和BindingSource的MS SQL数据库。网格有一个复选框。当用户勾选复选框时,会调用FormB。 FormB有一个“是”/“否”按钮。如果FormB中的DialogResult为“是”,则应使用复选框的新值更新数据库 - 用户无需在FormA上按任何其他项目。
这是一些伪代码:
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,并且数据库正在上述所有其他情况下正确更新
答案 0 :(得分:2)
您需要在sql命令构建器上查看来自MSDN的此示例。
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;
}
}