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

时间:2012-06-05 16:29:51

标签: c# winforms compact-framework label

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

编辑:根据Jon的建议,我实现了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();
}

然后当我点击 btnContinue

private void btnContinuar_Click(object sender, EventArgs e) {
    foreach (Control control in panel.Controls) {
        if (control.Name == "labelOne"){
            panel.Controls.Remove(control);
            break;
        }
    }
}

我调试它并在面板中。控制它继续,好像它是空面板。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:5)

我怀疑它说变量在该上下文中不存在。您必须通过文本找到标签,或者了解其他相关信息。例如,当您创建它时,您可以设置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;
    }
}

答案 1 :(得分:4)

对OP问题进行了20次编辑,而Jon的答案与原始问题没有任何相似之处,您只剩下一个小故障。

您未将labelOne添加到要将其添加到表单的面板中。

更改

Controls.Add(labelOne); 

panel.Controls.Add(labelOne);

然后一切都应该工作