您展示的两种方法都可以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";
}
在我之前的经验中,绑定源不是必需的,但是我没有尝试过将上下文菜单和数据视图完全混合在一起,当我尝试时发现它bs.EndEdit()
是必需的。