2009-02-17 11 views
0

Je tente d'écrire un 'contrôle utilisateur' dans WinForms .NET (pas ASP.NET). Le contrôle est relativement simple. Il contiendra une étiquette, un bouton et un DataGridView.Comment écrire un contrôle personnalisé récursif dans WinForms .NET

Cependant, le contrôle doit pouvoir s'instancier, c'est-à-dire que lorsque l'utilisateur clique sur le bouton (du contrôle parent) au moins 1 contrôle imbriqué (enfants) du même type sera affiché en dessous (comme Tree)

Je n'ai pas réussi à écrire un tel contrôle récursif en utilisant un «contrôle utilisateur». Une exception StackOverflow se produit lors de l'instanciation de MyControl dans son propre constructeur. Par conséquent, je suis penché vers l'utilisation d'un «contrôle personnalisé», en espérant qu'il peut gérer l'instanciation de lui-même (peut-être dans l'événement Paint ??). Beaucoup plus de travail doit cependant entrer dans un contrôle personnalisé, donc je ne veux pas aller dans ce sens si ça va prendre une éternité. Je suis dans un délai serré.

Quelqu'un a-t-il fait cela en utilisant un contrôle personnalisé ou avez-vous des idées solides sur la façon de créer un contrôle récursif? Par ailleurs, ce contrôle serait utilisé dans un nombre relativement fini de combinaisons récursives, alors peut-être serait-il préférable de créer un contrôle séparé pour chaque scénario parent/enfant? Je pense que cela se traduirait par au moins 10 contrôles utilisateur distincts.

Merci pour votre aide

MISE À JOUR (voici ma première tentative à une condition d'arrêt par vos commentaires, mais cela provoque encore des enfants à créer indéfiniment):

 

public partial class CustomX : UserControl 
    { 
     private IList _children = new List(); 

     public CustomX() 
     { 
      InitializeComponent(); 

      Recurse(0); 

     } 

     private void Recurse(int childCount) 
     { 
      if (childCount 
+0

Veuillez nous montrer le code ou le schéma. Cela ne devrait pas être un problème de faire ce que vous voulez. – Stefan

+1

Allez de l'avant et publiez le code de contrôle WHOLE entier. Voyons ce qu'il y a dans cette fonction Recurse. Je ne vois pas de constructeur surchargé, alors j'essaie de comprendre comment vous transmettez des informations au contrôle des enfants sur l'état de la récursivité. – DancesWithBamboo

Répondre

2

Le problème est probablement que le contrôle enfant instancie également un contrôle enfant. Il doit y avoir une condition d'arrêt ou des contrôles seront générés jusqu'à ce que la pile déborde.

Cela devrait fonctionner:

public partial class CustomX : UserControl 
    { 
     private IList _children = new List(); 

     public CustomX(int depth) 
     { 
      InitializeComponent(); 
      if(depth > 0) 
      { 
       CustomX child = new CustomX(depth-1); 
       this.Controls.Add(child) 
      } 
     } 
    } 
2

Vous devriez avoir aucun problème à faire cela avec un contrôle utilisateur. Il est plus probable qu'un problème ne se termine pas correctement la récursion. Il est (peut-être) plus lisible d'effectuer la création du contrôle dans le contrôle parent le plus élevé plutôt que de déléguer cette tâche dans chaque constructeur.

Pouvez-vous publier le code que vous avez dans votre constructeur?