Accès un un contrôle à partir d'une autre class !!! [Résolu]

Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 16:29 - Dernière réponse :
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
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 !!!
Afficher la suite 

Votre réponse

23 réponses

Meilleure réponse
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 4 janv. 2006 à 18:58
3
Merci
j'ai fais une erreur, ce n'est pas

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

<HR>

mais


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

<HR>

Mx

Merci MorpionMx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

Commenter la réponse de MorpionMx
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 4 janv. 2006 à 16:38
0
Merci
et c'est quoi ton problème ?

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 4 janv. 2006 à 16:45
0
Merci
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
Commenter la réponse de MorpionMx
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 4 janv. 2006 à 16:48
0
Merci
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#]
Commenter la réponse de sebmafate
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 16:54
0
Merci
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 !!!
Commenter la réponse de CSharpJSharp
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 4 janv. 2006 à 16:57
0
Merci
ok... juste une question... tu faisais du vb6 avant ?

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 17:00
0
Merci
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 !!!
Commenter la réponse de CSharpJSharp
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 4 janv. 2006 à 17:05
0
Merci
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#]
Commenter la réponse de sebmafate
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 17:10
0
Merci
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 !!!
Commenter la réponse de CSharpJSharp
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 4 janv. 2006 à 17:56
0
Merci
>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
Commenter la réponse de MorpionMx
Messages postés
750
Date d'inscription
vendredi 17 juin 2005
Dernière intervention
23 mai 2007
- 4 janv. 2006 à 18:08
0
Merci
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é
Commenter la réponse de nightlord666
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 18:22
0
Merci
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!!!
Commenter la réponse de CSharpJSharp
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 4 janv. 2006 à 18:24
0
Merci
Si tu veux modifier un control a l'aide d'un thread autre que le thread principal, je te renvoies a ce tutorial

Mx
Commenter la réponse de MorpionMx
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 18:44
0
Merci
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!!!
Commenter la réponse de CSharpJSharp
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 4 janv. 2006 à 18:54
0
Merci
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
Commenter la réponse de MorpionMx
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 19:16
0
Merci
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 !!!
Commenter la réponse de CSharpJSharp
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 19:19
0
Merci
Et ça passe pas non plus avec cette dernière modification qui donne exactement la même erreur du début !!!
Commenter la réponse de CSharpJSharp
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 4 janv. 2006 à 19:35
0
Merci
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
Commenter la réponse de MorpionMx
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Dernière intervention
24 mai 2010
- 4 janv. 2006 à 19:43
0
Merci
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 !!!
Commenter la réponse de CSharpJSharp
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
- 4 janv. 2006 à 20:07
0
Merci
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#]
Commenter la réponse de sebmafate

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.