2017-08-29 66 views
1

我編寫了一些代碼以在運行時創建額外的textbox。我正在使用metro框架,但這對我的問題無關緊要。在運行時創建的刪除控件

當你點擊一個按鈕,一個textbox正在被privateon_click事件創建:

private void BtnAddButton_Click(object sender, EventArgs e) 
{   
    MetroFramework.Controls.MetroTextBox Textbox2 = new MetroFramework.Controls.MetroTextBox 
    { 
     Location = new System.Drawing.Point(98, lblHandy.Location.Y - 30), 
     Name = "Textbox2", 
     Size = new System.Drawing.Size(75, 23), 
     TabIndex = 1 
    }; 
    this.Controls.Add(Textbox2); 
} 

我想現在要做的就是用另一個按鈕的點擊事件,再次刪除文本框。我不確定的是,如果我必須刪除controll或對象本身。此外,我既不能訪問Textbox2控件也不能訪問另一個地方的對象。

private void BtnRemoveTextbox2_Click(object sender, EventArgs e) 
{ 
    this.Controls.Remove(Textbox2); 
} 

這不起作用,因爲其他表格不知道Textbox2。什麼是實現我的目標的最佳途徑?我是否必須公開任何內容?如果是這樣,我該怎麼做?

+0

是有可能添加多個'Textbox2'?或者只有其中一個? – mjwills

回答

1

您必須首先找到它,然後再選擇刪除它。

private void BtnRemoveTextbox2_Click(object sender, EventArgs e) 
{ 
    MetroFramework.Controls.MetroTextBox tbx = this.Controls.Find("Textbox2", true).FirstOrDefault() as MetroFramework.Controls.MetroTextBox; 
    if (tbx != null) 
    { 
     this.Controls.Remove(tbx); 
    } 
} 

這裏,Textbox2是您的文本框的ID。請確保在添加文本框控件之前設置其ID。

+0

謝謝你的解決方案。我去了第二個:-) – xxldoener

1

由於控件是以另一種形式創建的,因此當前表單無法通過其實例名稱知道它。

要通過所有控件中刪除它,循環和尋找Name

private void BtnRemoveTextbox2_Click(object sender, EventArgs e) 
{ 
    foreach (Control ctrl in this.Controls) 
    { 
     if (ctrl.Name == "Textbox2") 
      this.Controls.Remove(ctrl); 
    } 
} 
+0

@mjwills肯定,爲什麼不呢? –

1

你需要找到使用Controls.Find方法的控制,然後取出並處理掉:

this.Controls.Find("Textbox2", false).Cast<Control>().ToList() 
    .ForEach(c => 
    { 
     this.Controls.Remove(c); 
     c.Dispose(); 
    }); 
+0

@KobyDouek仔細閱讀問題。 'Name =「Textbox2」'。 –

+0

對不起,我在印象'Find'使用ID。 –

+1

處理控件對釋放句柄和非託管資源非常重要。 –