0

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

所以我尝试DataView通过应用 Control 来使用RowFilter. 它看起来有些快但是。但是某些选中的行是不可见的。

例如,如果我有 10 行,则检查其中的 5 行。然后只有 4 行可见。实际上它应该显示被检查的 5 行。

我试过这些东西

  1. dView.RowFilter="CheckBoxCol";
  2. dView.RowFilter="CheckBoxCol=true";

这两件事我都遇到了同样的问题。谁可以帮我这个事?

4

2 回答 2

0

我认为大卫霍尔是正确的(对不起,我没有足够的评论点 - 这就是我打算在这里做的)

如果可能,在数据网格视图的基础源表上尝试 Table.AcceptChanges。

这应该将任何挥之不去的更改提交给表,然后提交给 DGV

于 2014-09-11T11:40:13.213 回答
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()是必需的。

于 2012-08-22T21:34:56.037 回答