dhaskins Ответов: 1

Лучший способ найти объект?


У меня есть форма с 7 кнопками и 7 комбо-боксами. Когда я нажимаю одну из кнопок, я хочу поместить текст в соответствующий combobox, поэтому кнопка № 4 помещает текст в combobox4.

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

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

Я создал функцию под названием AddText, для ее работы требуется строка и объект. Затем я могу сделать цикл for, чтобы передать его, но не знаю, как получить компонент для объекта combobox, чтобы отправить его. В операторе switch я просто помещаю туда имя, и бэкэнд знает, какой объект мне нужен, Но как это сделать в цикле?

Что я уже пробовал:

namespace LotsButtons
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Button aButton = (Button)sender;
            string lastchar = aButton.Text.Substring(aButton.Text.Length - 1);
            ComboBox cbFound;

            string cbName = "comboBox" + lastchar;

            switch (lastchar)
            {
                case "1":
                    cbFound = (ComboBox)FindControl(cbName, comboBox1);
                    if (cbFound != null)
                        cbFound.Text = "Yay";
                    break;
                case "2":
                    cbFound = (ComboBox)FindControl(cbName, comboBox2);
                    if (cbFound != null)
                        cbFound.Text = "Yay";
                    break;
                case "3":
                    cbFound = (ComboBox)FindControl(cbName, comboBox3);
                    if (cbFound != null)
                        cbFound.Text = "Yay";
                    break;
                case "4":
                    cbFound = (ComboBox)FindControl(cbName, comboBox4);
                    if (cbFound != null)
                        cbFound.Text = "Yay";
                    break;
                case "5":
                    cbFound = (ComboBox)FindControl(cbName, comboBox5);
                    if (cbFound != null)
                        cbFound.Text = "Yay";
                    break;
                case "6":
                    cbFound = (ComboBox)FindControl(cbName, comboBox6);
                    if (cbFound != null)
                        cbFound.Text = "Yay";
                    break;
                case "7":
                    cbFound = (ComboBox)FindControl(cbName, comboBox7);
                    if (cbFound != null)
                        cbFound.Text = "Yay";
                    break;
            }

            //Attempt to crunch this down to one function call, how to get component name (combobox1) from string ("combobox1")?
            for (int cnt = 1; cnt < 8; cnt++)
            {
                AddText(lastchar, (ComboBox)cbName);
            }
        }

        private void AddText(string cbName, ComboBox cbToFind)
        {
            ComboBox cbFound = (ComboBox)FindControl(cbName, cbToFind);
            if (cbFound != null)
                cbFound.Text = "Yay";
        }

        public static Control FindControl(string controlId, Control container)
        {
            if (container.Name == controlId)
                return container;

            foreach (Control control in container.Controls)
            {
                Control c = FindControl(controlId, control);
                if (c != null)
                    return c;
            }
            return null;
        }
    }
}

1 Ответов

Рейтинг:
1

OriginalGriff

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

button4.Tag = ComboBox4;
...
ComboBox cb = button.Tag as ComboBox;
if (cb != null)
   {
   ...
   }
Вы даже можете использовать обработчик событий одним щелчком мыши и привести sender параметр для кнопки, которая была нажата.


dhaskins

частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
//ComboBox называется comboBox1 и button1.Метка находится в поле combobox1

Кнопка aButton = (кнопка)отправитель;
string lastchar = aButton.Text.Substring(aButton.Text.Length - 1); //Это возвращает 1 Правильно

Выпадающий список ЦБ = именем abutton.Тег в выпадающем списке; //нет ошибки, но ЦБ всегда имеет значение null

строка cbName = "comboBox" + lastchar;

if (cb != null)
AddText(cbName, cb);
}

Чего мне здесь не хватает?