Вложенные динамические элементы управления, используя пользовательские обработчики событий
-
24-09-2019 - |
Вопрос
Я создаю винформ с несколькими динамическими элементами, и я думаю, что у меня возникли проблемы с родительными / дочерние отношения внутри вложенных элементов управления. Все существующие вопросы, которые я мог найти кажутся исключительными для WebForms, который не был полностью полезен.
У меня также были проблемы с кастомным контролем, но это может быть связанным вопросом.
Я пытаюсь отобразить количество рисунков, каждый с рядом связанных нулей. Я изначально сделал это, сделав много контролей вручную, но теперь я хочу автоматизировать процесс и повторно использовать код в другом месте.
Фактический код немного сложнее, чем это, но вот важные биты в смеси псевдокода и фактического кода
panel_book.Controls.Clear();
for (loop controls)
{
//INITIALIZE CHILD CONTROLS
PictureBox tempBox = new PictureBox();
NumericUpDown t1 = new NumericUpDown();
NumericUpDown t2 = new NumericUpDown();
NumericUpDown t3 = new NumericUpDown();
NumericUpDown t4 = new NumericUpDown();
tempBox.Image = getImage();
tempBox.Size = tempBox.Image.Size;
tempBox.Tag = getValue();
//THIS IS WHAT IS GIVING ME TROUBLE
//=======================================================
tempBox.MouseEnter += new EventHandler(Binder_MouseEnter);
tempBox.Click += new EventHandler(smallCardNew_Click);
//THINGS I'VE TRIED
tempBox.BringToFront();
tempBox.Focus();
t1.Size = new Size();
t2.Size = t1.Size; t3.Size = t1.Size; t4.Size = t1.Size;
t1.Location = new Point();
t2.Location = new Point(); t3.Location = new Point(); t4.Location = new Point();
t1.Value = 0;
t2.Value = 0; t3.Value = 0; t4.Value = 0;
t1.Enabled = true; t2.Enabled = true;
t3.Visible = false; t4.Visible = false;
//CREATE THE NEW PARENT CONTROL (PANEL)
Panel tempPanel = new Panel();
tempPanel.Margin = new Padding(0, 0, 0, 0);
tempPanel.Controls.Add(tempBox);
tempPanel.Controls.Add(t1);
tempPanel.Controls.Add(t2);
tempPanel.Controls.Add(t3);
tempPanel.Controls.Add(t4);
tempPanel.Size = new Size();
tempPanel.Location = new Point();
panel_book.Controls.Add(tempPanel);
}//end loop
///
void smallCardNew_Click(object sender, EventArgs e)
{
MessageBox.Show("Click Event Triggered");
}
void Binder_MouseEnter(object sender, EventArgs e)
{
MessageBox.Show("Mouse Enter Event Triggered");
}
Надеюсь, это было ясно, на всякий случай, если его важно, вот еще немного фона.
У меня очень большой FlowLayoutPanel, который содержит некоторые дочерние панели. Один из этих дочерних панелей - это область, на которой я сейчас работаю. (называется Panel_Book выше)это Панель - это то, что я динамично добавляю дочерние панели с PictureBox и друзьями.
Раздражающая вещь, эти мышиный и клики событий не срабатывают. Вообще. Я добавил обработчики событий во время выполнения раньше, когда контроль не были динамичными, и никогда не было такого больших проблем. Я почти уверен, что я даже сделал это с вложенным элементом управления.
Наконец, я рассмотрел эту последнюю дочернюю панель на собственный пользовательский контроль, но имел подобные проблемы. Предположительно, нахождение Исправления к этой проблеме исправит это тоже, но если вы знаете, не могли бы вы указать мне в правильном направлении?
Спасибо, :)
Решение
Я не вижу ничего, что явно не так с кодом, кроме списка «вещей, которые я пытался» быть недействительным, пока контроль на самом деле не имеет ручкой (т.е. добавляется к родителю, и все предки также имеют родителей, идущие до Уровень формы); Тем не менее, вам нужно проработать эту методично, начать с наименьшего воспроизводимого случая вместо большого блока кода.
Следующий код делает Работа (чтобы проверить, просто перейти кнопку и расходную панель в форме окна):
private void button1_Click(object sender, EventArgs e)
{
PictureBox pb = new PictureBox();
pb.Location = new Point(0, 0);
pb.Size = new Size(300, 300);
pb.Image = SomeImage;
pb.Click += new EventHandler(PictureBoxClick);
Panel panel = new Panel();
panel.Location = new Point(10, 40);
panel.Size = new Size(300, 300);
panel.Controls.Add(pb);
flowLayoutPanel1.Controls.Add(panel);
}
private void PictureBoxClick(object sender, EventArgs e)
{
MessageBox.Show("Picture box clicked");
}
Если я выполню этот код и нажмите на PictureBox
, Я получаю окно сообщения. Начните отсюда, начните делать это больше похоже на ваш реальный код, и в конечном итоге вы попадете на проблему.
Что бы ни была проблема, это не только в курсе, который вы разместили, это во взаимодействии с другими элементами кода / дизайнера.
Другие советы
Так...
Забавная вещь. Видимо, один из этих родительских элементов управления был отключен. Причудливо это.
Я повторно создал около половины функциональности на другом наборе элементов управления и получил его работать. К тому времени я понял проблему имел Быть связанным с одним из элементов управления, а не логикой.
Я понятия не имею, когда, как или почему этот контроль отключен, но это, безусловно, идет на вершину моих «глупых вещей, чтобы проверить» список. > _