1

SuppressKeyPress = trueユーザーがENTER / RETURNキーを押したときに、MaskedTextBox通常発生する迷惑なビープ音を防ぐように設定しています。これはうまく機能しますが、フォームをクリアMaskedTextBoxすると、期待どおりに動作しなくなります。最初に入力した文字は幻の文字で、2文字目を入力すると消えます。

例:

__.___
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__

ユーザーが ENTER を押す代わりに TABSキーMaskedTextBoxを押すと、これは正常に機能します (テキストは奇妙なシフトなしで正しく入力されます)。SuppressKeyPress(しないときは 2052、するときはSuppressKeyPress2048 SuppressKeyPress)

を壊さずにBEEPを防ぐ方法、またはアフターMaskedTextBoxを修正する方法はありますか(それ自体のすべてではないにしても、ほとんどの方法を試しました: 、、など...)MaskedTextBoxSuppressKeyPressMaskedTextBoxrefreshTextrefresh

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 に答える