【问题标题】:Generic / reusable form open/close events通用/可重用表单打开/关闭事件
【发布时间】:2012-11-01 20:24:17
【问题描述】:

在开发包含许多 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;
}

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

我想过也许在“as”语句中使用对象发送者,但我不确定如何从那里找到相关的声明表单实例。

sender as (form)

有什么想法吗?

【问题讨论】:

    标签: c# .net winforms event-handling


    【解决方案1】:

    让你的Forms 实现一些IFormWithMyEvents

    【讨论】:

    • 您能否再详细说明一下?我只需要覆盖基本事件吗?
    【解决方案2】:

    您可以轻松地概括该代码:

    //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 函数转换为通用函数。

    【讨论】:

    • 我的原始问题可能有误。如果我的表单不都是 myForm 类型会怎样?我们还能概括吗?
    • 是的,因为在 Form 类中定义了 FormClosed 事件。请注意,泛型方法接受 Form,而不是 myForm(大概是继承 Form)。
    • 确实如此,但是“form = new myForm”行不起作用,因为表单并非都是“myForm”类型,而是“Form1”、“Form2”、“Form3”和等等..编辑:也许我可以使用反射来查找引用的表单类型并使用它?
    • 然后使 ShowOrUpdateForm 通用,它会解决你的问题:)
    • 你能编辑你的帖子来显示这个吗?我有一个超级艰难的早晨! :P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2017-07-06
    相关资源
    最近更新 更多