Acceder aux proprietes d'une fenetre a partir d'une autre

Résolu
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005 - 24 déc. 2004 à 09:29
Athalus Messages postés 131 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 7 juillet 2005 - 4 janv. 2005 à 10:46
Bonjour a tous et a toutes

Apres avoir bien exploré de nombreux post du forum, je ne trouve pas de solution a mon probleme.

Le probleme : Application MDI
Une forme Main crée une Form1
La Form1 crée une Form2

Je voudrais pouvoir acceder aux propriétés de Form1 a partir de Form2
Ex : dans Form2 : Form1.Enabled = true;

Je viens du monde Visual Basic, je commence donc a comprendre les mecanisme du C++/C#.

J'ai lu des methodes conscistant a passer en ref les attribut a modifier mais cette solution n'est pas satisfaisante dans mon cas.

A moin de passer carement la Form1 en ref dans le constructeur de la Form2. Mais je n'y suis pas arriver...

Et ce probleme ne resoudrait pas un acces a une troisieme fenetre
ex Form1 -> Form 2 -> Form3 donc Form3 ne peut pas acceder a Form1.

Voila, j'espere avoir été assez clair. J'espere qu'il est possible d'acceder aux propriétés aussi facilement qu'en VB. Malgres qu'il soit permissif, VB reste un langage souple sur certain point non negligeable.

Merci par avance et bonnes fetes a tout le monde

26 réponses

akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 14:32
J'ai enfin reussi!!!!

C'est grace a tout ces conseils alors merci a tous!! je vous met le code

dans le form1

Form2 form2 = new Form2(this);
form2.Show; 


Dans la form2

public  From1 form1b

public Form2 (Form1 form1)
{
form1b=form1
InitializeComponent();
}


je peux maintenant acceder a form1b.enabled

Merci!!!!!!!!!!!
3
digital3d Messages postés 37 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 28 février 2005 1
24 déc. 2004 à 10:22
Salut, je viens aussi du monde Visual Basic, en C# tu dois instancier une form absolument même si elle existe déjà, une autre form ne peux avoir accès que si tu reinstancie ta form, par exemple:

j'ai deux forms:
Form1
Form2 + un label dedans comme nom "label1"

ils sont toutes les deux visibles avec plein de trucs dedans, si de Form1, tu veux reprendre certaines choses de Form2, tu dois faire ceci:

//Je connais le nom du control que je veux utiliser, il s'apelle "label1"
//Je suis dans la Form1 et j'instancie la Form2
Form frm = new Form2();
//Je montre la Form2, il y a bien un label dedans
frm.Show();

//J'instancie un nouveau control a partir de la Form2 et je recherche le control avec le nom "label1"
Control ctl = frm.GetNextControl(new Control("label1"),true);
//J'affiche dans le titre de ma Form1 le texte du Label de ma Form2
this.Text = "Texte prit de la Form2 et mis dans le titre: " + ctl.Text;

En fait en C#, tu dois tout instancier, tout les contrôles appartiennent à la form elle-même et ne peux pas être appelé ailleurs, j'espère que j'ai su t'aider
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 10:31
Merci pour ta reponse!

Je suis d'accord avec toi. Dans la form1, j'arrive a acceder au propriété de la from2 puisque je l'ai instancié ici meme.
Mais je n'arrive pas a faire l'inverse.

Avec la form1, j'instancie la form2 et je la show()

Mais si dans la form2 j'instancie la form1, j'obtien alors une nouvelle instance de la form1 et les valeur que je modifie seront appliqué a cette nouvelle instance.

Merci pour ton aide
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
24 déc. 2004 à 10:35
ou alors tu met ton label1 en public et tu fais depuis form1 un truc style :

form2 f = new form2();
f.show();

....

MessageBox.Show(f.label1.Text);

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
0

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

Posez votre question
digital3d Messages postés 37 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 28 février 2005 1
24 déc. 2004 à 10:40
En mettant Public un label, je ne la vois pas ? Es tu sur de ton code ?
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 10:40
Pour etre plus clair je vais mettre le code :

Dans ma 1ere form nommé cmd_etat_frm :
void Btn_livrerClick(object sender, System.EventArgs e)
{

lvr_frs_frm Lvr_frs_frm = new lvr_frs_frm () ;
Lvr_frs_frm.MdiParent = this.MdiParent;
Lvr_frs_frm.Show();

}

Dans ma deuxieme form nommé lvr_frs_frm si je fais cmd_etat_frm.Enabled = true;
cela ne marche pas

Je trouve qu'a ce niveau, vb etat plus adapté

Merci pour ton aide
0
digital3d Messages postés 37 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 28 février 2005 1
24 déc. 2004 à 10:48
VB n'est pas plus adapté, il était facile mais insecurisant, en C# tout a été repensé, TOUT EST DU CODE, en VB une form était une form, tu ne pouvais rien faire d'autres qu'utiliser les paramètres standard, en C# une form est du code, tu peux faire des bords rond, la redessiner, tout est dans ton code, et ce que tu vois à l'écran n'est que le résultat de ton code, c'est plus profond.

Il est vrai que ca serait super de faire appelle comme en VB à un control d'une autre form mais ici vaux mieux le parametrer tout toi même, tu fais une bête fonction qui te renvois le control que tu veux:

private void Form1_Load(object sender, System.EventArgs e)
{
Form frm = new Form2();
frm.Show();

Control ctl = GetThisControl(Form2,"label1");
this.Text = ctl.Text;
}

public static Control GetThisControl(Form frm, string ControlName)
{
Control ctl = frm.GetNextControl(new Control(ControlName),true);
return ctl;
}
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 10:49
C'est donc en fait dans la From2 que je n'arrive pas a acceder a la Form1

L'inverse marche
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
24 déc. 2004 à 10:51
ou plus classe tu fais une propriete sur form2 qui te retourne le text de label1
:

public string Get_Label1Text
{
get
{
//permet de recuperer la valeur de label1.text
return label1.Text;
}
set
{
//permet de definir le text de label1 sur form2
this.label1.Text = value;
}
}

et dans fom1 tu fais :
Messagebox.Show(form2.GetLabel1Text);

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 10:53
Ce que tu dis est vrai, depuis la form1 j'accede a la form2
C'est ce que montre ton code.
Mais dans la form2 cela ne marche pas.

Car si dans la From2 je fais
From frm1 = new Form1();
Alors j'instancie une nouvelle From1...

Merci
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 10:54
De plus ces methodes ne permettent pas de modifier la form en elle meme : comme puis-je modifier la propriété Enabled de la fenetre comme ceci?

merci
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 11:01
D'apres ce que j'ai lu la meilleur methode est de passer en parametre la Form1 quand on instanci la form2 et dans son constructeur

Form2 form2 = new Form2(Form form1); //instanciation

public form2(Form form1); //constructeur

mais ca ne marche pas
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
24 déc. 2004 à 11:09
Form2 form2 = new Form2(new Form1()); //instanciation

public form2(Form1 maform1); //constructeur

serait mieux...

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 11:20
Merci, deja je n'ai plus d'erreur!

Dans mon code de la form2, je me maintenant taper

from1.enabled = true; // avec autocompletion du code

Le probleme c'est que rien ne se passe. J'ai mis ce code dans un bouton.
Je pense que rien ne se passe puisque, lorsqu'on instancie la form2, on instancie une autre Form1...

Merci pour ton aide
0
Athalus Messages postés 131 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 7 juillet 2005
24 déc. 2004 à 11:25
Bonjour,

Mais par enable tu veux que ca fasse quoi ? en plus clair que veux tu faire ?

hum.......
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 11:27
Je veux par exemple que lorsque j'appuye sur un bouon de la from2, ca rendre la form1 enabled.

Merci
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
24 déc. 2004 à 11:39
oui y faut que tu recupere l'instance deja active de ta form1 et pas recreer une nouvelle form....

alors si tu travail dans une fenetre mdi tu a des truc style getMdiChild...

sinon je sais pas...

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
0
akito06 Messages postés 23 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 27 janvier 2005
24 déc. 2004 à 11:45
En fait il me faut juste passer mon instance de Form1 nommé cmd_etat_frm lors de l'instanciation de ma form2

soit Form2 form2 = new Form2(cmd_frm_frs);

mais cela ne marche pas...

Merci beaucoup
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 déc. 2004 à 11:53
Form2 form2 = new Form2();
form2.Owner = this;


et dans Form2 :
this.Owner.Enabled = true;


Cocoricoooooooo !!!!
coq
MVP Visual C#
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 déc. 2004 à 11:55
ah !
declare le constructeur de Form2 comme ceci
public Form2(Form1 form)
{
...
}


Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Rejoignez-nous