【问题标题】:Cell in editmode doesn't fire OnKeyDown event in C#编辑模式中的单元格不会在 C# 中触发 OnKeyDown 事件
【发布时间】:2011-12-16 17:50:11
【问题描述】:

我已经制作了自己的 datagridview 控件,它覆盖了 OnKeyDown 事件:

public partial class PMGrid : DataGridView
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            e.SuppressKeyPress = true; //suppress ENTER
            //SendKeys.Send("{Tab}"); //Next column (or row)
            base.OnKeyDown(e);
        }
        else if (e.KeyCode == Keys.Tab)
        {
            base.OnKeyDown(e);
            this.BeginEdit(false);
        }
        else
        {
            base.OnKeyDown(e);
        }
    }
}

当我单击 datagridview 并按 Enter 时,它可以完美运行,因为行没有更改并且 KeyUp 事件被触发。但是当我按 Tab 时,会选择下一个单元格并将其更改为 EditMode。当我在这个单元格中按 Enter 键时,不会触发 KeyUp 事件并且 KeyPress 也不会触发。 我尝试这样做,用户可以从一个单元格移动到下一个单元格,然后用户可以在这个单元格中写一些东西,然后当用户按下 Enter 时,这个值被保存到数据库中。但是当单元格处于 EditMode 时,我无法检测到该用户按 Enter。

谢谢

【问题讨论】:

    标签: c# winforms datagridview editmode keyup


    【解决方案1】:

    您应该在datagridview 的EditingControlShowing 事件中调用KeyPress 或KeyUp 事件。像这样的东西应该可以工作:

    private void dtgrd1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        var txtEdit = (TextBox)e.Control;
        txtEdit.KeyPress += EditKeyPress; //where EditKeyPress is your keypress event
    }
    
    
    private void EditKeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
                {
                    e.SuppressKeyPress = true; //suppress ENTER
                    //SendKeys.Send("{Tab}"); //Next column (or row)
                    base.OnKeyDown(e);
                }
                else if (e.KeyCode == Keys.Tab)
                {
                    base.OnKeyDown(e);
                    this.BeginEdit(false);
                }
                else
                {
                    base.OnKeyDown(e);
                }
    
    }
    

    如果您在实现此代码时有任何疑问,请告诉我。

    编辑

    为避免进入下一行,请检查这个已解决的问题:How to prevent going to next row after editing a DataGridViewTextBoxColumn and pressing EnterKey?

    【讨论】:

    • 我根据您的指示更改了代码。但是这段代码会捕获除 Enter 之外的所有按下的键。当我按 Enter 时,这两个事件都不会被触发。还有一个问题。当我按 Enter 并且单元格为 EditMode 时,该行的选择更改为下一行。正如您在 OnKeyDown 中看到的那样,我有 e.SuppressKeyPress = true 以防止在用户按 Enter 时更改行的选择。
    • @Robert 我没有对代码进行任何更改。刚刚更改了您需要从中调用代码的事件。我对您的代码逻辑有些困惑。你能解释一下吗?
    • @Robert 如果您只想在输入时将数据保存到数据库中,只需在输入时执行保存代码。已更新代码
    • 没有。我不能只在输入时保存数据。当用户按下回车键时,该行的选择将更改为下一行。所以我创建了自己的网格,它继承自 DataGridView 并覆盖 OnKeyDown 并抑制 Enter 键。这非常有效。现在,当用户按下输入时,仍然选择同一行。但问题是当用户单击单元格时,我无法按下 Enter 并再次选择行更改为下一行。这里解释一下:csharp411.com/enter-key-in-datagridview。它仅在单元格未处于编辑模式时才有效。
    • @Robert 为什么即使在点击事件上也不调用 EditingControlShowing?
    猜你喜欢
    • 2013-04-30
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多