2

我在方法中动态创建了一个标签“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;
        }
    }
}

我调试它并在 panel.Control 中继续,就好像它是空面板一样。谢谢你的帮助!

4

2 回答 2

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;
    }
}
于 2012-06-05T16:32:48.527 回答
4

在对 OP 问题进行了 20 次编辑后,Jon 的回答与原始问题没有相似之处,你只剩下一个小故障。

您未将 labelOne 添加到面板中,而是将其添加到表单中。

改变

Controls.Add(labelOne); 

panel.Controls.Add(labelOne);

然后一切都应该工作

于 2012-06-05T18:33:11.057 回答