Acceder à des objets dont on ne connait pas le nom

Résolu
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 mars 2008 - 13 juin 2006 à 22:09
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 - 14 juin 2006 à 14:25
Bonjour !

Je me permets de poster sur ce forum car j'ai quelques soucis étant débutant en C#

Je dévellope une applic utilisant un tabcontrol. Je dois pouvoir ajouter des onglets et en retirer à partir de l'application autant que je le veux. Jusque là pas de problème.
Ensuite j'ai créé un contrôle utilisateur, lequel doit être ajouté dans chaque nouveau onglet. A chaque ajout je dispose donc d'un nouvel objet pour ce contrôle utilisateur. Voici la syntaxe que j'ai utilisée

----------------
tabControl1.SelectedTab.Controls.Add(new communication_can_rs232());
----------------

Chaque control utilisateur "communication_can_rs232" doit fonctionner séparément. Ce contrôle contient des boutons, champs etc...
Seulement quand je crée un nouvel onglet avec un nouvel objet (syntaxe ci dessus), je ne sais pas comment accéder à ses boutons puisque je ne connais pas le nom qui a été donné au userControl lors du "new"... Quelles sont les techniques habituelles utilisées?
Je précise que je sais accéder aux boutons et autres ayant écrit le code adéquat dans le user control si je connais le nom de l'objet créé.

C'est dur a expliquer mais j'espere que vous me comprenez quand même...

Un tout grand merci d'avance !

@"#+++

8 réponses

TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
14 juin 2006 à 10:35
Tu peux etre illimité ou presque simplement en ajoutant un compteur a ton nom.
int i = 0;
communication_can_rs232 uc = new communication_can_rs232();
uc.Name = String.Format("uc{0}", ++i);
tabControl1.SelectedTab.Controls.Add(uc);

::|The S@ib|:: MVP C#.NET
3
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
14 juin 2006 à 11:48
Tu as plusieurs méthodes pour faire ce que tu veux faire, je ne connait pas l'architecture de ton projet.

La première serait par reflection de chercher le controle qui porte le nom X.

Ex :

Control ctrl = (Control)this.GetType().InvokeMember("lenomdetoncontrol",BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance , null, this, new object[] {});

Une autre serait te tenir un dictionnaire de tes controles.

Hashtable ctrlHashTable = new Hashtable();

Et a chaque fois que tu crées tes contrôles :

ctrlHashTable[taclé] = toncontrol.

"Taclé" pouvant être un compteur ou simplement le nom de ton contrôle. (En faisant attention à ne pas avoir de doublon).

pour y accéder ensuite :

Control c = ctrlHashTable[taclé] as Control;
if (c != null)
{
c.Text = "Toto";
}

Deux philosophies differentes.

::|The S@ib|:: MVP C#.NET
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
14 juin 2006 à 02:12
Salut, aucun nom n'est donné automatiquement et le contrôle est ajouté en dernière position dans la collection, mais pourquoi ne pas lui donner un nom via sa propriété Name avant de le passer en paramètre à la méthode Add ? Ou alors garder une référence sur ce control dans ta classe.
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 mars 2008
14 juin 2006 à 09:49
Car j'aimerais ne pas être limité quant au nombre d'onglet pouvant être ajouté. Je dois donc avoir un nom différent pour chaque nouvel objet "communication_can_rs232" créé dans l'application et destiné à résider dans xhaque nouvel onglet. Existe-il un moyen de choisir le nom de l'objet créé via un champ dans l'application par exemple? Ou est-il possible d'avoir un nom différent pour chaque nouvelle création en incluant un paramètre dans le nom?

J'aimerais donc ne pas devoir fixer les noms dans le code

Merci !

@"#+++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 mars 2008
14 juin 2006 à 11:15
C'est chouette l'utilisation du "Format" !!!

Seulement je suis toujours bloqué. En effet. Admettons que je veuille récupérer le champ du usercontrol situé dans l'onglet 2.
Je ne vois pas quoi mettre comme code ...
Si je me base sur le post précédent, ca donnerait

...=uc{2}.champ

mais je ne peux pas mettre ca dans le code puisque l'bjet n'existe pas encore. J'ai l'impression que qqc m'échappe.

Vraiment merci pour votre aide (on ne le dit jamais assez ;)

@"#+++
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 mars 2008
14 juin 2006 à 12:13
Wow, ca devient du sport ca. Ca risque d'être plus difficile à gérer que je ne pensais.

En fait l'application fonctionne comme ceci.

J'ai développé une carte d'interface CAN-USB-RS232. J'ai créé une DLL contenant les fonctions nécessaires à la communication avec cette carte. La DLL hérite de la classe SerialPort. Avant de me lancer dans la création d'un driver USB, j'ai effectivement préférer passer via un port COM virtuel dans un premier temps.

J'ai donc mon application avec un onglet général ou je peux connaitre toutes les cartes d'interfaces connectées sur le PC, chacune ayant une adresse écrite en dur différente. Je dispose d'un bouton connecter/déconnecter permettant d'ouvrir le port COM d'une carte choisie. Un onglet doit être ensuite automatiquement créé pour cette carte. Un contrôle utilisateur y est alors ajouté (sorte d'hyperterminal).

Seulement je dois pouvoir gérer plusieurs cartes en même temps. Ce qui signifie pour chaque nouvelle carte connectée : un nouvel onglet, un nouvel objet SerialPort et un nouveau controle utilisateur.

Je vais donc voir comment je peux me débrouiller avec les réponses qui m'ont été données.

Merci !

@"#+++
0
brixi69 Messages postés 44 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 31 mars 2008
14 juin 2006 à 14:14
All right ca marche comme sur des roulettes...
Je pense que je vais utiliser les HashTable ca permet une meilleure organisation

Merci d'avoir éclairci ma lanterne ;-)

Bonne continuation

@"#+++
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
14 juin 2006 à 14:25
Je t'en prie.

::|The S@ib|:: MVP C#.NET
0
Rejoignez-nous