【问题标题】:Using + (plus) and - (minus) keyboard keys as incrementors and decrementors in a DataGridView在 DataGridView 中使用 +(加号)和 -(减号)键盘键作为增量器和减量器
【发布时间】:2011-04-03 19:35:51
【问题描述】:

在我用 C# 编写的 WinForms 应用程序中,我有一个 DataGridViewTextBoxColumn 单元格保存整数值,我希望用户能够使用键盘上的 + 和 - 键来递增或递减。

我已经处理了 KeyDown 事件,因为它通常用于处理 Delete 键等,但它不适用于加号和减号键,因为按下它们会导致单元格进入编辑模式,并且结果,这些键永远不会触发 KeyDown 事件。 KeyPress 事件也一样

实际上,如果我将单元格设置为只读,它就会被触发,但我对这个解决方案不满意,因为它会迫使我在代码的多个区域将属性从 true 设置为 false,并且很快就会变得混乱。

请问实现这一目标的最佳方法是什么?

谢谢。

【问题讨论】:

    标签: c# winforms datagridview keypress keyboard-events


    【解决方案1】:

    你试过了吗:

    而不是使用这个:Keys.OemMinus 使用这个:Keys.Subtract

    而不是使用这个:Keys.Oemplus 使用这个:Keys.Add

    【讨论】:

    • 请注意,您可能需要检查两组,在我的 Logitech K120 键盘上,Keys.OemplusKeys.OemMinus 用于数字行上的 [+] 和 [-] 键,Keys.AddKeys.Subtract 用于数字键盘上的 [+] 和 [-] 键。
    【解决方案2】:

    哇,那篇知识库文章非常糟糕。这应该通过覆盖 IsInputKey() 来完成。

    我不太关心 DGV,定制它是个麻烦。但是你可能可以把它变成某种形状:

    using System;
    using System.Windows.Forms;
    
    class MyDgv : DataGridView {
        public event EventHandler Increment;
        public event EventHandler Decrement;
    
        protected override void OnKeyDown(KeyEventArgs e) {
            bool used = false;
            if (this.EditingControl == null) {
                if (e.KeyData == Keys.Oemplus) {
                    if (Increment != null) { Increment(this, EventArgs.Empty); used = true; }
                }
                else if (e.KeyData == Keys.OemMinus) {
                    if (Decrement != null) { Decrement(this, EventArgs.Empty); used = true; }
                }
            }
            if (used) e.SuppressKeyPress = e.Handled = true;
            else base.OnKeyDown(e);
        }
    }
    

    【讨论】:

    • 谢谢,这很优雅。我试过了,如果我取消 CellBeginEdit 事件,它就可以工作。问题是 DataGridView 的 OnKeyDown 事件在 CellBeginEdit 事件之后触发,所以我无法确定用户按下了哪个键来取消事件。任何想法?另外,您说 DGV 很难定制:起初我认为它非常彻底,但我同意我很快就会遇到它的局限性?有任何第三方建议吗?我尝试过的所有这些看起来都非常皮肤/主题,我喜欢 DGV 的风格,因为它与其他 WinForms 控件很好地融合在一起。
    • 正是我的意思,这很痛苦。如果您使用击键,请将 e.SuppressKeyPress 和 e.Handled 设置为 true,我忘了包括它。帖子已更新。
    • 谢谢,我已经尝试了您的新代码,但问题是如果用户可以修改单元格,则增量和减量事件处理程序不会触发。如果我将它们设置为只读,事件确实会发生,但在我的情况下,它们需要是可修改的。看起来好像要进入编辑模式的单元格发生在 OnKeyDown 方法之前,并阻止它运行。在我的情况下,单元格应该由用户修改。我在 Dave 的回答下方的评论中使用的方法有效,因为表单事件在任何 DGV 之前触发,但它并不像我所说的那样优雅。有什么方法可以让你的工作?
    【解决方案3】:

    您需要在按键到达数据网格之前捕获按键。

    这看起来非常接近您正在尝试做的事情: http://support.microsoft.com/kb/320584

    【讨论】:

    • 好的,谢谢。这是工作。实际上,比知识库中显示的更简单的解决方案是将表单的 KeyPreview 属性设置为 true,然后处理表单的 KeyDown 事件。虽然它有效,但它有几个缺点:DataGridView 的某些逻辑在表单的相关事件中,而不是在 DataGridView 的事件中。由于即使使用此解决方案,单元格仍会进入编辑模式,因此我必须跟踪按键是否被按下以及是否在 bool 标志中的正确列中,如果标志为真则取消 CellBeginEdit 事件以防止它发生进入编辑模式。
    • 除了它不像我想要的那样优雅之外,这很好用,非常感谢。我会让这个打开一段时间,以防其他人有其他建议。
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多