Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除运行时创建的标签CF C#_C#_Winforms_Compact Framework_Label - Fatal编程技术网

删除运行时创建的标签CF C#

删除运行时创建的标签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

我在一个方法中动态创建一个标签“label1”。然后,当我单击一个按钮时,我想删除创建的标签,但如果我写Controls.remove(label1),则表示该控件在上下文中不存在。 我如何才能做到这一点

EDIT:根据Jon的建议,我实现了foreach循环,但它没有做任何事情。这是我的代码,我使用的面板是由design创建的:

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);