我使用数据网格视图显示1000行和800列数据(每个单元格只有一个字符)。还有一个复选框列。我添加了一个上下文菜单项,如“查看所选单元格”。点击那个我试图只显示Checked Rows。对于那个早期,我通过循环遍历每个未设置行的Visible
属性设置为False
。这花了很多时间。
所以我尝试通过应用DataView
来使用RowFilter
控件。它看起来更快但是。但是有些已检查的行不可见。
e.g。如果我有10行,则检查5行。然后只能看到4行。实际上它应该显示5行被检查。
我试过这些东西
dView.RowFilter="CheckBoxCol";
dView.RowFilter="CheckBoxCol=true";
对于这两件事我都遇到了同样的问题。任何人都可以帮我吗?
答案 0 :(得分:0)
您显示的两种方法都将作为布尔列的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()
。
答案 1 :(得分:0)
我认为大卫霍尔是正确的(对不起,我没有足够的观点来评论 - 这是我打算在这里做的)
如果可能,请尝试数据网格视图的基础源表上的Table.AcceptChanges。
这应该对表格以及随后的DGV进行任何延迟的更改