2010-05-11 59 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; 
} 
相關問題