我写了一些代码来在运行时创建一个额外的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
。实现目标的最佳方式是什么?我是否必须公开任何内容,如果是这样,我该怎么做?
答案 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();
});