2010-05-11 28 views
4

我有一个包含DataGridView,BindingSource,DataTable和SqlDataAdapter的表单。我填充网格和数据绑定如下:如何确定DataGridView是否包含绑定到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; 
} 

然后,用户可以更改该数据,并提交这些更改或通过点击丢弃它们或者是保存或分别取消按钮。

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 
} 

我想补充一个对话框,如果单击了取消该警告的未保存的更改用户,如果存在未保存的更改。

问:

如何确定用户是否修改DataGridView的数据,但它不能提交到数据库?有没有简单的方法来比较当前的DataGridView数据与上次检索的查询? (请注意,不会有任何其他线程或用户在同一时间改变在SQL数据。)

回答

2

为了检测在DataGridView变化,我卷起使用两个事件中,CellValueChangedCurrentCellDirtyStateChanged(后者由于复选框类型列)。

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

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

+0

这可能会成为问题,如果UI变得更加复杂(每个表更多的控件)。 – 2010-05-12 15:31:11

1

这可能是一个愚蠢的问题,但为什么不工作?

Dim changes As DataTable = table.GetChanges() 
     If changes.Rows.Count > 0 Then 
      MessageBox.Show("You have unsaved edits!") 
     End If 

如果你的数据表上通过的BindingSource绑定到您的datagridview那么你最近修改但未提交的修改是在你的数据表挂出。数据集和数据表具有一个“getchanges”方法,可以执行严格的检查工作,并返回到您正确编辑的内容并进行相应操作。

虽然我确定你现在已经过去了。但是我看到了你的帖子,并认为它可能对未来有所帮助。

0

嗯,我在围绕一个技巧玩希望它会帮助你所有的,我跟踪使用bindingsource的CurrentItemChanged方法的变化。的datagridview到标志的变化在这里,我已经使用标签属性,你可以使用一个变量:

private void cONTRACTERBindingSource_CurrentItemChanged(object sender, EventArgs e) 
     { 
      if (cONTRACTERDataGridView.Tag==null) 
      { 
       DataRow ThisDataRow = 
       ((DataRowView)((BindingSource)sender).Current).Row; 
       if (ThisDataRow.RowState == DataRowState.Modified) 
        cONTRACTERDataGridView.Tag = "1"; 
      } 
     } 

请记住,这触发可真正解雇许多次,因此,这两个if语句控制运行一次。最后你可能会在退出按钮处理程序上的代码,如我的情况代码在这里:

private void btExit_Click(object sender, EventArgs e) 
     { 
      if (cONTRACTERDataGridView.Tag.Equals("1")) 
      { 
       if (MessageBox.Show("Do you want to save the changes..!?", "Save Changes", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) 
        cONTRACTERBindingNavigatorSaveItem_Click(null, null); 
      } 
      this.Close(); 
     } 

在取消更改,重置标志。希望它对你有用,太。

问候

0

与小桌子与数据集在处理不希望处理小区改变事件并取消编辑时,可以使用的一些改进型:

private bool isDGVRowDirty(DataGridView dgv, int idxrow) 
{ 
    if (idxrow < 0) return false; 
    DataGridViewRow dgvRow = dgv.Rows[idxrow]; 
    DataRowView rowview = (DataRowView)dgvRow.DataBoundItem; 
    DataRow row = rowview.Row; 
    if (row.RowState == DataRowState.Unchanged) 
     return false; 
    if (row.RowState != DataRowState.Added || row.RowState == DataRowState.Modified) 
    { 
     return true; 
    } 

    for (int idxCol = 0; idxCol < dgv.Columns.Count - 1; idxCol++) 
     if (dgv[idxCol, idxrow].FormattedValue.ToString() != dgv[idxCol, idxrow].Value.ToString()) return true; 

    return false; 
} 
相关问题