2012-03-25 6 views
0

私はWinform C#の初心者です。今私は挑戦的な要求に迫られていますが、それは皆さんにとっては愚かかもしれません。テキストボックス内のタブ - 小数点の前後の値の間のタブ

以下の要件のコードで私を助けてください。

私はWinformアプリケーションで10進値(Amount)のテキストボックスを持っています。私は良いバリデーションなどを保持しています。それは小数点の後に2桁しか許されません。また、ユーザーが以前のコントロールからこのテキストボックスにタブする場合、whoe値(テキストボックスの10進数、たとえば "22223.39"が強調表示されます)が表示されます。すべての良い。

私のビジネスユーザーは、以前のコントロールからこのテキストボックスにタブを移動し、上記の例で小数点以下の桁数を変更すると仮定します。それは新しい値でのみ上書きされ、値 "22223"は依然として維持されます。彼らは前と後ろにまた戻ることができるはずです。

単純な言葉で言えば、ユーザーがテキストボックス内でタブする場合は、最初に番号フィールドに移動して番号をハイライト表示する必要があります(上記の例では「22223」が強調表示され、 (上記の例では39 ")、私はそれを行う方法がわかりません。また、ユーザーが再び3回目にタブを押すと、次のコントロール/テキストボックス(Asusual )。

しかし、私は、私が言及したものをまったく同じ機能をしたい。愚かである、2つのテキストボックスを維持する考えを持って、唯一のテキストボックスとそのC#のWinフォームアプリで。

また、私はその数値のアップダウンコントロールを必要といけません持っている私たちの要求には限界があります。

+0

Windowsユーザーエクスペリエンスの相互作用のガイドライン:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=2695 - >あなたは2つの目的のために、Tabキーを使用して終了しなければ、少なくとも正常に戻すための設定が必要です。 –

+0

タイトルに「C#Winform」などのプレフィックスを付けないでください。それはタグのためのものです。 –

答えて

1

それは良い考えではなく、ウィンドウアプリケーションの標準操作に反します。

さらに、コントロールのTabStopをオフにして、タブで自分自身を行う必要があります。私は上記のことを念頭に置いてユーザーと話し合い、 "。"小数点以下の桁数を強調するのに十分でしょう。ここに私の提案されたソリューションを実証するためのいくつかのコードがあります:

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyValue == 190 && textBox1.Text.IndexOf(".") > 0) 
    { 
     textBox1.SelectionStart = textBox1.Text.IndexOf(".") + 1; 
     textBox1.SelectionLength = 2; 
     e.SuppressKeyPress = true; 
    } 
} 

あなたは、複数のテキストボックスには、この機能を共有するのInitializeComponent(に入る)と次の操作を実行したい場合:

ジェレミー・トンプソンとして
this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown); 
this.textBox2.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown); 
this.textBox3.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown); 
+0

あなたはまた、タブのフォーカスが外れるのを防ぎます – SimpleVar

+0

間違いはありません。 2つのテキストボックスをフォームに置き、タブを押すと、フォーカスが次のテキストボックスにどのように移動するかを確認します。 –

+0

OPは、小数点を含む単一のテキストボックスを要求し、フォーカスを変更するのではなく、ハイライト表示するようにタブを移動しました。 – SimpleVar

4

当然、言いますこれは悪い考えですので、他のより標準的な入力方法を使用するようにユーザーに考えさせてください。

私はこの仕事をすることができるかどうかを見て練習として主に、私は頭の上から考えることができるすべての試行で正しく動作する次のサブクラス化されたテキストボックスコントロールを考え出しました。これには、テキストボックスの内外を正確にタブで移動するだけでなく、左向きの矢印を戻して小数点部分を再度ハイライト表示するなどのことも含まれます。

メイントリックはIsInputKeyオーバーライドです。残りのコードはテスト対象から来ました。これに基づいて何かを使用して終了する場合は、徹底的にテストしてください。スタンダードコントロール機能のワーピングと同様に、奇妙なコーナーケースを持つ可能性が高いからです。

public class TabTextBox : TextBox 
{ 

    public bool ready_to_leave = false; 

    protected override void OnEnter(EventArgs e) 
    { 
     this.SelectionStart = 0; // this.Text.IndexOf(".") + 1; 
     this.SelectionLength = this.Text.IndexOf("."); 
    } 

    protected override bool IsInputKey(Keys keyData) 
    { 
     if (keyData == Keys.Tab && !ready_to_leave) 
     { 
      return true; 
     } 
     else 
     { 
      return base.IsInputKey(keyData); 
     } 
    } 

    protected override void OnLeave(EventArgs e) 
    { 
     ready_to_leave = false; 
     base.OnLeave(e); 
    } 

    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (ready_to_leave) 
     { 
      e.Handled = true; 
     } 
     base.OnKeyPress(e); 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (e.KeyData == Keys.Tab && !ready_to_leave) 
     { 
      this.SelectionStart = this.Text.IndexOf(".") + 1; 
      this.SelectionLength = 2; 
      ready_to_leave = true; 
      e.Handled = true; 
     } 
     else 
     { 

      base.OnKeyDown(e); 
     } 
    } 

    protected override void OnKeyUp(KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Left) 
     { 
      if (this.SelectionStart - 1 < this.Text.IndexOf(".")) 
       ready_to_leave = false; 
     } 
     base.OnKeyUp(e); 
    } 
} 
関連する問題