2016-03-23 56 views
-1

我有2個控件繼承UserControl 一個是一個容器,另一個是基本文本框標籤的集合,因此標記爲ContainerControlComboControlC#從父容器和列表中刪除控件

ContainerControl包含一個List<ComboControl>和一個foreach循環,將它們添加到FlowLayoutPanelComboControl有一個按鈕,我想用它來清除自己的父母的列表。

我不知道這樣做的最佳方式是什麼。 this.parent並投到ContainerControlDispose()工作?我相當肯定,我可以一個引用傳遞到List,但聽起來不必要的凌亂...

public partial class ContainerControl : UserControl 
{ 
    List<ComboControl> ComboControls = new List<ComboControl>(); 
    ... 
    //procederaly generate and fill ComboControls here 
    ... 
    foreach (ComboControl value in ComboControls) 
    { 
     this.flowLayoutTable.Controls.Add(value); 
    } 
... 
} 

public partial class ComboControl : UserControl 
{ 
    private void BtnDel_Click(object sender, EventArgs e) 
    { 
     //what goes here 
    } 
... 
} 
+1

您必須發佈一些代碼,以便有人可以幫助您。 – Johannes

+0

確定放置了一些樣機代碼。 –

+1

'this.flowLayoutTable.Controls.Clear()'和'ComboControls.Clear()'應該足夠了。但是,如果還有其他對組合控件的引用(例如事件註冊給它們),則還需要清除它,否則可能會發生內存泄漏。 –

回答

2

沿着什麼Zohar Peled說,像這樣刪除控制,以避免泄漏資源的線條。

private void cleanup(Control c) 
{   
    foreach(Control child in c.Controls)   
     cleanup(child);   

    if (c.Parent != null) 
    { 
     c.Parent.Controls.Remove(c); 
     c.Dispose(); 
    } 
} 
0

對於方案這樣我會用一個自定義事件發送刪除請求於母公司控制:

您ComboControl與自定義事件:

//Create Custom Event 
    public delegate void DeleteControlDelegate(object sender); 

    public partial class ComboControl : UserControl 
    { 
     //Custom Event to send Delete request 
     public event DeleteControlDelegate DeleteControlDelegate; 

     public ComboControl() 
     { 
      InitializeComponent(); 
     } 

     //Invoke Custom Event 
     private void OnDeleteControl(object sender) 
     { 
      DeleteControlDelegate?.Invoke(sender); 
     } 

     private void BtnDel_Click(object sender, EventArgs e) 
     { 
      //On ButtonClick send Delete request 
      OnDeleteControl(this); 
     } 
    } 

,並在一個ContainerControl預訂事件每個ComboControl:

List<ComboControl> _comboControls = new List<ComboControl>(); 

     public ContainerControl() 
     { 
      InitializeComponent(); 
     } 

     private void ContainerControl_Load(object sender, EventArgs e) 
     { 
      _comboControls.Add(new ComboControl()); 
      _comboControls.Add(new ComboControl()); 
      _comboControls.Add(new ComboControl()); 

      foreach (ComboControl value in _comboControls) 
      { 
       flowLayoutPanel.Controls.Add(value); 
       //Subscribe to Custom Event here 
       value.DeleteControlDelegate += Value_DeleteControlDelegate; 
      } 
     } 

     private void Value_DeleteControlDelegate(object sender) 
     { 
      //When Raised Delete ComboControl 
      flowLayoutPanel.Controls.Remove((Control) sender); 
     } 
    } 
+0

我喜歡這種方法,但我得到一個DeleteControlDelegate是一種類型,但用作這兩行的值 value.DeleteControlDelegate + = Value_DeleteControlDelegate; DeleteControlDelegate?.Invoke(sender); 將戳到我知道了。 (還沒有真正看過Deligates呢) –

+0

你設法讓它工作? – Johannes

+0

我做了,但我不得不取代: public delegate void DeleteControlDelegate(object sender); With: 公共事件EventHandler DeleteControlDelegate(object sender); 我想還有其他一些小的變化 –