在DataGridView控件中吞噬/不执行Keydown事件

时间:2012-12-12 23:20:43

标签: c# datagridview keydown

我在根据文章DataGridView keydown event not working in C#开发的一些代码时遇到了问题。

我想允许用户向Dataviewgrid控件添加一行,但发现通过启用AllowUserToAddRows这导致在第一个字符被输入到新单元格中时会显示另一行新排。这对我的可怜的用户来说会让人感到困惑,所以为了防止这种情况,我使用上面的代码在每次击键时立即禁用AllowUserToAddRows(虽然最好只在输入第一个字符后执行此操作)。然而,这似乎吞下了第一个char类型,i,.e。它不会传递到基类进行处理。这是完整的代码:

public sealed class XDataGridView : DataGridView
{
    private bool _singleUpdateOnly = true;

    public bool SingleUpdateOnly
    {
        get { return _singleUpdateOnly; }
        set { _singleUpdateOnly = value; }
    }

    [Description("Disallows user adding rows as soon as a key is struck to ensure no blank row at bottom of grid")]
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {
        if (SingleUpdateOnly)
        {
            AllowUserToAddRows = false;
        }

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

为什么第一个字体我被吞下了?我怎样才能防止这种情况发生?有没有比我编码的更好的方法?

1 个答案:

答案 0 :(得分:0)

我对这个论坛和其他人的回答很少。它一定是一个非常棘手的问题,或者我只是期望从 DataGridView 控件中获得太多。 经过几个小时的反复试验,我已经找到了一个不需要子类化的解决方案。解决方案并不是我想要的,即一旦用户开始输入新添加的行,就防止另一行被附加到网格的底部,但它接近了。我使用CellLeave事件来关闭AllowUserToAddRows。当用户按Tab或Enter键将数据输入第一个单元格时,这有效地从网格中删除新添加的行,将用户留在网格新添加的(最后一行)的下一个单元格中(下面没有空行) )。不优雅,但至少大部分功能。这是代码:

private void uxContactEmailAddressesGrd_CellLeave(object sender, DataGridViewCellEventArgs e)
{
    uxContactEmailAddressesGrd.AllowUserToAddRows = false;
}

也许有一天,别人会遇到这个问题,找到比我更优雅的解决方案。那简直太好了。确保将解决方案发布到此站点供其他人使用。