删除在运行时创建的控件

时间:2017-08-29 13:17:42

标签: c# winforms

我写了一些代码来在运行时创建一个额外的textbox。我使用的是地铁框架,但这对我的问题不重要。

当您点击按钮时,textbox private事件正在创建on_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);
}

我现在要做的是使用另一个按钮的click事件,再次删除文本框。我不确定的是,如果我必须只删除控件或对象本身。此外,我既不能访问Textbox2 Control,也不能访问其他地方的对象。

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

这不起作用,因为另一种形式不了解Textbox2。实现目标的最佳方式是什么?我是否必须公开任何内容,如果是这样,我该怎么做?

3 个答案:

答案 0 :(得分:1)

在您选择删除它之前,您必须先找到它。

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>


No animate - no sizing
<span class="glyphicon glyphicon-refresh"></span><br>
Animate - no sizing
<span class="glyphicon glyphicon-refresh icon-spin"></span><br>
<hr>
No animate - with bigger size -> nicer
<span class="glyphicon glyphicon-refresh bigger"></span><br>
Animate - with bigger size -> nicer
<span class="glyphicon glyphicon-refresh bigger icon-spin"></span><br>

此处,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); } } 是文本框的ID。在添加文本框控件之前,请确保设置文本框控件的ID。

答案 1 :(得分:1)

由于控件是以另一种形式创建的,因此当前表单无法通过其实例名称来了解它。

要删除它,请遍历所有控件并查找Name

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

答案 2 :(得分:1)

您需要使用Controls.Find方法找到这些控件,然后删除并处理它们:

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