【问题标题】:How to control the form that opened another form from this last in C#?如何在 C# 中控制从最后一个表单打开另一个表单的表单?
【发布时间】:2020-07-01 21:07:32
【问题描述】:

我正在编写一个代码,当用户单击一个按钮时,会弹出一个子表单并且用户输入信息。当子窗体出现时,父窗体被最小化。我希望在用户单击 x 按钮时返回父表单。我试图在 childform_FormClosed 事件中将 FormWindowState 属性设置回正常,但是子窗体在父窗体继续最小化时关闭。我正在使用 VS 社区 2019;我看到有人能够通过设计选项卡中的属性窗口访问表单关闭事件属性,但是我在我的 VS 版本中找不到它,所以我写了这段代码。我尝试了以下:

在子窗体中:

private void ChildForm_FormClosed(object sender, FormClosingEventArgs e)
{
    ParentForm frm = (ParentForm)Application.OpenForms["ParentForm"];// find open form
    frm.WindowState = FormWindowState.Normal;
}

【问题讨论】:

    标签: c# forms visual-studio formclosing


    【解决方案1】:

    您可以在父级中注册 Closed 事件。这些也可以在它自身的形式“外部”使用。

    例如:(伪代码)

    public partial class FormParent : Form
    {
        private FormChild _formChild;
    
        public void ButtonOpen_Click(object sender, EventArgs e)
        {
            // if the formChild already exists, don't create a new one.
            if(_formChild != null)
            {
                _formChild.BringToFront();
                return;
            }
    
            _formChild = new FormChild();
            _formChild.Closed += FormChildClosed;
            _formChild.Show();
            this.WindowState = FormWindowState.Minimized;
        }
     
        public void FormChildClosed(object sender, EventArgs e)
        {
            // don't forget to deregister the event, so the old FormChild can be garbage collected.
            _formChild.Closed -= FormChildClosed;
            _formChild = null;
            this.WindowState = FormWindowState.Normal;
        }
    }
    
    public partial class FormChild : Form
    {
        public FormChild()
        {
            // do something
        }
    }
    

    这是你问的,


    这是我的建议,使用 ShowModal,它会阻止当前方法的执行。所以在方法之后,你可以继续做你想做的事。

    public partial class FormParent : Form
    {
        private FormChild _formChild;
    
        public void ButtonOpen_Click(object sender, EventArgs e)
        {
            _formChild = new FormChild();
            this.WindowState = FormWindowState.Minimized;
            _formChild.ShowModal();
            this.WindowState = FormWindowState.Normal;
        }
    }
    
    public partial class FormChild : Form
    {
        public FormChild()
        {
            // do something
        }
    }
    

    【讨论】:

    • 我先通过父视图试试看;对于父表单中的 FormChildClosed 事件,有没有办法通过设计选项卡物理访问它?或者如果我输入它,VS会识别它被调用吗?
    • 通过父表单发送它就像一个魅力,就像你拥有它一样。非常感谢!
    【解决方案2】:

    要获得简洁的设计,您应该使用表单创建者模式并传递源表单,例如:

    ParentForm.cs

    WindowState = FormWindowState.Minimized;
    ChildForm.Create(this).ShowDialog();
    

    ChildForm.cs

    static public ChildForm Create(Form sender)
    {
      ChildForm form = new ChildForm();
      form.Sender = sender;
      return form;
    }
    
    private Form Sender;
    
    private void ChildForm_FormClosed(object sender, FormClosingEventArgs e)
    {
        if (Sender != null)
          Sender.WindowState = FormWindowState.Normal;
    }
    

    如果你愿意,你也可以封装更多:

    ParentForm.cs

    ChildForm.Run(this);
    

    ChildForm.cs

    static public void Run(Form sender, bool isDialog)
    {
      if (sender != null)
        sender.WindowState = FormWindowState.Minimized;
      ChildForm form = new ChildForm();
      form.Sender = sender;
      if ( isDialog )
        form.ShowDialog();
      else
        form.Show();
    }
    
    private Form Sender;
    
    private void ChildForm_FormClosed(object sender, FormClosingEventArgs e)
    {
        if (Sender != null)
          Sender.WindowState = FormWindowState.Normal;
    }
    

    【讨论】:

    • 谢谢。表单创建者模式是一种不同的初始化表单的方式,代替 ChildForm form = new ChildForm(),还是补充它?我以前没有尝试过这种方法。另外,发件人传递了什么信息,一个布尔值?什么是激活表单关闭事件?提前致谢
    • 是的,使用 Create 静态方法您不需要实例化它,就像您在代码中看到的那样。如果不需要将默认构造函数设为私有,则可以将默认构造函数设置为私有。
    猜你喜欢
    • 2016-05-26
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多