如何删除 C# WFA 中动态添加的标签?

How to remove dynamically added label in C# WFA?

我在尝试从控件中删除标签时遇到问题。 我在 tabcontrol 中有 6 个标签页,它们应该具有相同的输出。 我使用了一个复选框来添加元素,效果很好。 每当我尝试从控件中删除标签时,标签仍然可见。 我不确定我是否错误地引用了标签,或者是否有其他方法可以做到这一点。 还尝试使用 Dispose() 但没有成功。请原谅英语不好。

 private void tabpages_Feltolt()
    {
        int index = 0;
        foreach (TabPage tab in tabControl1.Controls)
        {
            if (tabControl1.Controls.IndexOf(tab)!=tabControl1.Controls.IndexOf(tabPage_Meret))
            {
                CheckBox checkBox_sikmaras = new CheckBox()
                {
                    Parent = this,
                    Location = new Point(10, 10),
                    AutoSize = true,
                    Tag=index,
                };
                Label label_checkbox_sikmaras = new Label()
                {
                    Parent = this,
                    Location = new Point(25, 10),
                    AutoSize = true,
                    Text = "Síkmarás",
                };
                checkBox_sikmaras.CheckedChanged += CheckBox_sikmaras_CheckedChanged;
                Control[] controls = new Control[]
                {
                checkBox_sikmaras,
                label_checkbox_sikmaras,
                };
                tab.Controls.AddRange(controls);
            }
            index++;
        }
    }

    private void CheckBox_sikmaras_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox sikmaras = (CheckBox)sender;
        TabPage tab = tabControl1.TabPages[(int)sikmaras.Tag];
        Label label_sikmaras_tabla = new Label()
        {
            Parent = this,
            Location = new Point(10, 25),
            AutoSize = true,
            Text = "Síkmarás",
            Name = Convert.ToString(sikmaras.Tag),
        };
        Control[] controls = new Control[]
        {
            label_sikmaras_tabla,
        };
        if (sikmaras.Checked)
        {
            tabControl1.TabPages[(int)sikmaras.Tag].Controls.AddRange(controls);
        }
        else
        {
            foreach (var control in controls)
            {
                if (tab.Controls.Contains(control))
                {
                    Control controltoremove = tabControl1.TabPages[Convert.ToInt32(sikmaras.Tag)].Controls[Convert.ToString(sikmaras.Tag)];
                    tabControl1.TabPages[(int)sikmaras.Tag].Controls.Remove(controltoremove);
                }
            }
        }
        
    }

首先。 每次调用时,您都会在 CheckBox_sikmaras_CheckedChanged 中创建 Label 的新实例。这就是为什么 if (tab.Controls.Contains(control)) 总是 returns 错误。尽管它们的字段相同,但标签不同。

其次。 为什么要从 TabPage 获取 controltoremove,如果您已经知道它包含来自 if (tab.Controls.Contains(control)) 的内容?删除它即可。

这里是工作代码的例子。

public Form1()
    {
        InitializeComponent();

        label_sikmaras_tabla = new Label()
        {
            Location = new Point(10, 25),
            AutoSize = true,
            Text = "Síkmarás",
            //Name = Convert.ToString(sikmaras.Tag),
        };
    }

    Label label_sikmaras_tabla;

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox sikmaras = (CheckBox)sender;
        sikmaras.Tag = 1;
        TabPage tab = tabControl1.TabPages[(int)sikmaras.Tag];
        Control[] controls = new Control[]
        {
            label_sikmaras_tabla,
        };
        if (sikmaras.Checked)
        {
            tabControl1.TabPages[(int)sikmaras.Tag].Controls.AddRange(controls);
        }
        else
        {
            foreach (var control in controls)
            {
                if (tab.Controls.Contains(control))
                {
                    //Control controltoremove = tabControl1.TabPages[Convert.ToInt32(sikmaras.Tag)]
                    //    .Controls[Convert.ToString(sikmaras.Tag)];

                    tabControl1.TabPages[(int)sikmaras.Tag].Controls.Remove(control);
                }
            }
        }
    }