1

多数のWinFormsを含む現在のプロジェクトを開発している間、フォームのオープン/クローズイベントを処理するためだけにコード行が乱雑になっていることに気づきました。現在、私はそれらをそのように扱っています。

//Declare forms
myForm mForm1;
myForm2 mForm2;

private void btnSomething_Click(object sender, EventArgs e)
{
    if (mForm1 == null)
    {
        mForm1 = new myForm();
        mForm1.FormClosed += new FormClosedEventHandler(mForm1_FormClosed);
        mForm1.Show();
    }
    else
        if (mForm1.WindowState == FormWindowState.Minimized)
            mForm1.WindowState = FormWindowState.Normal;
    mForm1.Focus();
}

void mForm1_FormClosed(object sender, FormClosedEventArgs e)
{
    mForm1 = null;
}

そして、各フォームの開閉を処理するための別のボイドのセット。ここで、2つのフォームの代わりに、たとえば5つのフォームがあると想像してください。今、私はさらに散らかっています。これを一般化して、すべてのフォームに同じイベントハンドラーを持たせる方法はありますか?

「as」ステートメントでオブジェクト送信者を使用することを考えましたが、そこから関連する宣言されたフォームインスタンスをどのように見つけるかはわかりません。

sender as (form)

何か案は?

4

2 に答える 2

2

Formsいくつかの実装を作成しますIFormWithMyEvents

于 2012-11-01T11:05:57.640 に答える
1

そのコードを簡単に一般化できます。

//Declare forms
myForm mForm1;
myForm mForm2;

private void btnSomething_Click(object sender, EventArgs e)
{
    ShowOrUpdateForm<myForm>(ref mForm1);
}

void ShowOrUpdateForm<T>(ref Form form) where T : Form
{
    if (form == null)
    {
        form = new T();
        form.FormClosed += new FormClosedEventHandler(mForm1_FormClosed);
        form.Show();
    }
    else if (form.WindowState == FormWindowState.Minimized)
        form.WindowState = FormWindowState.Normal;

    form.Focus();
}

void mForm1_FormClosed(object sender, FormClosedEventArgs e)
{
    // you cannot refactor this easily
    if (sender == mForm1)
        mForm1 = null;
    else if (sender == mForm2)
        mForm2 = null;
}

クローズドイベントハンドラーをさらに一般化したい場合は、フォームの宣言をある種の配列、辞書のリストに移動することを検討する必要があります。そうすれば、その方法を簡単に一般化できます。

編集:ShowOrUpdateForm関数を汎用に変換しました。

于 2012-11-01T11:15:37.437 に答える