Dialogue entre deux Form

Résolu
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012 - 15 janv. 2009 à 15:35
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 16 janv. 2009 à 12:15
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

Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012
16 janv. 2009 à 11:33
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 ?
3
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
15 janv. 2009 à 16:03
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
---------------------
0
Rhend Messages postés 43 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 14 juin 2009
15 janv. 2009 à 16:05
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 :)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
15 janv. 2009 à 16:11
L'année 2009 sera denouveau riche en question "passage de paramètre"

<hr />
-Blog-
-Site Perso-
0

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

Posez votre question
Rhend Messages postés 43 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 14 juin 2009
15 janv. 2009 à 16:12
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
0
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012
15 janv. 2009 à 16:30
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
0
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012
15 janv. 2009 à 16:33
Ah j'oubliais ( on ne peut pas éditer un message ? Oo) ca ne fonctionne pas :)
0
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012
15 janv. 2009 à 16:49
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.
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
15 janv. 2009 à 17:04
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
---------------------
0
Rhend Messages postés 43 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 14 juin 2009
15 janv. 2009 à 17:33
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 ?
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
15 janv. 2009 à 17:38
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
---------------------
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
15 janv. 2009 à 17:39
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
---------------------
0
Rhend Messages postés 43 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 14 juin 2009
16 janv. 2009 à 10:12
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) ?
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
16 janv. 2009 à 11:14
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
---------------------
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
16 janv. 2009 à 11:45
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
---------------------
0
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012
16 janv. 2009 à 11:48
Merci.
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
16 janv. 2009 à 11:56
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
---------------------
0
Rhend Messages postés 43 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 14 juin 2009
16 janv. 2009 à 12:09
Pour détruire ta Form2 tu fais Form2.Dispose()
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
16 janv. 2009 à 12:15
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
---------------------
0
Rejoignez-nous