あなたが示した両方の方法はRowFilter
、ブール値の列として機能します。
ハンドルの編集方法に問題がある可能性が最も高いです。DataGridView
現在の編集セルがフォーカスを失うまで、基になるデータ ソースにコミットされません。また、グリッドにコンテキスト メニューを表示する最も一般的な方法では、セルはフォーカスを失いません。
つまり、コンテキスト メニューを次のように表示すると、次のようになります。
void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
contextMenuStrip1.Show(dataGridView1, e.Location);
}
}
次に、変更した最新のチェック ボックスは、その変更をデータ ビューにフラッシュしていません。
これに対する解決策は 2 つの部分にあります。まず、データ ビューとデータグリッドの間にあるバインディング ソースを導入する必要があります。
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";
}
私の以前の経験ではバインディング ソースは必要ありませんでしたが、コンテキスト メニューとデータ ビューをこのように組み合わせて試したことはありませんbs.EndEdit()
でした。