Bonjour,
je debute avec le c# et dans mon application j'ai beaucoup de transactions entre les fenetres et à chaque Form.Show() je trouve un doublant.
j'ai essayé avec Form.ShowDialog() mais toujours le meme probleme.8O
Version imprimable
Bonjour,
je debute avec le c# et dans mon application j'ai beaucoup de transactions entre les fenetres et à chaque Form.Show() je trouve un doublant.
j'ai essayé avec Form.ShowDialog() mais toujours le meme probleme.8O
Bonjour,
Tu as un peu plus d'informations, parce que là je dois t'avouer ne pas tout comprendre à ton problème?
bonjour,
voila mon problème : j'ai une fenêtre principale de la qu'elle j'ouvre une autre fenêtre, jusque la c'est bon le problème et que quand je clik une autre fois sur le bouton pour ouvrir j'ai une autre fenêtre qui s'ouvre ( exemple pour "a propos" je peux avoir 2 ou plus ouverte en même temps )
comment résoudre ce problème, merci
voila mon code pour ouvrir la fenêtre
Code:
1
2 Form3 frm = new Form3(); frm.Show();
En gros quand tu ouvres un nouveau formulaire, tu aimerais ne plus avoir accès au précédent jusqu'à fermeture du nouveau c'est ça ?
Tu veux masquer les autres fenêtres quand tu en ouvre une nouvelle?
@Gurdil : Il me semble que quand tu ouvres un form à partir d'un autre, tant que tu n'as pas fermé ce form tu ne peux rien faire sur l'autre. Mais c'est peut être qu'avec le form.ShowDialog();
Oui c'est ce que j'ai trouvé form.ShowDialog()
Mais toujours le meme pb, est ce qu'il suffit de remplacer .Show() par .ShowDialog() ou il ya un autre bout de code à insérer?
Mais c'est quoi ton problème en fait? Je comprends pas "un doublant"...
en fait j'ai un Form1 comportant un bouton qui amene à un autre form2, je doit extraire des informations de Form2 et les inserer dans Form1. J'ai obtenu finalement un double Forme1 le premier est vide et le 2eme mis à jour par les données que j'ai insérées.
Je veux obtenir uniquement un seul Form1 mis à jour sans garder le precedent.
Ah ok, il y a donc un soucis de conception là...
D'après ce que tu dis, je comprends qu'à la fermeture du Form2, tu recréé un form1 avec des nouveaux paramtètres (tes données) pour le remplir.
Il vaudrait mieux que tu surcharge le constructeur de ton Form2, en lui passant en paramètres ton Form1 (déjà créé mais plus accessible grâce au ShowDialog), et à la fermeture du Form2 (évènement Form_Closing) tu appelles une fonction du Form1 qui va le rafraichir...
Clair ? :aie:
Oui c'est claire mais ambiguë :mrgreen:
Vous pouvez me donner un exemple svp :oops:
Bon je t'ai fait un code tout simple :
Form1 contient un bouton (buttonForm1) qui va ouvrir Form2 et un textBox (textBoxForm1) qui va se charger à la fermeture de Form2.
Form2 contient un bouton (buttonForm2) qui va recharger Form1 et un textbox (textBoxForm2) qui va servir à taper du texte.
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
25
26
27
28
29
30
31
32
33
34
35
36
37 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void buttonForm1_Click(object sender, EventArgs e) { Form2 form = new Form2 (this); //Ici on appelle Form2 en lui passant Form1 form.ShowDialog(); } public void loadData(String data) { this.textBoxForm1.Text = data; } } public partial class Form2 : Form { private Form1 precForm; //Le constructeur redéfinit public Form2(Form1 form) { InitializeComponent(); precForm = form; } private void buttonForm2_Click(object sender, EventArgs e) { precForm.loadData(this.textBoxForm2.Text); //Ici on renvoie les données à Form1 this.Close(); } }
Moi ce que je vois, puisque je commence seulement à comprendre, c'est de passer des paramètres (si besoin) à une nouvelle fonction qui va ouvrir le form2 puis retourner les données pour refaire le form1
un objet de données
dans form2Code:
1
2
3
4
5
6
7 public class Data { public int DtInt {get;set;} public string DtStr {get;set;} .... etc }
dans form1Code:
1
2
3
4
5
6
7
8
9 public Data ShowForm2(éventuels paramètres) { Data ret = new Data(); ShowDialog(); ret.Dtint = 1; ret.DtStr = "coucou"; return ret; }
Code:
1
2
3
4
5
6 Data data; Form2 form2 = new Form2(); data = form2.ShowForm2(paramètres); this.tralala = data.DtInt; this.toto = data.DtStr;
La solution de Gurdil à l'air nickel pour ce que tu veux.
Par contre pour en revenir à ton double de formulaire, lors de la fermeture de ton form2 tu ne fais pas à nouveau une instanciation de form1, puis form1.Show() ? Parce que là ce serait normal que tu es un nouveau form1 vide en plus de l'autre.
@ppphil :
Comment il fait si ce sont des données rentrées par l'utilisateur ?
Ta méthode fonctionne uniquement pour des données fixes définies dans la fonction ShowForm2, ou alors j'ai pas pigé ton code :D
La solution de Gurdil est intéressante mais impose que Form2 travaille directement avec Form1 (...ce qui n'est pas idéal pour un certain nombre de raison).
Une solution possible pour contourner le soucis :
PascalCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { using (Form2 frm = new Form2()) { if (frm.ShowDialog() == DialogResult.OK) this.TextBoxForm1.Text = frm.Data; } } } public partial class Form2 : Form { private string _data; public string Data { get { return _data; } } public Form2() { InitializeComponent(); } private void btnOk_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.OK; _data = this.TextBoxForm2.Text; Close(); } private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; Close(); } }
@_PascalC_ : Bonjour ! Effectivement ta solution est bien pensée, par contre pourrais-tu développer les raisons pour lesquelles la façon de faire de Gurdil n'est pas idéale? Simple curiosité de ma part :)
Oki, je peux te demander ce que tu entends par générique?
Désolé, je profite de se post pour me cultiver un peu :) J'utilise cette façon de faire dans un projet parce que j'ai besoin de manipuler des NumericUpDown via un autre formulaire. Et si on pouvait m'éclairer sur une meilleur façon de faire je serai preneur :)