DataView RowFilter未提供正确的结果

时间:2012-08-22 12:04:08

标签: c# winforms datagridview dataview rowfilter

我使用数据网格视图显示1000行和800列数据(每个单元格只有一个字符)。还有一个复选框列。我添加了一个上下文菜单项,如“查看所选单元格”。点击那个我试图只显示Checked Rows。对于那个早期,我通过循环遍历每个未设置行的Visible属性设置为False。这花了很多时间。

所以我尝试通过应用DataView来使用RowFilter控件。它看起来更快但是。但是有些已检查的行不可见。

e.g。如果我有10行,则检查5行。然后只能看到4行。实际上它应该显示5行被检查。

我试过这些东西

  1. dView.RowFilter="CheckBoxCol";
  2. dView.RowFilter="CheckBoxCol=true";
  3. 对于这两件事我都遇到了同样的问题。任何人都可以帮我吗?

2 个答案:

答案 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进行任何延迟的更改