我試圖在用戶完成編輯單元格後更新數據庫中的值。 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中選擇所有單元格已編輯的前一個(參見下圖)
再次,這個只有發生時,單擊出單元格,並進入另一個。否則,即按輸入或單擊另一個控件,它只是選擇第一個單元格。
下面是引用了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;
}
}
}
}
你可以在你的文章中添加PopulateAccounts代碼嗎? – Junaith
完成。 dgvShed.Rows.Clear()方法拋出錯誤。 – SeeSharpCode