如何在列表中移动太远的情况下使用过滤器集停止DataGridView?

时间:2011-06-23 22:05:46

标签: c# winforms .net-3.5 datagridview filter

考虑绑定到某个数据库的dataGridView。 dataGridView的绑定源有一个过滤器,它只显示描述字段为空的位置。

这个想法是用户只会看到具有此值的记录,这些记录需要他们注意。用户将始终将该值更改为其他值。

我的问题是,一旦他们通过enter或tab键移动到下一行,它几乎在他们移动到下一行后过滤,将其位置移动到下面的行所在的位置。

有没有办法控制此行为,以便在发生过滤后位置不会跳到下一行?我不想在这个特定问题的数据集上单独填写,但我知道这是一个解决方案。我想知道如何更好地控制过滤。

修改

值得注意的是,我没有将任何事件连接到datagridview,这是将控件拖到窗体上,从数据集连接到它的绑定源,并填充数据集的开箱即用行为在form_load事件上。

修改

当前行为示例 - (C)表示光标位置

用户键入第2行中的名称并将状态设置为TRUE

R1 - John Doe     FALSE
R2 - Jane Doe     TRUE (C)
R3 - Rob  Doe     FALSE
R4 - Joe  Doe     FALSE

用户按下返回(或选项卡,无论哪个,对于此示例,其输入...)

R1 - John Doe     FALSE 
R3 - Rob  Doe     FALSE 
R4 - Joe  Doe     FALSE (C)

当前选中的行现在是第4行,它实际上应该是第3行。如果我没有将值从false更改为true,则它不会被过滤,并且会将我正确地移动到第3行

修改

因为我没有得到合适的解决方案来解决这个问题,所以从死里复活。那里有人有创意吗? ^ _ ^

1 个答案:

答案 0 :(得分:1)

我前一段时间与DataGridView有同样的问题 我想更改Enter键的行为以向上移动选定的行而不是向下移动。这是我做的,我希望它能帮到你。我创建了一个继承DataGridView的控件,并覆盖了ProcessCmdKey并对其进行了更改。在您的情况下,您想要做的是:

public partial class MyDataGridView : DataGridView
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Tab || keyData == Keys.Enter)
        {
            return true;
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

按Enter或Tab键时,这将停止gridView移动到下一行。我希望它对你有用,如果不能说出来是什么问题。