2012-10-07 77 views
0

我知道这听起来有点令人困惑,但它在这里。所以我有这个父窗体,当我点击一个按钮时,一个新的子窗体显示出来(请注意,我的父窗体仍然打开)。我想要的是,当我按下我的子窗体中的一个按钮时,我想要的是一个新的父窗体,显示并关闭已从一开始打开的父窗体。我希望这不会令人困惑。我尝试玩弄它,但似乎没有任何工作 我我的子窗体上有这样的事我父窗体C#窗体窗体应用程序,从子窗体关闭父窗体

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

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

回答

0

总之,你不能改变一个窗口的父母,和你不能改变一个窗口是否是模态的。摧毁孩子,关闭父母,打开新父母,展示新孩子。另外,如果子窗口不必模式,打造孩子Form.Show(),然后像做在孩子形式如下:

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

MFC使用能够假扮模式,但通过这样做使用自定义窗口过程 - 在C#中不是特别容易操作。

+0

我试了一下,它不工作,事情是,我有一个在父窗体(列表框)的客户名单,并与一个按钮,我打开一个新窗口(请注意,我需要我的父窗体在背景,而孩子的形式是开放的),我可以添加一个客户的名字。一旦我提交,我想要一个客户名单,包括我刚刚添加的客户名单。 –

+0

我同意SonicTheLichen。如果您只是更改显示的数据,则无需重新创建表单。查看http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx或者只需清除列表框并在ShowDialog调用后重新添加项目。 – Mitch

1

根据您对Mitch的意见,听起来您需要在关闭子窗体后重新绑定主窗体上的数据。这是比关闭/重新打开主窗体更好的方法。

0

基于米奇您的意见,这个你应该做的:

  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); 
        } 
    } 
    
+0

客户名称是在xml文件中,我在读取客户名称的父表单中有函数。 –

+0

nvm我使用其他方法来使用它 –