2015-06-24 2 views
1

Я пытаюсь заполнить панель макета потока с помощью ComboBoxes и NumbericUpDowns. Проблема, с которой я столкнулась, заключается в использовании новых NumbericUpDowns с новыми ComboBoxes. Вот как я создаю ComboBoxes и NumericUpDowns.Панель компоновки потока C#

// 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).

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

+0

Не уверен, что я понял это правильно, но вы можете использовать 'Tag' для управления' ComboBox' или 'NumericUpDown' для хранения экземпляра * связанного * элемента управления, таким образом, в случае, если вы можете извлечь из контроля, связанного с тегом и проверьте его значение. Другим вариантом является сохранение добавленных элементов управления в коллекции ('Dictionary'?) И получение связанного элемента управления с помощью ключевого поиска. – Sinatr

+0

@Sinatr Я пробовал теги, но не могу понять, как сопоставить тег combobox с тегом NumericUpDown. Я получаю NumericUpDown, используя (отправитель как NumericUpDown) .Tag, но я не могу с combobox, поскольку он не отправитель. – Dylan

+0

Если вы получаете 'var numericUpDown = (NumericUpDown) отправитель;', то после этого: 'var comboBox = (ComboBox) numericUpDown.Tag;' – Sinatr

ответ

1

Здесь быстрые решения:

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; 
    ... 
} 
+0

Получил работу, используя словарь! Благодаря! – Dylan

1

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

newNumericUpDown.ValueChanged += (sender, args) => 
{ 
    captchaNumericUpDown_Click(sender, args, newComboBox); 
} 
+0

Я немного смущен тем, что на самом деле делает этот код/​​где его использовать. Он выглядит немного более продвинутым, чем то, что я на самом деле использовал. Не могли бы вы дать мне простой прогон? – Dylan

+0

'(sender, args) => {some code}' является [выражением Lambda] (https://msdn.microsoft.com/de-de/library/bb397687.aspx), представляющим анонимный «EventHandler», который я добавляю к событию 'ValueChanged''. Если вы не знакомы с концепцией, могут быть полезны следующие ссылки: [«Лямбда-выражения»] (https://msdn.microsoft.com/de-de/library/bb397687.aspx) ["Анонимные методы"] (https://msdn.microsoft.com/de-de/library/0yw3tz5k.aspx) ["Использование выражений лямбда для EventHandlers"] (http://stackoverflow.com/questions/2465040/using-lambda-expressions- for-event-handlers) –

Смежные вопросы