[英]Remove control created at runtime
我写了一些代码来在运行时创建一个额外的textbox
。 我正在使用metro框架,但这对我的问题无关紧要。
单击按钮时, private
on_click
事件正在创建textbox
:
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
。 实现目标的最佳方式是什么? 我是否必须公开任何内容,如果是这样,我该怎么做?
在您选择删除它之前,您必须先找到它。
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。
由于控件是以另一种形式创建的,因此当前表单无法通过其实例名称来了解它。
要删除它,请遍历所有控件并查找其Name
:
private void BtnRemoveTextbox2_Click(object sender, EventArgs e)
{
foreach (Control ctrl in this.Controls)
{
if (ctrl.Name == "Textbox2")
this.Controls.Remove(ctrl);
}
}
您需要使用Controls.Find
方法找到这些控件,然后删除并处置它们:
this.Controls.Find("Textbox2", false).Cast<Control>().ToList()
.ForEach(c =>
{
this.Controls.Remove(c);
c.Dispose();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.