6

ユーザーがフォームにデータを入力する Windows フォーム アプリケーション (C#) に取り組んでいます。フォームのデータを編集している間はいつでも、ユーザーはフォーム上のボタンの 1 つをクリックして特定のアクションを実行できます。デフォルトでは、フォーカスはクリックされたボタンに移動するため、ユーザーはフォーム上のデータの変更を続けるために、編集するコントロールにクリックし直す必要があります。私ができる必要があるのは、ボタン クリック イベントが処理された後、最後に編集されたコントロールにフォーカスを戻すことです。私が話していることを示すスクリーンショットの例を次に示します。

サンプルアプリのスクリーンショット

ユーザーは、textbox1、textbox2、textbox3 などにデータを入力して、ボタンをクリックすることができます。ボタンがクリックされる前にフォーカスを最後に持っていたコントロールにフォーカスを戻すには、ボタンが必要です。

私が思いついた方法よりも、この機能を実装するためのより良い方法を誰かが持っているかどうか疑問に思っています。これが私が今していることです:

   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 メソッドが起動されるように設定されています。次に、ボタンがクリックされると、ボタンがクリックされる前にフォーカスを持っていたコントロールにフォーカスが戻されます。これに対するよりエレガントなソリューションはありますか?

4

7 に答える 7

16

少し「シンプル」にするために、試してみてください。

public Form1()
    {
        InitializeComponent();

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

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

于 2008-09-01T01:11:00.587 に答える
2

次のことができます

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

于 2008-11-06T16:52:01.350 に答える
1

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

于 2008-09-01T00:51:33.473 に答える
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
}
于 2008-09-01T01:07:00.863 に答える
0

あなたの実装は十分に良さそうです。私が知りたいのは、そもそもなぜこれをやりたいのかということです。フォーカスが最初のエントリに戻ったほうがよいのではないでしょうか? 最後のテキスト ボックスのデータは、ボタンをクリックすると「記憶」されるほど順応性がありますか? または、ボタンがその特定のテキスト ボックス データに対して実行する何らかの操作がありますか? その場合、代わりに後続のコントロールにフォーカスを移すべきではありませんか?

そもそもなぜこれをやりたいのかを知りたいです。

于 2008-09-01T00:51:15.800 に答える
0

ええ、要件が少し変わっていることは認めます。ユーザーがこのアプリケーションに入力する情報の一部は、いくつかの異なるリポジトリにある古いドキュメントのスキャンに存在します。ボタンを使用すると、これらの古いドキュメントを簡単に見つけて開くことができます。ユーザーがフォームに入力する情報が記載されたドキュメントを表示することを決定したときに、ユーザーがフォームのどこにいるのかを予測することは困難です。その意図は、これらのファンキーな状況にもかかわらず、UI フローを適切にすることです。

于 2008-09-01T01:13:05.123 に答える
0

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

于 2014-06-18T19:14:17.867 に答える