绑定到SqlDataAdapter时如何确定DataGridView是否包含未提交的更改

JYe*_*ton 5 c# sql winforms

我有一个包含DataGridView,BindingSource,DataTable和SqlDataAdapter的表单。我按如下所示填充网格和数据绑定:

private BindingSource bindingSource = new BindingSource();
private DataTable table = new DataTable();
private SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM table ORDER BY id ASC;", ClassSql.SqlConn());
private void LoadData()
{
    table.Clear();
    dataGridView1.AutoGenerateColumns = false;
    dataGridView1.DataSource = bindingSource;
    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
    dataAdapter.Fill(table);
    bindingSource.DataSource = table;
}
Run Code Online (Sandbox Code Playgroud)

然后,用户可以对数据进行更改,然后分别单击保存或取消按钮来提交更改或放弃更改。

private void btnSave_Click(object sender, EventArgs e)
{
    // save everything to the displays table
    dataAdapter.Update(table);
}

private void btnCancel_Click(object sender, EventArgs e)
{
    // alert user if unsaved changes, otherwise close form
}
Run Code Online (Sandbox Code Playgroud)

如果单击取消,我想添加一个对话框,如果存在未保存的更改,则警告用户未保存的更改。

题:

如何确定用户是否已在DataGridView中修改了数据但未将其提交到数据库?有没有一种简单的方法可以将当前DataGridView数据与上次检索的查询进行比较?(请注意,不会有其他线程或用户同时更改SQL中的数据。)

JYe*_*ton 4

为了检测 DataGridView 中的更改,我最终使用了两个事件:CellValueChangedCurrentCellDirtyStateChanged(后者是由于复选框类型列)。

当其中任何一个事件发生时,我设置一个布尔值 (UnsavedChanges) 来指示存在更改。当表单关闭或单击取消按钮(现在重命名为“恢复”)时,将检查布尔值,如果设置为 true,则会显示对话框。如果单击保存按钮,布尔值将设置为 false 并保存数据。

虽然不像检查数据绑定或数据网格的一个属性那么简单,但它可以按需要工作。