Accès un un contrôle à partir d'une autre class !!!

Résolu
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 - 4 janv. 2006 à 16:29
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 - 7 janv. 2006 à 11:46
Bonjour ;

J'ai une forme (class) principale : MainForm sur laquelle j'ai déposé un contrôle button1. J'ai rajouté une deuxième forme (class) OptionsForm.

Donc pour accéder au bouton à partir de OptionsForm, j'ai déclaré l'instance du bouton comme suit :
public static System.Windows.Forms.Button button1 ;

Là, j'ai un problème sur la classe principale : MainForm ????

Y'a-t'il une astuce pour celà !!!

Merciiiii à tous !!!

23 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
4 janv. 2006 à 18:58
j'ai fais une erreur, ce n'est pas

<HR>
maForm.Label.Text = "Test";

<HR>

mais


<HR>
mainForm.Label.Text = "Test";

<HR>

Mx
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 janv. 2006 à 16:38
et c'est quoi ton problème ?

Sébastien FERRAND
[MVP C#]
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
4 janv. 2006 à 16:45
Le probleme, c'est qu'il a déclaré son bouton static, et qu'il a tout cassé.

Tu voudrais faire quoi au juste, avec ton bouton ?

Mx
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 janv. 2006 à 16:48
justement j'attendais qu'il me le dise...

La véritable question est : Pourquoi veux-tu avoir accés à ce bouton depuis une autre classe ?

Sébastien FERRAND
[MVP C#]
0

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

Posez votre question
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
4 janv. 2006 à 16:54
Merci pour ton aide !!!

Le problème est :

- Pour accéder au contrôle button1 à partir de OptionsForm, je suis obligé de déclarer le bouton comme public static dans la MainForm... D'où l'erreur :
Le membre static 'Application.MainForm.button1' est inaccessible avec une référence d'instance ; qualifiez-le avec un nom de type

- Et si j'enlève static pour le bouton dans la MainForm, j'ai cette erreur :

Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'Application.MainForm.button1'

Voilà!!!
Merciii !!!
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 janv. 2006 à 16:57
ok... juste une question... tu faisais du vb6 avant ?

Sébastien FERRAND
[MVP C#]
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
4 janv. 2006 à 17:00
Ben, j'ai pris comme example un bouton, mais bon, ça va être la même chose pour tous les autres contrôles !!!

Un exemple plus concrêt, si je déclare un contrôle de type ocx ou une connexion à une base de données dans la MainForm, et la deuxième form est, par exemple, une SplashScreen où j'initialise mes contrôles!!!

Voilà !!!

Merci !!!
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 janv. 2006 à 17:05
C# est un langage objet... donc les membres d'une classe font partis d'une instance, pour y accéder tu dois récupérer un objet.

Application.MainForm est un type, pas une instance.

Si tu n'es pas famillié avec ce vocabulaire, je te conseille l'achat d'un livre (par ex: http://www.csharpfr.com/livres.aspx?ID=9160) ou bien cherche sur le net : http://www.google.fr/search?hl=fr&q=%22programmation+orientee+objet%22&meta=

Sébastien FERRAND
[MVP C#]
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
4 janv. 2006 à 17:10
Merci, mais bon, je parlais de l'instance du boutton !!!

La question que je pose maintenant, c'est comment accéder à un contrôle de la MainForm à partir d'une autre classe !!!

Vous êtes vraiment Top ... Merci !!!
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
4 janv. 2006 à 17:56
>Ben, j'ai pris comme example un bouton, mais bon, ça va être la même chose pour tous les autres contrôles !!!
>Un exemple plus concrêt, si je déclare un contrôle de type ocx ou une connexion à une base de données dans la >MainForm, et la deuxième form est, par exemple, une SplashScreen où j'initialise mes contrôles!!!

Il y a plusieurs facons de procéder : Passage d'une reference de ton instance a ton autre classe, Delégués/Evenements, Singleton...

Le plus simple, pour que OptionsForm connaisse ton bouton, mets ton bouton en public, et passe l'instance de ta MainForm en parametre a OptionsForm.
Mais tout depend de ce que tu veux vraiment faire de ton bouton depuis OptionsForm pour trouver une solution propre

Mx
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
4 janv. 2006 à 18:08
Tu met ton bouton en accès public, ou alors tu créé une propriété qui pointe vers ton bouton :

public Button bouton
{
get
{
return this.Instancedebouton;
}

set
{
this.Instancedebouton = value;
}
}

Remarque que cette fois, je ne me suis pas trompé ds la déclaration de la propriété
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
4 janv. 2006 à 18:22
Et si je prend un autre exemple :

Supposons que j'ai un label, label1, sur la MainForm et au démarrage à l'aide des threads, je veux affecter la valeur "test" au label1 à partir de la OptionsForm.

Comment procéder !!!

Merci à vous!!!
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
4 janv. 2006 à 18:24
Si tu veux modifier un control a l'aide d'un thread autre que le thread principal, je te renvoies a ce tutorial

Mx
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
4 janv. 2006 à 18:44
Enfin, j'utilise les threads juste pour lancer les 2 fenêtres, et la OptionsForm comme SplashSreen :

Dals la MainForm :

static void Main()
{
MyApplication myApplication =
new MyApplication( new MainForm(), new OptionsForm

(), 0) ;

Application.Run( myApplication ) ;
}
Et dans la OptionsForm, je fais :
private void OptionsForm_Load(object sender, System.EventArgs e)
{
this.Show();
Application.DoEvents();
Cursor.Current = Cursors.WaitCursor;

MainForm.label1.Text = "Test" ; // ici label1 est dans MainForm
this.labelStatus.Text = "OCX Réseau";
this.labelStatus.Refresh();
System.Threading.Thread.Sleep(1000);

this.Close();
}

Voilà exactement le petit code. Et là, comment accéder au label à partir de OptionsForm ???

Merciii à tous !!C'est très sysmpat de votre part !!! Thanx!!!
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
4 janv. 2006 à 18:54
Tu ne peux pas procéder ainsi

MainForm.label1.Text = "Test" ; // ici label1 est dans MainForm

Tout simplement parce que MainForm n'est pas ton instance
Transforme ton code en

<HR>
MainForm maForm = new MainForm();
MyApplication myApplication = new MyApplication( maForm, new OptionsForm(), 0);

<HR>

Ensuite, sachant qu'il faut que OptionsForm accede a maForm, il faut la lui passer en parametre, donc change le constructeur de OptionsForm pour qu'il attende un parametre MainForm


<HR>
public class OptionsForm
{
public MainForm mainForm;
public OptionsForm(MainForm mainForm)
{
this.mainForm = mainForm;
}
// ....
}

<HR>

et tranforme le code ainsi


<HR>
MainForm maForm = new MainForm();
MyApplication myApplication = new MyApplication( maForm, new OptionsForm(maForm), 0);

<HR>

Et finalement, dans ton _Load, tu n'as plus qu'a faire (en ayant mis ton label en public)

<HR>
maForm.Label.Text = "Test";

<HR>

Sinon, je ne vois rien qui fasse appel a un autre Thread dans ton code (mise a part la Thread.Sleep, qui signifie seulement que tu endors le thread principal)

Mx
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
4 janv. 2006 à 19:16
Waw...

J'ai suivi tes instructions à la lettre... Là il me donne un resultat bizzare !!! Une seule fenêtre au démarrage sans aucun contrôle là-dessus et ça bouge pas !!!

Avant j'avais OptionsForm qui s'affiche, puis se ferme pour afficher la MainForm !!!
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
4 janv. 2006 à 19:19
Et ça passe pas non plus avec cette dernière modification qui donne exactement la même erreur du début !!!
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
4 janv. 2006 à 19:35
Je pense qu'il va nous falloir plus de code si tu veux qu'on t'aide.
A quoi te sert la classe MyApplication ?

Mx
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
4 janv. 2006 à 19:43
Je ne sais pas s'il ya un moyen de t'envoyer tout le code source !!! comme pièce jointe !!!

Sinon, je colle le tout ici !!!
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 janv. 2006 à 20:07
pour avoir une idée de la méthode, regarde ce code : http://www.csharpfr.com/code.aspx?ID=33709

Sébastien FERRAND
[MVP C#]
0
Rejoignez-nous