[英]Refresh DataGridView cell values immediately
我有一個帶有兩個復選框列的DataGridView
。 當檢查它們兩個上的任何行時,我想清除復選標記。 網格由 DataTable 填充。 它是這樣工作的:
if (bothColumnsAreChecked)
{
DataRow first = SelectedFirstItems.First();
DataRow second = SelectedSecondItems.First();
// stuff...
first["IsCheckedFirst"] = false;
second["IsCheckedSecond"] = false;
}
據此,我修改了代碼以在單擊復選框后立即觸發CellValueChanged
事件,而不是在失去焦點時:
void brandsGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
brandsGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
問題是,清除復選標記后,其中一行仍被選中(因為我只是單擊了該行中的復選框),並且該行上的復選標記仍然可見——它不會消失,直到我取消選擇排。 我如何做到這一點? 我試過了:
1) 在網格上Refresh()
。 徒勞無功; 網格被刷新,但在移動光標之前不會重繪。
2) CommitEdit()
和EndEdit()
。 這甚至不會清除最后選擇的復選框。
我能做什么?
編輯:我不擅長解釋。 這是一個簡單的演練:
有兩個復選框列:c1 和 c2。
1) 我在第 r1 行上單擊 c1。 c1 變為選中狀態,而 r1 變為選中狀態。
2)我在第 r2 行(甚至 r1)上單擊 c2。 c2 變為選中狀態,而 r2 變為選中狀態。
3) c1 和 c2 現在被清除(在某處記錄復選框信息后)。
問題是,當 r1 中的 c1 中的 c1 標記消失時,它會保留在 r2 上的復選框中,直到 r2 失去焦點。
希望有幫助。
現在有點清楚了。 你總是可以取消選擇 dgv 中的行,但我不知道這是否是你想要的
brandsGridView.ClearSelection();
我認為最簡單的方法是首先為此 DataGridView 設置綁定,例如:
DataGridView dg = new DataGridView();
DataTable dt = GetDataTable();
dg.DataSource = dt;
然后當你想刷新它時,你再次設置綁定。 是的,我意識到這是骯臟的hacky方式,但它是最簡單的。
DataTable dt = GetDataTable();
dg.DataSource = dt;
舊答案:我認為您可以為此使用 BindingGroup: http : //msdn.microsoft.com/en-us/library/system.windows.data.bindinggroup.aspx
我有一個非常相似的問題。 (嗯,這是一個不同的上下文,但問題是一樣的)
經過大量的嘗試和閱讀,這個和其他相關的線程,我找到了一個解決方案。 這有點簡陋,但對我有用。
該問題與具有焦點的DataGridView
相關。 所以我暫時將焦點更改為另一個控件(例如按鈕),然后將其帶回DataGridView
在你的情況下可能是這樣的:
button1.focus();
if (bothColumnsAreChecked)
{
DataRow first = SelectedFirstItems.First();
DataRow second = SelectedSecondItems.First();
// stuff...
first["IsCheckedFirst"] = false;
second["IsCheckedSecond"] = false;
}
brandsGridView.focus();
我希望它能有所幫助。 但是,如果有人找到了更好的解決方案或更詳細的解釋為什么會發生這種情況。 將不勝感激。
在設置所需的單元格值后使用以下命令對我有用,這是我在Microsoft 論壇帖子上找到的。
brandsGridView.RefreshEdit();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.