Custom SplitContainer avec panels enfants créés par défaut

Signaler
Messages postés
57
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
4 septembre 2011
-
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
-
Bonjour, je développe actuellement un contrôle de type SplitContainer personnalisé pouvant recevoir plus de deux panneaux enfants. Jusque là, pas de soucis.Tout fonctionne, mais mon problème vient en mode Design.
J'ai créé un Designer perso que j'ai attaché à mon contrôle pour pouvoir, entre autre, sélectionner les Panels enfants en mode Design.

Mon problème est que je ne sais pas où initialiser mon contrôle pour que, par défaut, lorsque je le glisse de la Toolbox sur la Form, il ait déjà 2 ou 3 Panels enfants sélectionnables (et modifiables) en mode Design.

Voici ce que j'ai essayé et les résultats obtenus:

-> Création des enfants dans le constructeur du contrôle.
résultat: Les panels sont bien ajoutés, mais je ne peux rien en faire en mode Design (pas sélectionnables et pas modifiables).

-> Création des enfants dans la surcharge de la méthode "Initialize" du Designer personnalisé grâce à une "Transaction".
résultat:
Les Panels enfants sont bien ajoutés, et cette fois, ils sont bien sélectionnables en mode Design et modifiables directement dans la PropertyGrid.
Mais j'ai un comportement étrange.Je choisis d'ajouter 3 Panels par défaut.La première fois que j'ajoute mon contrôle, il comporte bien 3 Panels. Mais si je ferme l'IDE et que je relance le projet, mon contrôle contient maintenant 6 Panels !!!
Je me dis que si je sauvegarde, que je ferme et relance, je vais me retrouver avec 9 enfants ... et bien non, j'en reste à 6

Ma question principales est donc comment simuler le comportement d'un TabControl ou SplitContainer de base afin d'ajouter des enfants par défaut à un UserControl tout en gardant la possibilité de sélectionner ces enfants et les modiier dans le Designer de Visual Studio.

Merci d'avance pour vos réponses et explications.
A voir également:

6 réponses

Messages postés
57
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
4 septembre 2011

personne pour m'aider ?
J'ai beau chercher depuis l'autre jour, je ne trouve toujours pas de solution à mon problème.
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Bonjour,

As-tu regardé le code produit par l'environnement dans le fichier *.Designer.Vb ?

Si j'ai bien compris, tu les ajoutes dans la form et ils se dupliquent ?

--------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
57
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
4 septembre 2011

Bonjour NHenry.
Ce sont les panels enfants de mon Usercontrol qui se dupliquent à chaque redémarrage du Designer.
Je me base souvent aussi sur le le code fournit par le designer,mais sur ce coup-là, ça ne change pas grand chose apparemment. En y réfléchissant, c'est un peu logique comme réaction. En continuant mes recherches hier, j'ai fini par tomber sur la piste du "ToolboxItem" customisé.
En effet, quand on attribue un ToolboxItem, on peut ,dans ce dernier, définir une méthode à exécuter lorsque l'utilisateur glisse le contrôle de la boîte à outils sur le formulaire, et je peux ainsi ajouter mes panneaux par défaut sans que ça influe sur ceux rajoutés par la suite.

Ca a l'air un peu plus galère pour pouvoir sélectionner les enfants en mode Design car il faut overrider beaucoup d'évènements souris, mais ça a l'air de fonctionner.

Ceci dit, je suis persuadé qu'il existe déjà un évènement dans les UserControl qui est déclenché uniquement à leur création, mais impossible de trouver lequel.

On peut dire que mon problème est résolu, mais si vous avez d'autres infos à ce sujet, je suis preneur évidemment.
Merci.
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Bonjour,

Je n'ai pas mieux à proposer, mais je suis intéresse par ton sujet, car cela peut être utile dans quelques projets.

--------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
57
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
4 septembre 2011

C'est le seul endroit où mes enfants ne sont pas dupliqués effectivement. Si j'essaye de les ajouter dans le constructeur ou n'importe quel autre évènement se produisant à la création du contrôle, j'obtiens simplement des panneaux en plus des panneaux que j'aurais ajouté à la main. Voici donc comment j'ai procédé...

J'ai créé une classe "MyControlToolboxItem" héritant de "ToolboxItem" et j'ai ajouté en conséquence l'attribut suivant sur mon contrôle pour attacher ce ToolboxItem:
<ToolboxItem(GetType(MyControlToolboxItem))> _


Attacher un ToolboxItem personnalisé permet, entre autre, de spécifier un icône pour la boîte à outils, mais il permet aussi d'overrider sa méthode "CreateComponentsCore". C'est cette méthode qui est responsable de l'initialisation du contrôle apparemment, et voici à quoi ressemble MA méthode interne appelée par CreateComponentsCore.

Attention, il faut utiliser une "DesignerTransacion" pour effectuer des actions réversibles sur les contrôles en mode Design.

Public Function CreateControlInitial(ByVal host As IDesignerHost, ByVal param As Object) As Object
  Dim parentCtl as MyControl = DirectCast(host.CreateComponent(GetType(MyControl)), MyControl)

  Dim child1 as MyChildCtl = DirectCast(host.CreateComponent(GetType(MyChildCtl)), MyChildCtl)

parentCtl.Controls.Add(child1)

Return new IComponent(){parentCtl}
End Function


En espérant que ça puisse servir
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Bonjour,

D'accord, merci.

Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés.

---------------------------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site