删除或隐藏动态创建的链接标签和标签

Posted

技术标签:

【中文标题】删除或隐藏动态创建的链接标签和标签【英文标题】:Removing or Hide dynamically created linklabels and labels 【发布时间】:2015-03-25 09:47:23 【问题描述】:

背景

我使用循环创建一组链接标签和标签控件,该循环使用数据库中的数据作为内容(文本)。

问题

然后我如何删除或更改那里的可见性?

我希望发生什么?

在按钮单击事件中,我希望将所有链接和链接标签的文本属性设置为 null,或者将它们的可见性属性设置为 false。

代码

 private void getInfoStationID()
            


    //SQL Connection Stuff

             for (int i = 0; i <= rowCount - 1; i++)
                            

                                LinkLabel Linklabel = new LinkLabel();
                                Linklabel.Text = ds.Tables[0].Rows[i]                 ["code"].ToString();
                                Linklabel.Height = 15;
                                Linklabel.Width = 50;
                                Linklabel.AutoSize = true;
                                Linklabel.Location = new Point(10, (i + 1) * 30);
                                tabControl1.TabPages[0].Controls.Add(Linklabel);
                                // Add an event handler to do something when the links are clicked. 
                                Linklabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);

                                Label label1 = new Label();
                                label1.Text = ds.Tables[0].Rows[i]["name"].ToString();
                                label1.Height = 15;
                                label1.Width = 70;
                                label1.Location = new Point(100, (i + 1) * 30);
                                tabControl1.TabPages[0].Controls.Add(label1);

                                Label label3 = new Label();
                                label3.Text = ds.Tables[0].Rows[i]["toc"].ToString();
                                label3.Height = 15;
                                label3.Width = 50;
                                label3.Location = new Point(240, (i + 1) * 30);
                                tabControl1.TabPages[0].Controls.Add(label3);
                            

                  

 private void clearAllBtn_Click(object sender, EventArgs e)
        
           //Would like this to clear all previously drawn labels and linklabels

        

【问题讨论】:

贴出的代码也属于什么方法或事件..?请显示完整的方法签名您是否熟悉Controls Class,这取决于您可以使用/实现foreach(Controls ctrl in Controls) 类型的构造并执行您需要做的检查以确保控制类型当然是LinkLabel *** 有大量关于如何在 foreach 循环中使用 Controls 类的示例。这也可以使用 lambda 语句来完成 【参考方案1】:

只需将动态控件添加到列表中,以便您快速参考它们:

        // out at CLASS/FORM level:
        private List<Control> MyControls = new List<Control>();

        // ... some method ...
            for (int i = 0; i <= rowCount - 1; i++)
            
                LinkLabel Linklabel = new LinkLabel();
                MyControls.Add(Linklabel);
                // ... rest of your code ...

                Label label1 = new Label();
                MyControls.Add(label1);
                // ... rest of your code ...

                Label label3 = new Label();
                MyControls.Add(label3);
                // ... rest of your code ...
            

现在您可以从其他地方使用该列表:

    private void clearAllBtn_Click(object sender, EventArgs e)
    
        foreach(Control ctl in MyControls)
        
            ctl.Visible = false; // or something else
        
    

*如果您决定创建一组新的动态控件,请不要忘记处理这些控件并清空列表。如果你想彻底摆脱它们:

    private void clearAllBtn_Click(object sender, EventArgs e)
    
        foreach(Control ctl in MyControls)
        
            ctl.Dispose();
        
        MyControls.Clear();
    

【讨论】:

【参考方案2】:

您可以循环浏览某个标签页上的所有控件。您可以使用开放的通用函数来使代码美观整洁。像这样:

private void HideControls<TControl>(Control parentControl)
    where TControl : Control

    var controls = parentControl.Controls.OfType<TControl>();

    foreach (var control in controls)
    
        control.Visible = false;
    

并像这样使用它:

private void button1_Click(object sender, EventArgs e)

    this.HideControls<Label>(tabControl1.TabPages[0]);
    this.HideControls<LinkLabel>(tabControl1.TabPages[0]);

您甚至可以将其重构为一个不错的扩展方法:

public static class ControlExtensions

    public static void HideControlsOfType<TControl>(this Control parentControl)
        where TControl : Control
    
        var controls = parentControl.Controls.OfType<TControl>();

        foreach (var control in controls)
        
            control.Visible = false;
        
    

并像这样使用:

 this.tabControl1.TabPages[0].HideControlsOfType<Label>();

【讨论】:

以上是关于删除或隐藏动态创建的链接标签和标签的主要内容,如果未能解决你的问题,请参考以下文章

js动态创建多个div

element 动态添加删除标签

动态设置背景图像或创建 img 标签有啥区别? [复制]

在滚动时动态添加和删除 div?

如何在 xamarin 表单中动态创建标签上的点击事件

DataTables PHP动态编辑/删除基于用户权限的链接