【问题标题】:Closing a form from another form从另一个表单关闭一个表单
【发布时间】:2017-12-22 22:08:11
【问题描述】:

所以,我正在尝试关闭当前表单 (form1) 和另一个表单 (form2),然后显示 form3

whatsapp wForm = new whatsapp();
wForm.Close();
this.Close();

login logForm = new login();
logForm.Show();

我在早期阶段隐藏了登录表单 (this.Hide()), 登录表单上有一个按钮显示whatsapp表单,whatsapp表单有一个按钮显示设置表单(即form1上方的当前表单),我使用(settings f = new settings(); f.DialogShow();)展示了该表单

现在我正在尝试关闭设置和 whatsapp 表单,并显示登录表单。

【问题讨论】:

  • Google 是你的朋友 :)

标签: c#


【解决方案1】:

当一种形式控制另一种形式时,您可能会陷入真正的混乱,除非存在明确的父/子关系。

我建议你有一个单一的控制对象,例如一个 FormController 类(这是您自己创建的),并从那里控制您的两个表单的呈现。

除了整理对象之间的关系外,您还可以获得更好的单一职责映射——我的意思是,不应该由一种形式来控制另一种形式。相反,当一个动作在一个表单上执行时,它只是引发一个事件来告诉任何关心该动作已经发生的人。如果没有人关心,那就结束了,但是在这种情况下,您将有一个 FormController 注册它对事件的兴趣,并且当它被引发时,窗口控制器的工作就是监听该事件并相应地处理它,即在这个影响另一种形式的可见性/存在的情况。

这是我的意思的一个非常粗略的例子:

public class FormController
{
    private readonly WhatsappForm whatsappForm = new WhatsappForm();
    private readonly LoginForm loginForm = new LoginForm();

    public FormController()
    {
        loginForm.SomeActionPerformed += HandleLoginActionPerformed;
    }

    private void HandleLoginActionPerformed(object sender, EventArgs e)
    {
        whatsappForm.Show();
    }
}

其中 SomeActionPerformed 是登录表单引发的事件,因此:

partial class LoginForm
{
    ...

    public event EventHandler SomeActionPerformed;
}

【讨论】:

  • 您提出了非常重要的观点,所以我已经投了赞成票。但特别是对于可能是新用户的人来说,为您的 FormController 提供一些示例代码以及如何使用它会使这成为一个更好的答案。
【解决方案2】:

我怀疑这里的这篇文章会为你完美地回答这个问题: Open Form2 from Form1, close Form1 from Form2

在子表单上使用将相关父表单作为参数的构造函数将允许您在子表单中访问父表单的 Close() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2013-08-21
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多