1

我正在设置SuppressKeyPress = true用户在 a 中按下 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__

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

有没有办法在不破坏 BEEP 的情况下防止 BEEPMaskedTextBox或修复MaskedTextBox之后SuppressKeyPress的方法(如果不是所有方法,我已经尝试了大多数MaskedTextBox本身的方法:refreshText, refresh, 等等...)

这是 MaskedTextBox 定义和 KeyDown 方法:

// 
// 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看起来像这样:

private void general_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true;
        e.SuppressKeyPress = true;
        SendKeys.Send("{TAB}");
    }
}
4

1 回答 1

2

我无法复制,但我肯定会在参考源中看到它。MaskTextBox 还在寻找 Keys.Enter 并在看到它时设置和内部标志,该标志会影响后续击键的键处理。您的代码很可能会搞砸。

通过覆盖 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);
    }
}

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

于 2012-04-20T19:45:04.497 回答