2

フォーム コントロールのフォーカスに問題があります。

form1 で、ボタンをクリックして以下のコードを実行します。

private void btnTest_Click(object sender, System.EventArgs e)
{
    form2 = new Form2();

    Application.Idle += new EventHandler(Application_Idle);

    form2.Show();
    form2.Activate();
    form2.textBox1.Focus();

    Form3 form3 = new Form3();
    form3.ShowDialog();
}

次に、この CLR の後、イベント Application_Idle を実行します。このイベントで、textBox2 コントロールにフォーカスする必要があるメソッドを追加します。

private void Application_Idle(object sender, EventArgs e)
{
    form2.textBox2.Focus();
    form2.textBox2.Select();
    form2.textBox2.Focus();

    Application.Idle -= new EventHandler(Application_Idle);
}

しかし、form1 のボタンをクリックすると、Form2 が表示され、Form3 が表示され、次にApplication_Idleメソッドが発生しますが、form2.textBox2コントロールはフォーカスされません...

行をコメントアウトするとform3.ShowDialog();問題なく動作しますが、フォーム要素を別のフォームアクティベーションでフォーカスするにはどうすればよいですか?( form3.ShowDialog()) ?

追記: 問題は、厳密なアーキテクチャを持っていることと、変更できるのは Application_Idle メソッドだけであることです。

4

3 に答える 3

4

あなたが抱えている問題はモダリティにあります:

フォームとダイアログ ボックスは、モーダルまたはモードレスのいずれかです。アプリケーションの残りの作業を続行するには、モーダル フォームまたはダイアログ ボックスを閉じるか非表示にする必要があります。

重要なメッセージを表示するダイアログ ボックスは、常にモーダルにする必要があります。Visual Studio の [バージョン情報] ダイアログ ボックスは、モーダル ダイアログ ボックスの例です。MessageBox は、使用できるモーダル フォームです。

モードレス フォームを使用すると、最初のフォームを閉じることなく、フォームと別のフォームの間でフォーカスを移動できます。ユーザーは、フォームが表示されている間、任意のアプリケーションの他の場所で作業を続けることができます。

を使用するShowDialogと、表示されるフォームにより、ダイアログ ボックスが閉じられるまで呼び出し元が制御を返すことができなくなります。これが目的の効果でない場合は、Showメソッドを使用できます。

于 2013-01-11T15:55:59.137 に答える
0

フォーム自体に焦点が当てられたら、テキストフィールドに焦点を合わせることができます。

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.GotFocus += (s, e) =>
            {
                this.textBox2.Focus();
            };
    }
}
于 2013-01-11T16:09:20.787 に答える
0

John Koerner が述べたように、モダリティのためにフォーム 3 が開いている間はフォーム 2 にフォーカスを設定することはできません。

続行するにはフォーム 3 へのユーザー入力が必要であると述べたので、アプローチを変更する必要があります。Form 3 の終了を監視するリスナーを配置できます。そうして初めて、フォーカスを別の場所に設定できます

form3.FormClosed += Application_Idle
于 2013-01-11T16:40:24.040 に答える