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;
}

然后另一组空位来处理每个表单的打开/关闭。现在想象一下,我有 5 个表格,而不是 2 个表格。现在我更乱了。有没有一种方法可以概括这一点,让所有表单都具有相同的事件处理程序?

我想过也许在“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 回答