Удаление или скрытие динамически созданных меток ссылок и меток

Фон

Я создаю набор элементов управления linklabel и label, используя цикл, который использует данные из базы данных в качестве содержимого (текста).

Вопрос

Как мне удалить или изменить там видимость?

Что бы я хотел, чтобы произошло?

В событии нажатия кнопки я хотел бы, чтобы все текстовые свойства ссылки и метки ссылки были установлены либо равными нулю, либо их свойства видимости были установлены как ложные.

Код

 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

        }

person Dan Cundy    schedule 26.01.2015    source источник
comment
какому методу или событию принадлежит опубликованный код? пожалуйста, покажите полную сигнатуру метода, знакомы ли вы с Controls Class в зависимости от вашей логики, вы могли бы использовать/реализовать конструкцию типа foreach(Controls ctrl in Controls){} и делать то, что вам нужно, проверяя, конечно, что тип элемента управления LinkLabel Stackoverflow имеет тонны примеров того, как использовать класс Controls в цикле foreach. Это также можно сделать с помощью лямбда-оператора.   -  person MethodMan    schedule 27.01.2015


Ответы (2)


Просто добавьте динамические элементы управления в список, чтобы у вас была быстрая ссылка на них:

        // 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();
    }
person Idle_Mind    schedule 26.01.2015

Вы можете просмотреть все элементы управления на определенной вкладке. Вы можете использовать открытую общую функцию, чтобы сделать код красивым и чистым. Как это:

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>();
person Ric .Net    schedule 26.01.2015