删除在运行时 CF C# 上创建的标签
本文关键字:创建 标签 运行时 CF 删除 | 更新日期: 2023-09-27 18:36:22
我在方法中动态创建一个标签"label1"。然后,当我单击一个按钮时,我想删除创建的标签,但是如果我编写Controls.Remove(label1),则表示该控件在上下文中不存在。我该怎么做才能实现这一目标?
编辑:按照乔恩的建议,我实现了foreach循环,但它没有做任何事情。这是我的代码,我使用的面板是设计创建的:
void GenerateControls() {
Label labelOne = new Label();
Button btnContinue = new Button();
panel.SuspendLayout();
SuspendLayout();
//btnContinue
btnContinue.BackColor = System.Drawing.Color.Black;
btnContinue.ForeColor = System.Drawing.SystemColors.Menu;
btnContinue.Location = new System.Drawing.Point(145, 272);
btnContinue.Name = "btnContinue";
btnContinue.Size = new System.Drawing.Size(95, 28);
btnContinue.TabIndex = 13;
btnContinue.Text = "Continue";
btnContinue.Visible = true;
Controls.Add(btnContinue);
btnContinue.Click += new System.EventHandler(btnContinue_Click);
//labelOne
labelOne.Location = new Point(0,65);
labelOne.Size = new System.Drawing.Size(100,20);
labelOne.Text = "labelOne";
labelOne.Name = "labelOne";
labelOne.Visible = true;
labelOne.TextChanged += new System.EventHandler(this.lbl_TextChanged);
labelOne.BackColor = System.Drawing.Color.PaleGreen;
Controls.Add(labelOne);
//panel
panel.Controls.Add(labelOne);
panel.Visible = true;
panel.Location = new Point(0,0);
panel.Size = new Size(240, 320);
//
Controls.Add(panel);
panel.ResumeLayout();
ResumeLayout();
}
然后在我点击btn继续时:
private void btnContinuar_Click(object sender, EventArgs e) {
foreach (Control control in panel.Controls) {
if (control.Name == "labelOne"){
panel.Controls.Remove(control);
break;
}
}
}
我在面板中调试它。控制它继续,就好像它是空面板一样。感谢您的帮助!
我怀疑它说变量在该上下文中不存在。您必须通过标签的文本或了解其他信息来查找标签。例如,当您创建它时,您可以设置 Name
属性,并在想要删除它时通过该属性找到它:
panel.Controls.RemoveByKey("YourLabelName");
编辑:如评论中所述,紧凑框架中不存在RemoveByKey
。因此,您要么必须自己记住引用(在这种情况下,您不需要名称),要么使用类似以下内容的内容:
foreach (Control control in panel.Controls)
{
if (control.Name == "YourLabelName")
{
panel.Controls.Remove(control);
break;
}
}
EDIT2:为了使它更加"通用"和桌面兼容,您可以保留RemoveByKey调用并将其添加到您的应用程序中:
public static class FormExtensions
{
public static void RemoveByKey(this Control.ControlCollection collection,
string key)
{
if(!RemoveChildByName(collection, key))
{
throw new ArgumentException("Key not found");
}
}
private static bool RemoveChildByName(
this Control.ControlCollection collection,
string name)
{
foreach (Control child in collection)
{
if (child.Name == name)
{
collection.Remove(child);
return true;
}
// Nothing found at this level: recurse down to children.
if (RemoveChildByName(child.Controls, name))
{
return true;
}
}
return false;
}
}
在对 OP 问题进行了 20 次编辑后,Jon 的回答与原始问题没有任何相似之处,您只剩下一个小故障。
您 不添加标签一个 到面板 您要将其添加到表单中。
改变
Controls.Add(labelOne);
自
panel.Controls.Add(labelOne);
那么一切都应该工作