Как обратиться к имени кнопки в l oop? - PullRequest
0 голосов
/ 29 января 2020

Предпосылка: - У нас есть список пар ключ-значение.

Количество элементов этого списка будет различным.

У нас есть форма с кучей кнопки по умолчанию на нем. (Правка - Построен ранее в конструкторе, а не во время выполнения.)

Кнопки называются «button1, button2, ...»

У нас больше кнопок, чем элементов в списке.

Во время выполнения мы хотим перенести информацию из элементов списка на кнопки и скрыть неиспользуемые кнопки.

Мой вопрос заключается в том, как обращаться к этим кнопкам с помощью al oop?

Используя a для l oop в VBA, я мог бы сказать следующее: -

Me.Controls("TB_Item" & Format(i, "00")).Visible = False

В C# у меня есть этот минимальный пример в качестве отправной точки (Форма имеет 10 кнопки): -

public UF_ButtonLoop()
    {
        InitializeComponent();

        List<KeyValuePair<string, string>> MyItems = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("Apple", "Green Fruit"),
            new KeyValuePair<string, string>("Orange", "Orange Fruit"),
            new KeyValuePair<string, string>("Sprout", "Spawn of the Devil"),
            new KeyValuePair<string, string>("Hershey Bar", "A bit like chocolate"),
            new KeyValuePair<string, string>("Beefburger", "Man Food")
        };

        //Loop through the 10 buttons
        for (int i = 1; i < 11; i++)
        {
            if (i <= MyItems.Count )
            {
                //Transfer Data from list to button

                //Pseudo code
                Control("Button" + i).Text = (MyItems.ElementAt(i).Key);
                Control("Button" + i).Tag = (MyItems.ElementAt(i).Value);

            }
            else
            {
                //Hide the button as we've reached the end of the list so have no use for it.

                //Pseudo code
                Control("button" + 1).Hide();
            }

            // Note, VBA methos is:-
            // Me.Controls("TB_Item" & Format(i, "00")).Visible = False
        }

    }

Управление («Кнопка» + i) неверный синтаксис.

Можно ли сделать это в C#, если да, то как?

Если нет, каков правильный путь?

Также я новичок здесь, так что, если я спрашиваю вещи неправильно, пожалуйста, не стесняйтесь говорить мне об этом!

Многие спасибо, Оуэн С.

Ответы [ 2 ]

1 голос
/ 29 января 2020

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

Ответ на вопрос, вероятно, разделен на два варианта: - (Ответ 1) - Делайте это правильно, создавая именно то, что вам нужно во время выполнения, а не используя конструктор stati c, а затем скрывая то, что было перестроено.

(Ответ 2) - Быстрая «попытка» получить код в моем начальном вопросе работает. (Мой C# опыт может быть измерен в часах, поэтому мне есть чему поучиться, но мне также нужно, чтобы код работал сегодня на работе ...)

Итак, один из методов bodge, который работает, - это поместить кнопки в их собственный список, а затем ссылаться на это. Вот так: -

public UF_ButtonLoop()
    {
        InitializeComponent();

        //TransferListToButtone_Rev1();
        List<KeyValuePair<string, string>> MyItems = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("Apple", "Green Fruit"),
            new KeyValuePair<string, string>("Orange", "Orange Fruit"),
            new KeyValuePair<string, string>("Sprout", "Spawn of the Devil"),
            new KeyValuePair<string, string>("Hershey Bar", "A bit like chocolate"),
            new KeyValuePair<string, string>("Beefburger", "Man Food")
        };

        List<Control> ListOfButtons = new List<Control>
        {
            button1, button2, button3, button4, button5, button6, button7, button8, button9, button10
        };

        void A_Button_Click(object sender, System.EventArgs e)
        {      
            Console.WriteLine((sender as Button).Text + " = " + (sender as Button).Tag);
        }

        //Loop through the 10 buttons
        for (int i = 0; i < 10; i++)
        {
            if (i < MyItems.Count )
            {
                //Transfer Data from list to button
                    ListOfButtons.ElementAt(i).Text = (MyItems.ElementAt(i).Key);
                    ListOfButtons.ElementAt(i).Tag = (MyItems.ElementAt(i).Value);

                //Set Click Event
                    ListOfButtons.ElementAt(i).Click  += new EventHandler(A_Button_Click);
            }
            else
            {
                //Hide the button as we've reached the end of the list so have no use for it.
                    ListOfButtons.ElementAt(i).Hide();
            }

        }

    }

Ура всем, Оуэн С.

0 голосов
/ 29 января 2020

Я бы порекомендовал создавать эти кнопки при чтении списка. Не создавайте кнопки статически в конструкторе. Вам необходимо создать список кнопок в основной форме, а затем добавить кнопки программно.

Создание списка

List<Button> buttons = new List<Button>(); 

Затем в некотором l oop, где вы go через ваш список данных

Button MyButton = new Button();
Mybutton.Location = new Point(YourX, YourY);
Mybutton.Text = "AnyText";
Mybutton.AutoSize = false;
MyButton.Size = new Size(width, height);
Mybutton.BackColor = Color.LightBlue;
Mybutton.Padding = new Padding(6);
buttons.add(MyButton);

Ad1. Лучше всего создать собственный класс «SpecialButton», который унаследован от оригинального класса Button. Затем вы можете добавить некоторые специальные атрибуты к кнопке, как ссылки на некоторые другие элементы, которые должны управляться SpecialButton и т. Д. c ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...