2012-04-20 24 views
1

MaskedTextBoxのENTER/RETURNキーを押して、通常行われる迷惑なビープ音を防ぐために、SuppressKeyPress = trueを設定しています。これは素晴らしいですが、私のフォームをクリアすると、MaskedTextBoxはもはや期待どおりに動作しません。入力された最初の文字は、2番目の文字が入力された後に消えるファントム文字です。KeyDownイベントでSuppressKeyPressを使用すると、MaskedTextBoxesが破損しますか?

例:

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

代わりに押すのMaskedTextBoxのうち、ユーザTABSは、入力した場合、これは正常に動作します(テキストは任意の奇数シフトせずに正しく入力されている。)私は見つけることができる唯一の違いは、そのI 「非公共のメンバーでflagStateが異なることSuppressKeyPressを使用してMと(私はSuppressKeyPressを行うと、私はSuppressKeyPress 2048ないとき2052。)

MaskedTextBoxや方法を壊すことなく、BEEPを防止するためのいずれかの方法はありますを修正するSuppressKeyPress後(私が試したほとんどの場合ではないMaskedTextBox自体は上のすべてのメソッド:refreshTextrefresh、等...)ここで

は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}"); 
    } 
} 

答えて

1

私は再プロローグできませんが、参照元で確実に表示されます。 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); 
    } 
} 

は、新しいクラスのコードを貼り付けてコンパイルします。新しいコントロールをツールボックスの上部から削除し、古いコントロールを置き換えます。

+0

それは価値があるので、私はそれをreproしました。 OPのコードは、次のキーを押すとスペース(Chr(32))が挿入されます。あなたの投稿はひどくハッキーな回答を投稿することから私を救った。 +1。 – LarsTech

+0

これはうまくいった!どうもありがとうございました。 SendKeys.Key( "{TAB}")を使用することには何らかの欠点がありますか? GetNextControlを実行するだけでは、フォーム上のコントロールの一部がアクティブでないため、面倒です。 – Brian

+0

"アクティブ"はあまり意味がありません。 GetNextControlは無効なコントロールを扱います。あなたが好むものを使用してください。 –

関連する問題