Acceder à des objets dont on ne connait pas le nom [Résolu]

brixi69 44 Messages postés mardi 13 juin 2006Date d'inscription 31 mars 2008 Dernière intervention - 13 juin 2006 à 22:09 - Dernière réponse : TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention
- 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 !

@"#+++
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 14 juin 2006 à 10:35
3
Merci
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

Merci TheSaib 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de TheSaib
Meilleure réponse
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 14 juin 2006 à 11:48
3
Merci
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

Merci TheSaib 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de TheSaib
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 14 juin 2006 à 02:12
0
Merci
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.
Commenter la réponse de Lutinore
brixi69 44 Messages postés mardi 13 juin 2006Date d'inscription 31 mars 2008 Dernière intervention - 14 juin 2006 à 09:49
0
Merci
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 !

@"#+++
Commenter la réponse de brixi69
brixi69 44 Messages postés mardi 13 juin 2006Date d'inscription 31 mars 2008 Dernière intervention - 14 juin 2006 à 11:15
0
Merci
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 ;)

@"#+++
Commenter la réponse de brixi69
brixi69 44 Messages postés mardi 13 juin 2006Date d'inscription 31 mars 2008 Dernière intervention - 14 juin 2006 à 12:13
0
Merci
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 !

@"#+++
Commenter la réponse de brixi69
brixi69 44 Messages postés mardi 13 juin 2006Date d'inscription 31 mars 2008 Dernière intervention - 14 juin 2006 à 14:14
0
Merci
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

@"#+++
Commenter la réponse de brixi69
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 14 juin 2006 à 14:25
0
Merci
Je t'en prie.

::|The S@ib|:: MVP C#.NET
Commenter la réponse de TheSaib

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.