Bonjour à tous,
Voila mon problème, j'aimerais accéder à un bouton qui se trouve dans un autre form. Mais je n'y arrive pas... :cry:
Comment procéder?
Merci d'avance.
Version imprimable
Bonjour à tous,
Voila mon problème, j'aimerais accéder à un bouton qui se trouve dans un autre form. Mais je n'y arrive pas... :cry:
Comment procéder?
Merci d'avance.
Accéder au bouton lui même ? (pour par exemple changer son texte etc ..)
Ou accéder a un événement du bouton ? (par exemple le click ?)
Je désactive le bouton dans le load de son propre form et j'aimerais le réactiver quand je clic sur OK dans un autre form. La technique que je vaut faire n'est peut être pas la bonne...
Question intéressante en fait je trouve :P
Tout dépend un peu de comment se passe ton application.
Tu peux m'éclairer ?
Tu as une Form1 avec un bouton désactivé.
Une Form2 qui voudrait réactivé ce bouton a partir de l événement d'un de ces boutons, ça je crois avoir compris.
Ta Form2, elle est lancée à partir de ta Form1 ?
avec Show() ? ShowDialog() ?
Dans le load de mon form 1 les bouton sont désactivé si le fichier n'existe pas.
J'appelle le form 2 comme ceci:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 private void Form1_Load(object sender, EventArgs e) { string Dossier = Application.StartupPath; string Chemin = System.IO.Path.Combine(Dossier, fichier.FichierJoueurs); MessageBox.Show(Chemin); if (System.IO.File.Exists(Chemin)) { bChargerJoueur.Enabled = true; bChoixJoueur.Enabled = true; bCommencerPartie.Enabled = true; bNewPerso.Enabled = true; } else { bChargerJoueur.Enabled=false; bChoixJoueur.Enabled = false; bCommencerPartie.Enabled = false; bNewPerso.Enabled = false; } }
Dans le form 2 je crée mon fichier et je met un joueur dedans lorsque je clic sur OK.Code:
1
2
3
4
5 private void bNewPerso_Click(object sender, EventArgs e) { New_Perso p2 = new New_Perso(); p2.Show(); }
J'aimerais que quand je clic sur Ok il réactive mes boutons.
J'espère avoir été clair :DCode:
1
2
3
4 bChargerJoueur.Enabled = true; bChoixJoueur.Enabled = true; bCommencerPartie.Enabled = true; bNewPerso.Enabled = true;
Oui, je vois.
Alors il faut que ta Form2 connaisse ta Form1.
Pour ça, la manière la plus simple c'est de passer ta Form1 en paramètre au constructeur de ta Form2.
Code:
1
2
3
4
5
6 private void bNewPerso_Click(object sender, EventArgs e) { New_Perso p2 = new New_Perso(this); p2.Show(); }
Tu vois donc que dans l'événement button1_Click de ma forme2, je réactive le bouton de ma Form1. Seulement, par défaut, les boutons sont private. Si tu veux pouvoir y accéder comme dans l'exemple il faut que tu mettes le bouton à réactiver en public (à changer dans le fichier Form1.Designer.cs)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public partial class New_Perso : Form { Form1 Parent; public New_Perso(Form1 f) { InitializeComponent(); Parent = f; } private void button1_Click(object sender, EventArgs e) { Parent.button2.Enabled = true; } }
En procédant de la sorte, ça va fonctionner.
Seulement, je suis pas sur que ça soit très "propre" et la sur le coup, je vois pas d'autre moyen. Peut-être quelqu'un qui passera par ce topic trouvera une meilleure solution ;)
De plus, je suis pas partisan de l'utilisation de show() au lieu de showDialog() sauf si c'est vraiment nécessaire. Est-ce le cas dans ton application ?
Echanger des event entre les formes est une solution quand même plus simple que les faire se référencer l'une l'autre (ce qui est quand même très très sale).
Je pense que tu peut parcourir les forms ouvertes pour obtenir ta form parent puis accéder au control à éditer.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 int iOpenForm = Application.OpenForms.Count; int iControlCount; foreach (Form f in Application.OpenForms) { iControlCount = Application.OpenForms[iOpenForm - 1].Controls.Count; if (f.GetType() == callingForm.GetType()) { foreach (Control controle in f.Controls) { if (controle.Name.ToString() == button1.Name.ToString()) { button1.Enabled = true; } } } }
J'ai utilisé la méthode d'Antho42, d'après ce que je lis elle est pas super propre mais elle fonctionne, c'est le principale à mon stade, ça me permet d'avancer dans mon programme.
Un grand merci à vous tous! :mrgreen:
ps: Tant que j'y suis quelle est la différence entre show() et showDialog? Parce que je doit avouer que j'utilise show() parce que je l'ai vu aux cours et sans être au courant de l'existence de ShowDialog()...
Jespérais ne jamais voir du code de ce genre. C'est une des facon de faire la plus sale. Sérieusement, si jai un programmeur dans mon équipe qui code de cette facon, je lui montre la porte et c'est byebye.
Il y a plein de facon de faire, form2 ne devrais pas interagir avec les composant de form1. C'est a form1 de déterminer quand elle doit réactivé sont bouton. Cela s'appel de l'encapsulation.
Show() : http://msdn.microsoft.com/fr-fr/libr...ow(VS.80).aspx
ShowDilaog() : http://msdn.microsoft.com/fr-fr/libr...og(VS.80).aspx
En gros, c'est question d'être modale ou non.
Maintenant dans ton application, je sais pas ce qui est le mieux.
Comme l'a bien dit Shwin, ça serait bien que Form2 n'aie pas a changer lui même l'état du bouton de Form1. Que ça soit Form1 qui change l'état de son propre bouton (private) quand il a été prévenu par Form2.