C# DataGridView控件中正在吞没/未执行Keydown事件

C# DataGridView控件中正在吞没/未执行Keydown事件,c#,datagridview,keydown,C#,Datagridview,Keydown,我对基于本文开发的一些代码有问题 我想允许用户向Dataviewgrid控件添加一行,但发现通过启用AllowUserToAddress,这会导致在新行的新单元格中键入第一个字符后立即显示另一行。这会让我可怜的用户感到困惑,因此为了防止这种情况发生,我使用上面文章中的代码在每次击键时立即禁用allowUserToAddress(尽管我更希望只在键入第一个字符后执行)。然而,这似乎吞掉了输入的第一个字符,即。它不会传递给基类进行处理。以下是完整的代码: public sealed class XD

我对基于本文开发的一些代码有问题

我想允许用户向Dataviewgrid控件添加一行,但发现通过启用
AllowUserToAddress
,这会导致在新行的新单元格中键入第一个字符后立即显示另一行。这会让我可怜的用户感到困惑,因此为了防止这种情况发生,我使用上面文章中的代码在每次击键时立即禁用
allowUserToAddress
(尽管我更希望只在键入第一个字符后执行)。然而,这似乎吞掉了输入的第一个字符,即。它不会传递给基类进行处理。以下是完整的代码:

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);
    }
}

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

我在这个论坛和其他论坛上对这个问题几乎没有什么回应。这一定是一个非常困难的问题,或者我只是对DataGridView控件期望过高。 经过几个小时的反复试验,我已经找到了一个不需要子类化的解决方案。解决方案并不完全是我想要的,也就是说,一旦用户开始在新添加的行中键入内容,就可以防止另一行被追加到网格底部,但这很接近。我使用
CellLeave
事件关闭
AllowUserToAddress
。当用户按Tab键或Enter键将数据输入第一个单元格时,这将有效地从网格中删除新添加的行,将用户留在网格中新添加(最后)行的下一个单元格中(下面没有空行)。不优雅,但至少大部分是功能性的。代码如下:

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

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

建议:您可以
allowUserToAddress=false
并添加一些
按钮
比如说
addButton
,在按钮的单击事件中,
dataGridView1.Rows.add()
并禁用
addButton
,而用户正在修改且尚未完成一行并再次启用。@spajce Thks,我尝试过,但在数据绑定网格上不可能这样做。