删除运行时创建的标签CF C#
我在一个方法中动态创建一个标签“label1”。然后,当我单击一个按钮时,我想删除创建的标签,但如果我写Controls.remove(label1),则表示该控件在上下文中不存在。 我如何才能做到这一点 EDIT:根据Jon的建议,我实现了foreach循环,但它没有做任何事情。这是我的代码,我使用的面板是由design创建的:删除运行时创建的标签CF C#,c#,winforms,compact-framework,label,C#,Winforms,Compact Framework,Label,我在一个方法中动态创建一个标签“label1”。然后,当我单击一个按钮时,我想删除创建的标签,但如果我写Controls.remove(label1),则表示该控件在上下文中不存在。 我如何才能做到这一点 EDIT:根据Jon的建议,我实现了foreach循环,但它没有做任何事情。这是我的代码,我使用的面板是由design创建的: void GenerateControls() { Label labelOne = new Label(); Button btnContinue
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继续时:
我调试它并在面板中控制它。它继续运行,就像它是空面板一样。
谢谢你的帮助 我怀疑它说该变量在该上下文中不存在。您必须通过文本或了解其他信息来查找标签。例如,在创建属性时,您可以设置属性,并在要删除属性时通过该属性查找它:
panel.Controls.RemoveByKey("YourLabelName");
编辑:如注释中所述,RemoveByKey
在compact框架中不存在。因此,您要么自己记住引用(在这种情况下,您不需要名称),要么使用以下内容:
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的答案与原始问题没有任何相似之处,只剩下一个小故障 您没有将labelOne添加到面板,而是将其添加到表单中 改变
Controls.Add(labelOne);
到
然后一切都应该正常让我们看看创建标签并将其分配给容器的代码。可能您没有使用正确的标签实例引用。我已经使用断点对其进行了调试,这就是我发现它没有找到任何东西的原因。更多的想法?乔恩是对的。仅仅因为您创建它的方式类似于Label label1=new Label(),它的名称并不是label1,您就必须说label1.name=“label1”;然后可以像在代码中尝试的那样删除它。Jon,慢一点,让我们其他人回答一些:)就像一点信息一样,
RemoveByKey
在Compact框架中不存在,因此您必须先找到它(如果您没有参考字典),然后删除它。我尝试了foreach循环,但在面板中。控件没有找到任何内容。我将编辑我的帖子,添加我的代码。@ctacke:在这种情况下,我认为作为一个单独的答案会更好,但我会将其编辑为我应该写的帖子:)@nachogsiri我认为这个答案应该标记为答案,我的答案根本没有反映问题,后来有人会疑惑为什么这是答案。继续并标记为有用,但将答案更改为Jon'sHanks!!我正在将labelOne添加到面板和表单中。当我只在面板上添加labelOne时,问题就解决了。
Controls.Add(labelOne);
panel.Controls.Add(labelOne);