Получить значения дочернего элемента из родительского

Возможно заголовок не самый правильный, не понимаю как его еще назвать.

Есть 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 шт):

Автор решения: SmorcIRL

Можете унаследоваться от 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());
}
→ Ссылка