【问题标题】:C# windows form application, closing parent form from childC# windows 窗体应用程序,从子窗体关闭父窗体
【发布时间】:2012-10-07 00:56:17
【问题描述】:

我知道这听起来有点令人困惑,但就是这样。所以我有这个父表单,当我单击一个按钮时,会出现一个新的子表单(请注意,我的父表单仍然打开)。我想要的是当我从我的子表单中按下一个按钮时,我想要一个新的父表单来显示并关闭从一开始就已经打开的父表单。我希望这听起来不会令人困惑。我尝试使用它,但似乎没有任何效果 我的父表单上有类似的东西

Form2 loging = new Form2();    
loging.ShowDialog();

在我的孩子表单上

Form1 loging = new Form1();
loging.Close()
loging.ShowDialog();
this.Close();

【问题讨论】:

    标签: c# forms parent-child


    【解决方案1】:

    根据您对 Mitch 的 cmets,听起来您需要在关闭子窗体后重新绑定主窗体上的数据。这比关闭/重新打开主窗体要好得多。

    【讨论】:

      【解决方案2】:

      简而言之,您无法更改窗口的父级,也无法更改窗口是否为模态。销毁孩子,关闭父母,打开一个新的父母,显示一个新的孩子。或者,如果子窗口不需要是模态的,则使用Form.Show() 创建子窗口,然后在子窗体中执行以下操作:

      parentForm.Close();
      Form newParent = new NewParentForm();
      newParent.Show();
      this.BringToFront();
      

      MFC 曾经能够伪装成模态,但它是通过使用自定义窗口过程来实现的——这在 C# 中并不是特别容易做到的。

      【讨论】:

      • 我试了一下,但它不起作用,问题是我在父表单(列表框)中有一个客户列表,并用一个按钮打开一个新窗口(注意我需要我的父母表单在子表单打开时位于后台),我可以添加客户名称。提交后,我想要一份客户列表,包括我刚刚添加的客户。
      • 我同意 SonicTheLichen。如果您只是更改显示的数据,则无需重新创建表单。查看msdn.microsoft.com/en-us/library/… 或只是清除列表框并在调用 ShowDialog 后重新添加项目。
      【解决方案3】:

      根据您对 Mitch 的评论,您应该这样做:

      1. 在您的父表单中,创建一个指向您的客户列表的静态 ListView 对象

        public partial class Form1 : Form
        {
            public static ListView lsvCustomer; 
            public Form1()
            {
                InitializeComponent();
                // this will allow access from outside the form
                lsvCustomer = this.listView1; 
            }
        
            private void button1_Click(object sender, EventArgs e)
            {
               frmInput f = new frmInput();
               f.ShowDialog(this);
            }
        }
        
      2. 然后在您的子表单中,您可以直接从您的子表单更新列表,如下所示:

        public partial class frmInput : Form
        {
            public frmInput()
            {
                InitializeComponent();
            }
        
            private void button1_Click(object sender, EventArgs e)
            {
                //update user input to customer list in parent form
                Form1.lsvCustomer.Items.Add(textBox1.Text);
            }
        }
        

      【讨论】:

      • 客户姓名在 xml 文件中,我在父表单中具有读取客户姓名的功能。
      最近更新 更多