2012-10-21 20 views
0

我有一個窗體和多個控件。在多個用戶控件之間導航一種形式

說我有一個表單,它應該包含一些控件。

我正在嘗試使用單個窗體並根據某些用例添加和刪除控件。

例如,這是在我的形式類的樣本代碼:

private void AddToControlPanel(UserControl control) 
     { 
      this.panelControl.Controls.Add(control); 
      this.panelControl.Tag = control; 
      this.panelControl.Size = control.Size; 
      this.panelControl.Dock = DockStyle.Fill; 
      control.Show(); 
     } 

上述樣品添加到控制面板的一些,並顯示它。

問題是我無法設法添加一些其他控件,並刪除當前的一個。例如,如果某個登錄控件驗證成功,則放棄登錄控制本身並顯示其他內容,如搜索框控件。

這怎麼能實現呢?

這是我到目前爲止已經試過:

if (LoginOK) 
{ 
    //Add the next Control I want to load 
    this.ParentForm.Controls.Add(new CtlPedirDevolucion()); 
    //Remove this actual control 
    this.ParentForm.Controls.Remove(this); 
} 

...所以使用事件處理程序後顯示最新添加的控件:

private void FirstForm_ControlRemoved(object sender, ControlEventArgs e) 
{ 
    this.Controls[this.Controls.Count - 1].Show(); 
} 

但是這不是爲我工作。另外我不喜歡我的方法。

你會建議我一個更好的方法來實現這個請嗎?

+0

您是否嘗試以您首先刪除控件然後添加新控件的方式切換兩個呼叫?或者你也許可以在你的Form中創建一個方法(你可以很容易地使用FindForm方法找到)來切換作爲參數傳遞的控件。 –

+0

毫米將如何?我的意思是,我在表單中的某個東西上想過,在關閉另一個表單後收到一個控件,所以可以創建它,但我不知道該怎麼做。我將搜索一些關於FindForm()的信息 –

+1

調用Show()沒有意義,當您將其添加到父級Controls集合時,控件會自動變爲可見。因此,劃傷你不喜歡的代碼。只是一個壞的錯誤,調用Remove()是一個非常討厭的泄漏。你**必須**使用Dispose()。 –

回答

1

我試過類似的東西,它的工作原理。

代碼在您的形式:

public void SwitchControls(Control removeCtrl, Control addControl) 
{ 
    panel1.Controls.Remove(removeCtrl); 
    panel1.Controls.Add(addControl); 
} 

代碼在你的控制:

MyForm frm = (MyForm)this.FindForm(); 
CtlPedirDevolucion newCtrl = new CtlPedirDevolucion(); 
newCtrl.Dosck = DockStyle.Fill; 
frm.SwitchControls(this, newCtrl); 

編輯:我不好,沒有點創建CtlPedirDevolucion控制將被刪除。它應該在你的Form中實例化,並且應該有一個對它的引用。因此,SwitchControls應該有一個更復雜的邏輯,也許更多的參數,但這是你可以使用的東西。也許你可以製作一個switch-case或者在你的表單中創建控件的東西。我提醒你,這只是一個可行的例子,但非常糟糕。

+0

這工作。謝謝 –