Pergunta

Estou construindo um Winform com alguns elementos dinâmicos e acho que estou tendo alguns problemas com o relacionamento entre pais/filhos sob controles aninhados. Todas as perguntas existentes que pude encontrar pareciam exclusivas das formas da Web, o que não foi totalmente útil.

Eu também tive alguns problemas com controles personalizados, mas esse pode ser um problema relacionado.

Estou tentando exibir várias caixas de imagem, cada uma com vários NUDs associados. Inicialmente, fiz isso fazendo muitos controles manualmente, mas agora quero automatizar o processo e reutilizar o código em outro lugar.

O código real é um pouco mais complicado do que isso, mas aqui estão os bits importantes em uma mistura de pseudocódigo e código real

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");
}

Espero que isso tenha ficado claro, caso seja importante, aqui estão mais alguns antecedentes.

Eu tenho um FlowLayoutPanel muito grande que contém alguns painéis infantis. Um desses painéis infantis é a área em que estou trabalhando agora. (chamado Panel_Book acima)este Painel é o que estou adicionando dinamicamente painéis infantis com a PictureBox & Friends.

O mais irritante é que os eventos do MouseEnter e do clique não estão sendo acionados. De forma alguma. Já adicionei manipuladores de eventos em tempo de execução antes, quando o controles Não era dinâmico e nunca tive tantos problemas. Tenho certeza de que até fiz isso com controles aninhados também.

Por fim, pensei em fazer esse último painel infantil em seu próprio controle personalizado, mas tive problemas semelhantes. Presumivelmente, encontrar a correção desse problema também corrigirá isso, mas se você souber, pode me apontar na direção certa?

Obrigado, :)

Foi útil?

Solução

Não vejo nada obviamente errado com o código, além da lista de "coisas que eu tentei" sendo inválida até que o controle realmente tenha um identificador (ou seja, é adicionado aos pais e todos os ancestrais também têm pais, subindo para o nível de forma); No entanto, você precisa trabalhar com isso metodicamente, comece com o menor caso reproduzível em vez de uma grande bolha de código.

O código a seguir faz Trabalho (para testar, basta soltar um painel de botão e fluxo em um formulário do 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");
}

Se eu executar este código e clicar no PictureBox, Eu recebo a caixa de mensagem aparecendo. Comece a partir daqui, comece a fazer com que isso se pareça mais com o seu código real e, eventualmente, você atingirá o problema.

Seja qual for o problema, não está apenas no código que você postou, está na interação com outros elementos de código/designer.

Outras dicas

Então...

Coisa engraçada. Aparentemente, um desses controles de pais foi desativado. Gostaria disso.

Recrequei cerca de metade da funcionalidade em um conjunto diferente de controles e o fiz funcionar. Até então eu percebi o problema teve estar relacionado a um dos controles, e não à lógica.

Não tenho idéia de quando, como ou por que esse controle foi desativado, mas isso certamente vai para o topo da minha lista de 'coisas estúpidas para verificar'. > _

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top