2012-10-07 71 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我使用其他方法來使用它 –