2014-03-27 70 views
1

我試圖在用戶完成編輯單元格後更新數據庫中的值。 DataGridView由於DataBinding這個特定數據集中涉及的一些複雜性而被手動(和動態地)填充。在CellEndEdit上重新填充DataGridView

CellEndEdit的事件處理程序中,我調用了我的方法將值更新回數據庫,並且它按計劃運行。當我嘗試重新填充DataGridView時發生問題。作爲參考,這種方法被稱爲PopulateAccounts()

一旦在單元格中輸入了值,如果用戶按下鍵盤上的輸入或單擊窗體上的另一個控件,則一切正常。然而,點擊在下面的錯誤相同的DataGridView結果的另一細胞:

Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function.

PopulateAccounts()方法包括DataGridView.Rows.Clear()其中引發錯誤。我已經在一些相關的SO問題中研究了這個錯誤,並且它似乎與線程有關,我對此毫不知情。一種建議的解決方法是調用我PopulateAccounts()方法:

BeginInvoke(new MethodInvoker(PopulateAccounts)); 

這工作,但它會導致DataGridView中選擇所有單元格已編輯的前一個(參見下圖)

faultyDGV

再次,這個只有發生時,單擊出單元格,並進入另一個。否則,即按輸入或單擊另一個控件,它只是選擇第一個單元格。

下面是引用了PopulateAccounts()的代碼:

// Populates the DataGridView's account records. 
    private void PopulateAccounts() 
    { 
     dgvShed.Rows.Clear(); 

     using (PassShedEntities context = new PassShedEntities(conString)) 
     { 
      foreach (Account acct in context.Account.Where(a => a.Category_id == (int)lstCategories.SelectedValue)) 
      { 
       dgvShed.Rows.Add(); 

       foreach (DataGridViewColumn col in dgvShed.Columns) 
       { 
        Credential cred = (from c in context.Credential 
             join f in context.Field on c.Field_id equals f.Id 
             join a in context.Account on c.Account_id equals a.Id 
             where c.Account_id == acct.Id 
             where f.Label == col.Name 
             select c).SingleOrDefault(); 

        dgvShed.Rows[dgvShed.Rows.Count - 1].Cells[col.Name].Tag = cred.Id; 
        dgvShed.Rows[dgvShed.Rows.Count - 1].Cells[col.Name].Value = cred.Value; 
       } 
      } 
     } 
    } 
+0

你可以在你的文章中添加PopulateAccounts代碼嗎? – Junaith

+0

完成。 dgvShed.Rows.Clear()方法拋出錯誤。 – SeeSharpCode

回答

1

一旦一個值是在單元格中輸入,一切都完美地工作,如果用戶按鍵盤上的回車鍵或單擊窗體上的另一個控制

上述操作不會改變CurrentCell並且網格重新填充工作正常。

但是,單擊另一個單元格,在下面的錯誤相同的DataGridView結果:

當你點擊另一個單元格在DataGridView的CurrentCell正在發生變化和電網內部調用SetCurrentCellAddressCore做小區變更。這個調用在內部產生CellEndEdit事件,這個事件再次觸發SetCurrentCellAddressCore並且這個循環繼續,導致無限循環。 DataGridView檢測到此循環並拋出異常,導致您提到的錯誤。

在上述情況下,我的猜測是DataGridView以某種方式挑選細胞的選擇。您可以簡單地使用DataGridView.ClearSelection()方法清除PopulateAccounts末尾處的選擇。

+0

對不起,我忘了指定我曾嘗試在PopulateAccounts()方法之後使用ClearSelection(),並且它沒有任何效果。 由於CellEndEdit更新數據庫,我意識到我不一定需要在此事件處理程序中重新填充DataGridView,因爲單元格已經包含與數據庫完全相同的值(它在技術上不會綁定到數據庫)。因此,除非有人知道解決細胞選擇問題的一般方法,否則這對我來說不再是個問題。 – SeeSharpCode

0

我一直在摔跤只是完全相同的問題,只是想出了一個解決方案,與我的具體工作。我將CellEndEdit事件中的所有代碼移動到了CellValueChanged事件(它在前者之前觸發),現在都有用於結束單元格編輯的選項:輸入筆劃並單擊另一個單元格,效果很好。

我不確定使用這些事件的最佳方式是什麼,但是這似乎正在工作!