0

アプリに 2 つのフォームがForm1あり、Form2. フォームが既に読み込まれているかどうかを確認するより良い方法があるかどうかを知りたいです。フォームがメモリにロードされて表示されている場合、ボタンは何もしないでUser ください。フォームが閉じている場合は、フォームを再インスタンス化する必要があります。

詳細については、私のコードまたはコメントを確認してください.. :)

public partial class Form1: Form
{
    private Form2 form2;

    public Form1() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {

        if (form2== null) {
            form2= new Form2();
        } else {
            if (form2.has_exited()) { // this is a private property
                                      // that I set when Form2.Closing executes
                form2.Dispose();
                form2= new Form2();
            }
        }
        form2.Show();
    }
}
4

4 に答える 4

6

Form2終了イベントを処理する必要はありません。次から直接実行できForm1ます。

private Form2 form2;

private void button1_Click(object sender, EventArgs e)
{
    if (form2 == null)
    {
        form2 = new Form2();
        form2.FormClosed += (_, arg) =>
        {
            form2 = null;
        };
        form2.Show();
    }
    else
    {
        //the other form has been opened and not closed; not sure what you want to do
    }
}

Showまた、フォームが経由で表示されている場合は、破棄する必要がないことに注意してください。経由で表示する場合は表示しShowDialogますが、非モーダル ダイアログを使用すると、dispose を呼び出す終了イベントにイベント ハンドラーが自動的にアタッチされます。

于 2012-10-25T13:53:44.597 に答える
3

私は使うだろう

if (form2 == null)
{
    form2 = new Form2();
    form2.FormClosed += (s, e) => { this.form2 = null; };
    form2.Show();
}
form2.BringToFront()

form2したがって、が閉じられるたびに、参照が に設定されnullます。次回は再インスタンス化できます。

それがまだそこにある限り、それを前に持ってきてください。

于 2012-10-25T13:54:30.773 に答える
0

Form1 を Form2 に渡すことができ、.Loaded のようなイベントで、または Form2 での破棄/終了中に Form1 オブジェクトを使用して、それらのイベントが発生したことを知らせることができます。

于 2012-10-25T13:51:13.277 に答える
0

フォームを表示している場合、フォームは Form.Shown というイベントをスローします。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.shown.aspx

ある種の処理コードをそこに置くことができます (フラグを設定するだけであっても)。同様に、ユーザーがフォームを閉じると、フォームを閉じる/閉じるイベントがあります。

formloaded イベントもあると思いますが、頭の中で思い出すことができません。

于 2012-10-25T13:51:55.017 に答える