通用/可重复使用的表单打开/关闭事件

时间:2012-11-01 11:02:34

标签: c# .net winforms event-handling

虽然开发了一个包含许多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)

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

Forms实施一些IFormWithMyEvents

答案 1 :(得分: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函数转换为通用。