Вложенные динамические элементы управления с использованием пользовательских обработчиков событий - PullRequest
3 голосов
/ 05 марта 2010

Я создаю WinForm с несколькими динамическими элементами, и я думаю, что у меня есть некоторые проблемы с отношениями родитель / потомок во вложенных элементах управления.Все существующие вопросы, которые я мог найти, казались эксклюзивными для WebForms, что было не совсем полезно.

У меня также были некоторые проблемы с пользовательскими элементами управления, но это может быть связанная проблема.

Я пытаюсь отобразить несколько PictureBox, каждый из которых имеет несколько связанных NUD.Первоначально я делал это, делая множество элементов управления вручную, но теперь я хочу автоматизировать процесс и повторно использовать код в другом месте.

Фактический код немного сложнее, чем этот, но вот важные моментыв смеси PseudoCode и фактического кода

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 и друзьями.

Досадно, что события MouseEnter и Click не запускаются,Совсем.Я добавил обработчики событий во время выполнения раньше, когда control не был динамическим и никогда не имел таких проблем.Я почти уверен, что я делал это и с вложенными элементами управления.

Наконец, я подумал о том, чтобы превратить эту последнюю дочернюю панель в собственный пользовательский элемент управления, но у меня были похожие проблемы.Предположительно, поиск решения этой проблемы также исправит это, но если вы знаете, что это не так, не могли бы вы указать мне правильное направление?

Спасибо,:)

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

Я не вижу ничего явно неправильного в коде, за исключением того, что список «вещей, которые я пытался» был недействительным до тех пор, пока элемент управления не имеет дескриптора (т. Е. Добавляется к родителю, а у всех предков тоже есть родители, до уровня формы); тем не менее, вам нужно работать методично, начните с самого маленького воспроизводимого случая вместо большого куска кода.

Следующий код работает (для проверки просто перетащите кнопку и панель управления на форму Windows):

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

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

0 голосов
/ 06 марта 2010

Итак ...

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...