Получить значения дочернего элемента из родительского
Возможно заголовок не самый правильный, не понимаю как его еще назвать.
Есть FlowLayoutPanel которую заполняют картинки из определенной папки, коротко так:
PictureBox pic = new PictureBox();
pic.Parent = flowLayoutPanel;
А к этим картинкам добавляются NumericUpDown и ComboBox, вот так:
NumericUpDown nud = new NumericUpDown();
nud.Minimum = 1;
nud.ClientSize = new Size(100, 0);
nud.Location = new Point(0, 180);
nud.Parent = pic;
ComboBox cbx = new ComboBox();
cbx.DropDownStyle = ComboBoxStyle.DropDownList;
cbx.Items.Add("10x15");
cbx.Items.Add("13x18");
cbx.Items.Add("15x21");
cbx.SelectedIndex = 0;
cbx.ClientSize = new Size(100, 0);
cbx.Location = new Point(100, 180);
cbx.Parent = pic;
В чем проблема: У PictureBox есть обработчик событий MouseClick
pic.MouseClick += PictureBox_MouseClick;
При нажатии на картинку фон этой картинки поменяется на красный, но как я могу получить значения из NumericUpDown и ComboBox именно этой картинки? Как их нужно объявить?
private void PictureBox_MouseClick(object sender, MouseEventArgs e)
{
PictureBox pic = sender as PictureBox;
if (e.Button == MouseButtons.Left)
{
pic.BackColor = Color.Red;
MessageBox.Show(nud.Value.ToString());
MessageBox.Show(cbx.Text);
}
}
После нажатия на картинку с котом, должны появиться значения nud = 2 и cbx = 13х18
Ответы (2 шт):
Можете унаследоваться от PictureBox и добавить свойства ваших компонентов, обращаясь к ним при обработке события. Да и создавать их в этом же наследнике, в конструкторе например, если логика позволяет.
Или же можете в словаре по ключу-PictureBox хранить ссылки на соответствующие дочерние контролы.
Можно ещё обратиться к свойству Controls у PictureBox, но придется делать это при каждом событии, что не очень хороший вариант.
Решил так:
foreach (NumericUpDown contr in pic.Controls.OfType<NumericUpDown>())
{
NumericUpDown numericUpDown = contr;
MessageBox.Show(numericUpDown.Value.ToString());
}
foreach (ComboBox contr2 in pic.Controls.OfType<ComboBox>())
{
ComboBox cbxs = contr2;
MessageBox.Show(cbxs.Text.ToString());
}

