Dialogue entre deux Form

[Résolu]
Signaler
Messages postés
289
Date d'inscription
mardi 31 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2012
-
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
Bonjour,

voila ce que je veut faire:
 
Form1 : quand je clique sur un bouton j'effectue une requête qui peut me retourner un ou plusieurs résultat. Si j'ai plusieurs résultat ma Form2 s'affiche. elle contient  ListBox qui contien tout mes résultat,ainsi qu'un bouton "choisi" <---- Jusque la ok (enfin je pense)

Form2 quand je choisi un element de ma ListBox et que je clique sur "choisi" : ca me retourne mon objet <---La je bloque je ne sais pas comment faire.

J'ai tenté plusieurs tests, j'ai effectué quelques recherches mais je n'ai pas trouver de vrai réponse.
Dans Form1 je fait :
   Form2 maForm=new Form2();
   maForm.Show();
   maForm.remplirmaListBox(maListedObjet);
Dans Form2 : je sais pas quoi faire parceque rien ne marche

Merci

19 réponses

Messages postés
289
Date d'inscription
mardi 31 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2012

Donc en fait j'ai trouvé un moyen (Coup de chance ? Oo), ca me semble etre un peu de la bidouille mais ca fait ce que je veu que ca fasse, je vous explique :

dans Form1:

Form2 maForm = new Form2(this); // this indispensable ?
maForm.RemplirListBox(Reponse);
maForm.ShowDialog();
String val=maForm.getValeurChoisi();
MessageBox.Show(val); //M'affiche la valeur que j'ai selectionné !

Tout simplement quand j'ai cliquer sur mon bouton "choisir" de ma Form2, je fait appel a une methode de Form2.

Par contre aprés, faut il que je détruise ma Form2, ? et comment ?
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Bonjour,

Je te conseille de te pencher sur cette source: http://www.csharpfr.com/codes/PASSAGE-PARAMETRES_26735.aspx
Elle te sera utile pour faire ce que tu souhaites.

Bon courage,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

Bonjour,

Avant de m'aventurer dans une hypothétique réponse, j'aimerais savoir ce qu'elle retourne ta requête ? Car si elle retourne plusieurs champs je ne sais pas si ca peux marcher ce que j'ai a proposer.

Grosso modo, faudrait que tu regardes si la ligne que tu "choisi" correspond à 1 item (ListBox1.SelectedItem). Si c'est le cas alors retourne ceci.

Sinon j'ai une autre idée essaye pour voir si ca fonctionne :

Dans ton Form 2 tu crée une fonction qui renvoie ton objet (attention au typage de ta fonction faut que ca coordonne).
Dans ton Form 1 tu gardes tes lignes de codes mais tu rajoutes :

   <Variable récuperant l'objet> =   Maform.<Le nom de ta fonction>;

et voila, chez moi ca fonctionne mais j'ai fait ca avec une variable int donc moins difficile a fournir le type de la fonction.

Dit moi si ca ta aider :)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
L'année 2009 sera denouveau riche en question "passage de paramètre"

<hr />
-Blog-
-Site Perso-
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

C'est super important de connaître mille et une façon de faire les passages de paramètre ca ne m'étonne pas qu'il y est plein de gens qui demande à savoir, moi même pas plutard qu'avant hier je me suis fait chier pour trouver une solution (sans doute boiteuse) pour le passage de paramètre :D
Messages postés
289
Date d'inscription
mardi 31 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2012

Bonjour,

alors le code que tu propose je l'avais deja télécharger.

Rhend--> Admettons que je veuille retourner une string, si tu préfère. :)

voici ce que j'ai fait Form 1 :
  DialogResult dr = new DialogResult ();
  Form2 maForm = new Form2();
  maForm.RemplirListBox(Reponse);
  maForm.Show();
                  
   dr = maForm.DialogResult;
   if ( dr == DialogResult.OK )
      Adresse.Text=formChoix.getValeur();

et dans Form2 y'a ma méthode de remplissage, et ma methode get
Messages postés
289
Date d'inscription
mardi 31 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2012

Ah j'oubliais ( on ne peut pas éditer un message ? Oo) ca ne fonctionne pas :)
Messages postés
289
Date d'inscription
mardi 31 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2012

Bidou, dans ton code on peut passer de Form1 à Form2, ca je savais deja faire, mais a moins que je me trompe, je n'ai pas vu comment faire le retour.
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Re,

1) Si tu passes un objet à ta Form2, toute modification serait répercutée automatiquement.

2) Sinon, tu peux très bien passer la Form1 en paramètre du contructeur de la Form2.
public Form2(Form parentForm)
{
}
Tu conserves alors ta parentForm en tant que membre de ta classe Form2.
Et alors, ta Form2 pourra répercuter des choses sur la Form1.

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

2) Sinon, tu peux très bien passer la Form1 en paramètre du contructeur de la Form2.
public Form2(Form parentForm)
{
}
Tu conserves alors ta parentForm en tant que membre de ta classe Form2.
Et alors, ta Form2 pourra répercuter des choses sur la Form1.

--------

Ce n'est pas déjà le cas si les deux Forms sont dans le même projet ?
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Non, car tes deux Forms de ton projet sont des classes et non des objets.
Tu peux tout à fait te créer une classe Form2 que tu instancieras x fois dans ton application pour en afficher x.

D'ailleurs, si tu regardes le code exécuter au démarrage de ton application (dans le fichier Program.cs), tu as la ligne:
Application.Run(new Form1());
Il instancie un objet de type Form1.

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Au passage (parce que je n'y avais pas pensé avant), dans le code de ta Form1 qui instancie ta Form2, il te faudra faire:
Form2 form = new Form2(this); //ou this représente la form courante qui créé la Form2

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

Non, car tes deux Forms de ton projet sont des classes et non des objets.
Tu peux tout à fait te créer une classe Form2 que tu instancieras x fois dans ton application pour en afficher x.
-----------------------

Est-ce que ca veut dire que si je fait ca je peux revenir X fois sur Form1 pour lancer Y fois la Form2 et pouvoir gerer les Y Form2 comme bon me semble ? Ou est-ce que c'est sur un principe de FILO ? (First In Last Out) ?
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Bonjour,

Tu as tout à fait raison, ta Form1 pourra créer N Form2 et les gérer toutes ! Inversement, si tu passes la Form1 à toutes tes Form2, elles pourront appeler la Form1.
De même, tu pourrais tout à fait concevoir que ton application lance N Form1 au démarrage.

Bonne journée,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Alors voila, si je comprend bien, ta Form2 contient une listbox de valeurs sur lequel l'utilisateur choisit un item.

Donc voila ce que je te conseille:

1) Dans ta Form2:
- tu créé deux bouttons, un "Ok" et un "Annuler" pour valider ou non le choix.
Et dans les événements on clic des bouttons:

/// <summary>
/// Method launched on OK button click
/// </summary>
/// The source of the event.

/// The <see cref="System.EventArgs"/> instance containing the event data.

private void okBtn_Click(object sender, EventArgs e)
{
   this.DialogResult = DialogResult.OK;
   this.Close();
}

/// <summary>
/// Method launched on Cancel button click
/// </summary>
/// The source of the event.

/// The <see cref="System.EventArgs"/> instance containing the event data.

private void cancelBtn_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Cancel;
    this.Close();
}

OUTu peux déclarer via le designer ton boutton "Ok" avec la propriété "DialogResult" "OK" ; le boutton "Annuler" avec la propriété "DialogResult" "Cancel".
Et sur les propriétés de ta Form2 pour "AcceptButton" tu prend le boutton "Ok" et pour "CancelButton", le boutton "Annuler"

C'est pareil !

2) Dans ta Form1:
Form2 maForm = new Form2(this); // this indispensable ?
maForm.RemplirListBox(Reponse);
if(maForm.ShowDialog() == DialogResult.OK)
{
   String val=maForm.getValeurChoisi();
   MessageBox.Show(val); //M'affiche la valeur que j'ai selectionné !
}

Voila,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
289
Date d'inscription
mardi 31 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2012

Merci.
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
De rien !

Au fait quand j'ai dit c'est pareil, c'est pas complétement pareil et il est vrai que c'est mieux de déclarer les boutons Accept et Cancel côté designer.
Notamment pour la gestion de la touche Echap qui est prise en compte de ce dernier cas (et pas si tu ne mets que les événements OnClick des boutons).

Voila pour la précision,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

Pour détruire ta Form2 tu fais Form2.Dispose()
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Personnellement, je ne pense pas que ce soit nécessaire car si tu créé ta Form2 dans une méthode de ta Form1, elle deviendra disposable suite à la fin de la méthode.
Laissons le garbage collector faire son travail :)

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------