2012-11-01 60 views
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) 

任何想法?

回答

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函数转换为泛型。

+0

这可以工作,我会给它一个快速检查:) –

+0

我可能在我原来的问题中犯了一个错误。如果我的表单不是所有类型的myForm,会发生什么?我们还可以推广吗? –

+0

是的,自FormClosed事件在Form类中定义。请注意,泛型方法接受Form,而不是myForm(推测这是继承Form)。 –

2

让你的Forms执行一些IFormWithMyEvents

+0

你可能再详细一点吗?我只需要重写基本事件? –