在KeyDown事件中使用SuppressKeyPress是否会损坏MaskedTextBoxes?

时间:2012-04-20 18:50:39

标签: c# .net winforms keydown maskedtextbox

当用户按下SuppressKeyPress = true中的ENTER / RETURN键时,我正在设置MaskedTextBox,以防止通常发出的恼人的哔哔声。这很好用,但当我清除表单时,MaskedTextBox不再按预期运行。输入的第一个字符是一个幻象字符,在输入第二个字符后消失。

示例:

__.___
Set text = "0"
0_.___
User enters text
09.999
User presses ENTER
User presses Save & Next (this clears the form)
Reset text = "0"
0_.___
User enters first 9
09_.___
User enters second 9
0_.9__

如果用户TABS离开MaskedTextBox而不是按ENTER,这样可以正常工作(文本输入正确,没有任何奇怪的移位。)我能找到的唯一区别是我正在使用{{1并且非公开成员中的flagState是不同的(当我不SuppressKeyPress时为2052,而当我SuppressKeyPress时为2048。)

有没有办法可以在不违反SuppressKeyPress的情况下阻止BEEP,或者在MaskedTextBox之后修复MaskedTextBox的方法(我已经尝试了大多数方法,而不是所有方法SuppressKeyPress本身:MaskedTextBoxrefreshText等等......)

这是MaskedTextBox定义和KeyDown方法:

refresh

// // aTextBox // this.aTextBox.Location = new System.Drawing.Point(130, 65); this.aTextBox.Mask = "##.###"; this.aTextBox.Name = "aTextBox"; this.aTextBox.Size = new System.Drawing.Size(50, 20); this.aTextBox.TabIndex = 3; this.aTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.general_KeyDown); this.aTextBox.Leave += new System.EventHandler(this.validate); 看起来像这样:

general_KeyDown

1 个答案:

答案 0 :(得分:1)

我无法重复,但我肯定会在参考资料中看到它。 MaskTextBox在查看时也会查找Keys.Enter和sets以及内部标志,这是一个影响后续按键操作的键处理的标志。你的代码可能会搞砸了。

通过覆盖OnKeyDown确保控件根本看不到击键。这需要继承你自己的控件,如下所示:

using System;
using System.Windows.Forms;

class MyMaskTextBox : MaskedTextBox {

    protected override void OnKeyDown(KeyEventArgs e) {
        if (e.KeyData == Keys.Enter) {
            e.Handled = e.SuppressKeyPress = true;
            this.Parent.GetNextControl(this, true).Select();
            return;
        }
        base.OnKeyDown(e);
    }
}

将代码粘贴到新类中并进行编译。从工具箱顶部删除新控件,替换旧控件。