虽然开发了一个包含许多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)
有什么想法吗?
答案 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函数转换为通用。