0

我根据文章DataGridView keydown event not working in C#开发的一些代码有问题。

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

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

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

4

1 回答 1

0

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

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

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

于 2012-12-18T22:04:55.077 回答