Accéder à une textbox depuis une classe

Résolu
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 13 juin 2005 à 14:59
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 - 14 juin 2005 à 15:22
Bonjour, bonjour,



est-ce que qqln pourrait m'expliquer comment on fait pour, depuis une
classe, rajouter du texte dans une textbox ? Je ne peux pas y accéder...

12 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 juin 2005 à 16:37
procède de cette manière, tout d'abord, crée une classe GPSEventArgs



public
class GPSEventArgs : EventArgs {



private
string message
=
string.Empty;



public
string Message {



get {
return message;}



set {message
=
value;}


}


}

Ensuite dans ta classe GPSQqch, déclare un nouveau délégé de cet façon :

public
delegate
void GPSEventHandler(
object sender, GPSEventArgs e);

puis déclare ton évènement :

public
event GPSEventHandler GPSAction;

Ensuite à chaque fois que tu as besoin de déclencher l'évènement procède ainsi :

if (GPSAction != null) {
GPSEventArgs args = new GPSEventArgs();
args.Message = "ton message";
GPSAction(this, args);
}

dans ton formulaire, il faut que tu t'abonnes à l'évènement et dans le paramètre e, tu auras une propriété e.Message avec ton message.

Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
</FO< body>
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
14 juin 2005 à 13:32
tu te mélanges les pinceaux

Donc, dans ta classe ConnexionBN, ajoute ces lignes la dans les déclaratons :

public delegate void GPSEventHandler(object
sender, GPSEventArgs e);
public event GPSEventHandler GPSAction;


et, toujours dans cette classe, à chaque fois que tu as besoin de déclencher l'évènement, ajoute le code suivant :
if (GPSAction != null) {
GPSEventArgs args = new GPSEventArgs();
args.Message = "ton message";
GPSAction(this, args);
}

Enfin, dans ton formulaire, après :
bnReader = new ConnexionBN (PortNameBN, BaudRateBN, ParitySetting.NoParity, 8, StopBitsSetting.OneStopBit) ;

ajoute :
bnReader.GPSAction += new GPSEventHandler(bnReader_Action);

puis crée une méthode :
private void bnReader(object sender, GPSEventArgs e) {
monTextBox.Text = e.Message;
}

J'espère que c'est clair cette fois-ci


<HR>
Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
14 juin 2005 à 14:57
Oui, c'est bnReader_Action à la place de bnReader
et modifie ca :
bnReader.GPSAction += new BNEventHandler(bnReader_Action);

par bnReader.GPSAction += new ConnexionBN.BNEventHandler(bnReader_Action);

ca devrait être bon là ;)

<HR>
Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 juin 2005 à 15:06
2 questions à te poser à propos de ta classe :

- Est-ce un objet métier ?
- Est-elle appelée par ton formulaire ?

Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
</FO< body>
0

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

Posez votre question
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
13 juin 2005 à 15:23
Je ne connais pas la définition d'un objet métier.



Cependant, je crée une instance de cette classe lorsque je clique sur un bouton de mon unique formulaire.

Comme tu me l'avais conseillé, je déclare cette instance comme suit :

static Form1 MaForm = new Form1();

static void Main()

{

Application.Run(MaForm);

}

par contre, lorsque l'appli ne tourne pas et que je suis en mode
éditeur de code, quand on fait CTRL+space apparait une liste des
méthodes, et propriétés disponibles pour l'objet après lequel tu te
trouves. Et bien, je ne trouve pas le nom de ma textbox a aucun
endroit. J'ai essayé form1.CTRL+space , maform.CTRL+space , plein de
choses mais non....



Est-ce que tu vois un peu mieux mon pb ?
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
13 juin 2005 à 15:25
hmmm, j'ai dit une bétise.



Je déclare mon instance de ma classe Form1 comme ci dessus,

et je déclare mon instance de ma classe connexionBN, après le clique d'un bouton :



bnReader = new ConnexionBN (PortNameBN, BaudRateBN, ParitySetting.NoParity, 8, StopBitsSetting.OneStopBit) ;

et là en effet, je ne lui passe rien comme référence par rapport à "MaForm".
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 juin 2005 à 15:38
ok... donc c'est un objet métier... l'une des premières règles de la programmation objet, c'est que les objets métier ne doivent jamais inter-agir avec l'IHM (Interface Homme-Machine, le formulaire quoi)

Donc le mieux, c'est de définir dans ta classe des évènements qui informeront ton formulaire que quelque chose s'est passé et ainsi afficher le message que tu veux dans ta form.

Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
</FO< body>
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
13 juin 2005 à 16:19
ok, je vois, je pourrais déclarer un évènement "action" par exemple,
que j'active a chaque fois que je veux rajouter du text a la textbox, c
ca ?



l'évènement appartient à la classe connexionGPS, mais comment je
déclare tout ca ? je crois que pour l'activer il faut faire
this.invoke(l'évènement).
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
14 juin 2005 à 12:24
Bon, ben, je pense que j'y suis presque, enfin plus ou moins...



Voilà ce que j'ai fait, mais il y a une erreur.





Dans
la classe où doit se passer l’évènement :







private void
AddTextToTextbox(object sender, EventArgs e)




{




BNEventArgs
args = new BNEventArgs();




args.Message
= "ton message";




OnAddingText(this, args);




}








public void OpenPortBN()




{




//Déclaration de lévènement




EventHandler BNAddTextHandler = new EventHandler (this.AddTextToTextbox);




//déclénchement de l'évènement :




this.Invoke (BNAddTextHandler);




...







public delegate void BNEventHandler(object
sender, BNEventArgs arg);








public event
BNEventHandler OnAddingText;








Dans la classe BNEventArgs :








using System;


namespace Essai4




{




public class
BNEventArgs : EventArgs




{




private string
message = string.Empty ;




public BNEventArgs()




{




}




public string Message




{




get




{




return message;




}






set




{




message=value;




}




}




}


}




Le problème quand je lance, lorsque je
clique sur mon bouton, il éxécute la fonction OpenPort(), qui déclenche
(je ne sais pas si j'utilise les bons termes, je t'avoue que j'ai passé
toute la matinée à essayer de comprendre comment les évènements
fonctionnent) l'évènement, puis il plante et donne l'erreur suivante :

Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans system.windows.forms.dll



Informations supplémentaires : Impossible d'appeler Invoke ou
InvokeAsync sur un contrôle tant que le handle de fenêtre n'a pas été
créé.



Donc voili voilou, tu connais cette erreur avec les évènements ?
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
14 juin 2005 à 14:48
Ahhhhhh !



on touche au but.... Il y a une dernière erreur. En tout cas, merci
pour le temps que tu passes à m'expliquer, ton dernier post m'a
effectivement paru assez clair.



L'erreur : si je met, comme tu me l'a marqué ci dessus private void bnReader(object sender, BNEventArgs e) {...} alors il me marque :

La classe 'Essai4.Form1' contient déjà une définition de 'bnReader' ce qui est normal car bnReader est une instance de ma classe connexionBN


Par contre, si je remplace bnReader par bnReader_Action (vu qu'il veut pas bnReader, j'ai essayé bnReader_Action) il marque alors :

Le type ou le nom d'espace de noms 'BNEventHandler' est introuvable
(une directive using ou une référence d'assembly est-elle
manquante ?) à la ligne suivante :

bnReader.GPSAction += new BNEventHandler(bnReader_Action);



Alors, je sais plus, est-ce que l'erreur vient de bnReader (au cas où tu aurait fait un copier coller trop vite ) ou bien il y a encore un problème au niveau de BNEventHandler, qui est bien déclaré dans ma classe connexionBN, en tant que public delegate void BNEventHandler(object sender, BNEventArgs e);



PS : remplace les "GPS" par "BN" pour boite noire. Je ne travaille plus avec ma classe connexionGPS mais connexionBN exemple pour GPSEventArgs -> BNEventArgs
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
14 juin 2005 à 15:21
Yaoooooooooooooooouuuuuuuuuuuuuuu !



Eh bah ! ca marche, j'ai "ton message" qui apparait dans ma textbox :)



Maintenant faut que je foute ça à ma sauce, merci bcp Seb.



Et surement a bientôt
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
14 juin 2005 à 15:22
de rien... les forums sont fait pour ça


<HR>
Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
0
Rejoignez-nous