Заполнение панели макета потока C #

Я пытаюсь заполнить панель макета потока ComboBoxes и NumbericUpDown. Проблема, с которой я столкнулся, заключается в использовании как новых NumbericUpDown, так и новых ComboBox. Вот как я создаю ComboBoxes и NumericUpDown.

// This int increments each time the code is run. It's located outside of the method below.
int captchaID = 0;

.

// Textboxes that are only for the UI, no code interaction based on text input.
string textboxText = "captchaTextbox";
TextBox newTextbox = new TextBox();
newTextbox.Name = captchaID.ToString() + textboxText;
newTextbox.Text = "";
newTextbox.Width = 175;
itemFlowPanel.Controls.Add(newTextbox);


// Combo Boxes
string comboBoxText = "captchaComboBox";
ComboBox newComboBox = new ComboBox();
newComboBox.Name = captchaID.ToString() + comboBoxText;
newComboBox.Width = 50;
newComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
itemFlowPanel.Controls.Add(newComboBox);

// This array holds my strings that are added to each ComboBox
string[] skills = new string[6];
skills[0] = "STR";
skills[1] = "DEX";
skills[2] = "CON";
skills[3] = "INT";
skills[4] = "WIS";
skills[5] = "CHA";

// This for loop is just populating my ComboBox with the array.
for (int i = 0; i < skills.Length; i++)
{
    newComboBox.Items.Add(skills[i]);
}

// Numeric Up Downs
string numericUpDownText = "captchaNumericUpDown";
NumericUpDown newNumericUpDown = new NumericUpDown();
newNumericUpDown.Name = captchaID.ToString() + numericUpDownText;
newNumericUpDown.Width = 50;
newNumericUpDown.ValueChanged += new EventHandler(captchaNumericUpDown_Click);
newNumericUpDown.ValueChanged += new EventHandler(captchaNumericUpDown_ValueChanged);
itemFlowPanel.Controls.Add(newNumericUpDown);
captchaID++;

С текущим кодом я могу редактировать EventHandler, который содержится в каждом NumericUpDown, но я не нашел способа заставить его читать соответствующее поле со списком (которое увеличивается вместе с captchaID).

Что я хотел бы сделать, так это создать новое уникальное событие для каждого, но если это невозможно, также может помочь способ проверки идентификатора поля со списком.


person Dylan    schedule 24.06.2015    source источник
comment
Не уверен, что я правильно понял, но вы можете использовать Tag элемента управления ComboBox или NumericUpDown для хранения экземпляра элемента управления connected, таким образом, если вы можете извлечь из элемента управления, связанного с тегом, и проверить его значение. Другой вариант - сохранить добавленные элементы управления в коллекции (Dictionary?) И получить связанный элемент управления с помощью поиска по ключу.   -  person Sinatr    schedule 24.06.2015
comment
@Sinatr Я пробовал использовать теги, но не могу понять, как сопоставить тег combobox с тегом NumericUpDown. Я получаю NumericUpDown, используя (sender as NumericUpDown) .Tag, но не могу использовать поле со списком, так как это не отправитель.   -  person Dylan    schedule 24.06.2015
comment
Если получится var numericUpDown = (NumericUpDown)sender;, то после этого: var comboBox = (ComboBox)numericUpDown.Tag;   -  person Sinatr    schedule 24.06.2015
comment
@Sinatr Как я могу использовать их, чтобы найти выбранный индекс поля со списком с тем же тегом, что и активный numericUpDown?   -  person Dylan    schedule 24.06.2015


Ответы (2)


Вот быстрые решения:

1) Используя словарь

Dictionary<NumericUpDown, ComboBox> _controls = new Dictionary<NumericUpDown, ComboBox>();

    // when you create comboBox - add entry with associated numericUpDown
    _controls.Add(numericUpDown1, comboBox1);

// now in the numericUpDown event you can get combobox like this
void numericUpDown_Whatever(object sender, WhateverEventArgs e)
{
    var numericUpDown = (NumericUpDown)sender;
    var comboBox = _controls[numericUpDown];
    // do something
    var selectedIndex = comboBox.SelectedIndex;
    ...
}

2) Используя Tag

    // add combobox into numericUpDown Tag when you create them
    numericUpDown1.Tag = comboBox1;

// now in the numericUpDown event you can get combobox like this
void numericUpDown_Whatever(object sender, WhateverEventArgs e)
{
    var numericUpDown = (NumericUpDown)sender;
    var comboBox = (CombBox)numericUpDown.Tag;
    // do something
    var selectedIndex = comboBox.SelectedIndex;
    ...
}
person Sinatr    schedule 25.06.2015

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

newNumericUpDown.ValueChanged += (sender, args) =>
{
    captchaNumericUpDown_Click(sender, args, newComboBox);
}
person Tim Pohlmann    schedule 24.06.2015
comment
Я немного запутался в том, что на самом деле делает этот код / ​​где его использовать. Это выглядит немного более продвинутым, чем то, что я использовал на самом деле. Не могли бы вы дать мне простой пробег? - person Dylan; 24.06.2015
comment
(sender, args) => { some code } - это лямбда-выражение, представляющее анонимное EventHandler, которое я добавляю к ValueChanged Event. Если вы не знакомы с этой концепцией, могут быть полезны следующие ссылки: Лямбда-выражения анонимные методы Использование лямбда-выражений для обработчиков событий - person Tim Pohlmann; 25.06.2015