2008-09-01 11 views
6

私はユーザーがフォームにデータを入力しているWindowsフォームアプリケーション(C#)に取り組んでいます。フォーム内のデータを編集している間は、フォーム上のいずれかのボタンをクリックして特定の操作を実行できます。デフォルトでは、フォーカスはクリックされたボタンに移動するので、フォーム上のデータの変更を続けるために、編集したいコントロールに戻る必要があります。私ができることが必要なのは、ボタンのクリックイベントが処理された後、最後に編集されたコントロールにフォーカスを戻すことです。ユーザーはなどのTextBox1、TextBox2を、textbox3、にデータを入力することができますwinformアプリケーションでボタンをクリックした後、最後に使用したコントロールにフォーカスを戻すにはどうすればよいですか?

Sample App Screen Shot

、ボタンをクリックしてください:ここで私が話しているものを示すサンプルのスクリーンショットです。私は、ボタンがクリックされる前に、フォーカスが最後にフォーカスを持っていたコントロールに戻すためのボタンが必要です。

誰かが私が思い付いたよりもこの機能を実装する優れた方法を持っているのだろうかと思います。ここで私が今やっているものです:

public partial class Form1 : Form 
    { 
     Control _lastEnteredControl; 

     private void textBox_Enter(object sender, EventArgs e) 
     { 
      _lastEnteredControl = (Control)sender; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Do something here"); 
      _lastEnteredControl.Focus(); 
     } 


    } 

だから、基本的に私たちがここに持っているもの最後に入力された制御を指すクラス変数です。フォーム上の各テキストボックスは、コントロールがフォーカスを受け取ったときにtextBox_Enterメソッドが起動されるように設定されています。次に、ボタンがクリックされると、ボタンがクリックされる前にフォーカスを持っているコントロールにフォーカスが戻されます。誰もこれ以上の優雅なソリューションを持っていますか?

答えて

16

「シンプリシティ」のビットは多分試してみてください。

public Form1() 
    { 
     InitializeComponent(); 

     foreach (Control ctrl in Controls) 
     { 
      if (ctrl is TextBox) 
      { 
       ctrl.Enter += delegate(object sender, EventArgs e) 
           { 
            _lastEnteredControl = (Control)sender; 
           }; 
      } 
     } 
    } 

各テキストボックスを手動で飾ることについて心配する必要はありません(または1つも忘れてしまいます)。

+0

再帰が必要です。 – SLaks

0

あなたの実装は十分に見えます - 私が知りたいことは、なぜこれを最初にやりたいのですか?フォーカスが最初のエントリに戻って循環するのが好ましいのではないでしょうか?最後のテキストボックスのデータは柔軟性があり、ボタンをクリックすると「記憶」されますか?または、ボタンがその特定のテキストボックスデータに何らかの操作をしていますか?その場合、フォーカスは後続のコントロールに移動しませんか?

私は最初にこれをやりたい理由を調べることに興味があります。

1

あなたがやっていることは大丈夫だと思います。私がそれを改善するために考えることができる唯一のことは、アクセスされるごとに各コントロールをスタックに格納することです。それはアクセスされたものの完全なタイムラインを与えるでしょう。

1

あなたのアプローチはよく見えます。追加するすべてのコントロールにイベントハンドラーを追加する必要がないようにするには、再帰ルーチンを作成して、フォーム内のすべてのコントロールにリスナーを追加します(GotFocus)。これはあなたのフォームの任意のタイプのコントロールで動作しますが、あなたのニーズに合わせて調整できます。

private void Form_OnLoad(object obj, EventArgs e) 
{ 
    AddGotFocusListener(this); 
} 

private void AddGotFocusListener(Control ctrl) 
{ 
    foreach(Control c in ctrl.Controls) 
    { 
     c.GotFocus += new EventHandler(Control_GotFocus); 
     if(c.Controls.Count > 0) 
     { 
      AddGotFocusListener(c); 
     } 
    } 
} 

private void Control_GotFocus(object obj, EventArgs e) 
{ 
    // Set focused control here 
} 
0

ええ、私は要件が少し珍しいことを認めます。ユーザーがこのアプリケーションに入力する情報のいくつかは、いくつかの異なるリポジトリにある古い文書のスキャンに存在します。ボタンは、これらの古いドキュメントを見つけて開くことを容易にします。フォームに入力するための詳細情報を含む文書をプルアップすることを決定したときに、ユーザーがフォーム上でどこにいるかを予測することは困難です。その意図は、これらのファンキーな状況にもかかわらず、UIの流れをよくすることです。

2

ボタンをラベルに変更してボタンのように見せます。ラベルにはフォーカスが得られず、余分なコーディングをすべて行う必要はありません。

0

TextBoxから継承するCustomTextBoxというクラスを作成します。 stackという静的変数があります。テキストボックスがフォーカスを失ったときにスタックにプッシュします。最後にフォーカスを当てたコントロールを見つけたい場合は、最初のアイテムをスタックからポップするだけです。静的スタック変数をクリアすることを確認してください。

関連する問題