您顯示的兩種方法都會在布爾列上以RowFilter
的形式工作。
這很有可能是您用DataGridView
處理編輯的方式遇到問題 - 直到當前編輯單元失去焦點並且以最常見的方式顯示上下文菜單後,它們纔會被提交到基礎數據源在網格上,細胞不會失去焦點。
也就是說,如果你表現出你的上下文菜單中做這樣的事情:
void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
contextMenuStrip1.Show(dataGridView1, e.Location);
}
}
然後你改變了最近的複選框會不會刷新其數據視圖的變化。
解決方案分爲兩部分。首先,您需要引入位於數據視圖和數據網格之間的綁定源。
bindingSource1.DataSource = dView;
dataGridView1.DataSource = bindingSource1;
然後,你需要將以下代碼添加到「CurrentCellDirtyStateChanged」處理程序上的數據網格視圖:
void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
{
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
最後,您應用過濾器的代碼中,你還需要調用EndEdit
在綁定源:
private void filterToolStripMenuItem_Click(object sender, EventArgs e)
{
bs.EndEdit();
dvSections.RowFilter = "CheckBoxCol";
}
在我以前的經驗次e綁定源是沒有必要的,但我還沒有嘗試過這種混合的上下文菜單和數據視圖,當我嘗試時發現需要bs.EndEdit()
。
是否有您的dataviewcontrol的基礎綁定數據源(如數據表,對象列表),或者是你手動填充數據網格? –
你顯示的兩個選項都應該很好 - 我提供了一個基於我可以認爲會發生這種情況的唯一原因的答案。如果我的猜測錯誤,請提供有關如何重現此問題的詳細信息。最小解決方案的代碼將是最好的。 –