2010-03-05 4 views
3

Je construis un WinForm avec un certain nombre d'éléments dynamiques, et je pense avoir des problèmes avec la relation parent/enfant dans les contrôles imbriqués. Toutes les questions existantes que j'ai pu trouver semblaient exclusives à WebForms, ce qui n'était pas entièrement utile.Contrôles dynamiques imbriqués, utilisant des gestionnaires d'événements personnalisés

J'ai également eu quelques problèmes avec les contrôles personnalisés, mais cela peut être un problème connexe. J'essaie d'afficher un certain nombre de PictureBox, chacune avec un certain nombre de NUD associés. J'ai d'abord fait cela en faisant beaucoup de contrôles à la main, mais maintenant je veux automatiser le processus et réutiliser le code ailleurs.

Le code actuel est un peu plus compliqué que cela, mais voici les bits importants dans un mélange de pseudo-code et code réel

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

Il faut espérer que c'était clair, juste au cas où il est important, voici un peu plus de fond .

J'ai un très grand FlowLayoutPanel qui contient des panneaux enfants. L'un de ces panneaux enfant est le domaine sur lequel je travaille actuellement. (appelé panel_book ci-dessus) ce panneau est ce que je suis en ajoutant dynamiquement des panneaux enfants avec les amis PictureBox &. Le plus ennuyeux est que les événements MouseEnter et Click ne sont pas déclenchés. Du tout. J'ai ajouté des gestionnaires d'événements à l'exécution avant, lorsque les contrôles n'étaient pas dynamiques, et n'ont jamais eu autant de problèmes. Je suis assez sûr que j'ai même fait cela avec des contrôles imbriqués. Enfin, j'ai envisagé de créer ce dernier panneau enfant dans son propre contrôle personnalisé, mais j'ai rencontré des problèmes similaires. Vraisemblablement, trouver la solution à ce problème va régler cela aussi, mais si vous savez que ce ne sera pas le cas, pourriez-vous me diriger dans la bonne direction?

Merci, :)

Répondre

2

Je ne vois rien de mal avec évidemment le code en dehors de la liste des « choses que j'ai essayé » d'être invalide jusqu'à ce que le contrôle a en fait une poignée (c.-à-est ajouté à un parent et tous les ancêtres ont aussi des parents, allant jusqu'au niveau de la forme); Cependant, vous devez travailler méthodiquement sur ce point, à partir du plus petit cas reproductible au lieu d'une grosse goutte de code.

Le code suivant ne fonctionne (pour tester, déposez simplement un bouton et un panneau de flux sur une forme 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"); 
} 

Si j'exécute ce code et cliquez sur le PictureBox, je reçois le message boîte montrant. Commencez à partir d'ici, commencez à ressembler davantage à votre vrai code, et vous finirez par trouver le problème. Quel que soit le problème, ce n'est pas seulement dans le code que vous avez publié, c'est dans l'interaction avec d'autres éléments de code/concepteur.

0

Alors ...

Chose amusante. Apparemment, l'un de ces contrôles parents a été désactivé. Envie de ça.

J'ai recréé environ la moitié de la fonctionnalité sur un ensemble de commandes différent et j'ai réussi à le faire fonctionner. D'ici là, j'ai réalisé que le problème avait être lié à l'un des contrôles, et non à la logique.

Je ne sais pas quand, comment, ou pourquoi ce contrôle a été désactivé, mais cela va certainement au sommet de ma liste de choses stupides à vérifier. > _ <

Questions connexes