1

私のプロジェクトには 2 つのフォームがあります。1 つはボタン付きで、もう 1 つは 2 つのテキストボックス付きです。最初のフォームボタンをクリックすると、別のテキストボックスに入力したいと思います。

コード:

secondForm secondForm = new secondForm();
secondForm.MdiParent = this.MdiParent;
secondForm.fillForm("String");

if (formShown != true)
{
    secondForm.Show();
    formShown = true;
}
else
{
    Application.OpenForms[secondForm.Name].Focus();
}

public void fillForm(string text)
{
    if (String.IsNullOrEmpty(priceText1.Text))
    {
        priceText1.Text = text;
    }
    else
    {
        priceText2.Text = text;
    }
}

シンプルに見えますが、ボタンを2回クリックすると、2番目のフォームのテキストボックスでテキストが検出されず、テキストボックス2ではなくテキストボックス1にデータが入力されます。なぜですか?

4

1 に答える 1

1

問題は、ボタンをもう一度クリックすると、フォームの 2 番目のインスタンスが作成され、それが表示されないことです (代わりに最初のインスタンスに焦点を合わせています)。そうならないように、プログラムをリファクタリングする必要があります。

private secondform secondform = null;

private void Foo()
{
    if(secondForm == null)
    {
        secondForm = new secondForm();
        secondForm.MdiParent = this.MdiParent;
        secondForm.Show();
    }

    secondForm.fillForm("String");

    secondForm.Focus();
}

したがって、新しいインスタンスは、まだインスタンスがない場合にのみ作成され、毎回データを入力してからフォームにフォーカスします。

PS 最初にフォームに焦点を合わせても問題はないので、 の終了後にそのままにしておきましたif。初めてではないときにのみ発生する必要がある場合は、 に を追加しelseて、ifそこにコードを配置できます。

PSSsecondFormは、クラスの名前について標準の命名規則に従っていません。クラス名は大文字で始める必要がありSecondFormます。他の問題の中でも、これにより、が型を参照しているかsecondForm、型のインスタンスを参照しているかについてのあいまいさがなくなります。

PSSS あなたのケースでは機能が必要ないかもしれませんが、子フォームが閉じられてからボタンが再度クリックされた場合を適切に処理する必要があるかもしれません. これを処理する最も簡単な方法は、フォームが閉じられたときにインスタンス フィールドをクリアすることsecondFormです (ボタンが次にクリックされたときに新しいフィールドが作成されるようにします)。クロージャーはこれを非常に簡単にします。次の行を の直前に追加するだけsecondForm.Show();です:

secondform.FormClosed += (s, arg) => secondform = null;
于 2013-03-11T20:43:38.030 に答える