Вложенные динамические элементы управления, используя пользовательские обработчики событий

StackOverflow https://stackoverflow.com/questions/2384117

Вопрос

Я создаю винформ с несколькими динамическими элементами, и я думаю, что у меня возникли проблемы с родительными / дочерние отношения внутри вложенных элементов управления. Все существующие вопросы, которые я мог найти кажутся исключительными для 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, Я получаю окно сообщения. Начните отсюда, начните делать это больше похоже на ваш реальный код, и в конечном итоге вы попадете на проблему.

Что бы ни была проблема, это не только в курсе, который вы разместили, это во взаимодействии с другими элементами кода / дизайнера.

Другие советы

Так...

Забавная вещь. Видимо, один из этих родительских элементов управления был отключен. Причудливо это.

Я повторно создал около половины функциональности на другом наборе элементов управления и получил его работать. К тому времени я понял проблему имел Быть связанным с одним из элементов управления, а не логикой.

Я понятия не имею, когда, как или почему этот контроль отключен, но это, безусловно, идет на вершину моих «глупых вещей, чтобы проверить» список. > _

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top