Passage de parametres entre form

Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
- - Dernière réponse : olibara
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
- 29 févr. 2008 à 22:11
Bonjour

J'ai une mainform qui contient un DGV

Cette form appell une form modal dans laquelle j'aimerais utiliser le DGV de la main form ou au moins un row

J'ai essayé de passer le row en parametre mais je realise que cela ne me sert a rien. Mais je ne trouve pas non plus le moyen de rechercher les valeurs de mon DGV

Comment dois-je faire ?? quelle est la bonne methode ??
Quand j'aura capté ca ira mieux, mais j'avance

Voici la base de ce que je fais

1- Appel form modal depuis main form
    private void callEntry(int Index)
    {
      DataGridViewRow cRow = dgv_addr.Rows[Index];
      Form updData = new UpdData(cRow );
      bool a=updData.Modal;         // ca c'etait juste pour voir !!
      updData.ShowDialog();
    }
// ***********************************

2- tentatives d'utiliser les info de MainForm dans form UpdData


namespace TestMysql
{
  public partial class UpdData : Form
  {
    public UpdData(DataGridViewRow cRow)  // ne me permet pas d'utiliser cRow dans cette classe
    {
      InitializeComponent();
    }
    private void MaFonction()
    {
      // ?? comment utiliser cRow ou dgv_addr ici ??
    }
    private void UpdData_Load(object sender, EventArgs e)
    {
    }
  }
}
Afficher la suite 

13 réponses

Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
0
Merci
Salut,
Tu peux regarder ici:
http://www.csharpfr.com/codes/PASSAGE-PARAMETRES_26735.aspx

<hr />
-My Blog-
Commenter la réponse de cs_Bidou
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
1
0
Merci
Merci,

J'ai lu l'exemple et c'est +/- ce que j'avais déja fait en partie pour la recuperation des parametres d'appel

Par contre pour le renvoi des valeurs saisies dans la form secondaire, c'est plus ténébreux

Dans mon cas je dispose de ce cRow et il me semble quand meme beaucoup plus simple de l'utiliser comme container entre les deux form plutot que de tricoter les events de l'une a l'autre pour repasser des info par la cave et une nouvelle
(c'est du moins ce que j'ai compris a premiere vue de l'exemple qui n'est pas forcément simple pour un débutant car une fois on appele newuser sans parametre, une fois avec ...)

Donc, pour faire simple sans passer par des exemple +/- compliqués comment puis-je acceder a ce cRow dans les fonctions de ma form modal ?

Est-ce possible ?

Voici ce que je fais pour le moment

    public UpdData(DataGridViewRow cRow)
    {
      InitializeComponent();
      txb_ID.Text = cRow.Cells[0].Value.ToString();
      txb_post.Text = cRow.Cells[1].Value.ToString();
      txb_straat.Text = cRow.Cells[3].Value.ToString();
      txb_huis.Text = cRow.Cells[5].Value.ToString();
      txb_omschrijving.Text = cRow.Cells[6].Value.ToString();
      txb_regio.Text = cRow.Cells[7].Value.ToString();
      txb_X.Text = cRow.Cells["X"].Value.ToString();
      txb_Y.Text = cRow.Cells["Y"].Value.ToString();
    }
Commenter la réponse de olibara
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
1
0
Merci
Bonjour

J'ai trouvé une solution de contournement mais je ne sais pas si c'est "propre"

Qu'en pense le docteur ??

  public partial class UpdData : Form
  {
    DataGridViewRow cRowx; // je declare un Row dans ma new form
 
    public UpdData(DataGridViewRow cRow)
    {
      InitializeComponent();
      txb_ID.Text = cRow.Cells[0].Value.ToString();
      txb_post.Text = cRow.Cells[1].Value.ToString();
      txb_straat.Text = cRow.Cells[3].Value.ToString();
      txb_huis.Text = cRow.Cells[5].Value.ToString();
      txb_omschrijving.Text = cRow.Cells[6].Value.ToString();
      txb_regio.Text = cRow.Cells[7].Value.ToString();
      txb_X.Text = cRow.Cells["X"].Value.ToString();
      txb_Y.Text = cRow.Cells["Y"].Value.ToString();
      cRowx = cRow;  // j'assigne le row original au cRowx partagé dans ma form, donc les modifs dans cRowx seront faites dans cRow est ce bon docteur
    }
Commenter la réponse de olibara
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
0
Merci
Bien sur que c'est valide. Ton cRowx ne se qu'un pointeur vers le cRow de l'autre form, y'a pas de duplication de données.
Commenter la réponse de bubbathemaster
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
1
0
Merci
ah !
Quel plaisir de se retrouver avec des pointeurs comme dans le bon vieux C

Je suis déja au 3/4 de la solution de mon problème en ayant compris encore plein de choses au passage !

Un truc encore obcur (mais ca vient) c'est la declaration et l'usage des event handler dans l'exemple de Bidou

Bido, aurais tu la gentilesse d'expliquer pas a pas !!
Le comment et le pourquoi dans ton exemple ....

Je sais : quand on sais c'est pas facile d'expliquer a quelqu'un qui ne sait qu'une moité sans savoir laquelle !

Bon :

J'ai prix l'exemple de Bidou et j'ai adapté a ma situation
J'ai compris comment declarer un event et l'attacher a une fonction (enfin j'espere)
  public event AddAddrEventHandler Addr_Add;

Ici j'ai pas encore bien saisi ce que fait le delegate !
  public delegate void AddAddrEventHandler(DataGridViewRow cRow);

Ici 
1- Pourquoi tester si Addr_Add est null ?
2- J'ai pas encore bien compris la cuisine dans la form appelante
3- cRowx est un pointeur sur un element de la Form appellante mais il est declaré dans la form enfant ne risque-ton pas de le perdre au form close ?

    private void btn_add_Click(object sender, EventArgs e)
    {
      if (Addr_Add != null)
      {
        this.Addr_Add(cRowx);
      }
      this.Close(); // Puis on ferme la fenêtre
    }
Commenter la réponse de olibara
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
1
0
Merci
Bonjour

Encore une question

Dans le cas present on travaille par event et c'est tres bien, je vais apprendre a m'e servir.

Mais est-on obligé de travailler comme ca ?
Ne peux-on pas appeler une fonction d'une autre form ?
Commenter la réponse de olibara
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
1
0
Merci
Il y a toujours un truc que j'ai pas compris et ca marche pas

A priori j'ai reproduis la methode de bidou mais j'ai une erreur de compilation que je ne comprends pas

Dans ma forme modale je declare les event

  public partial class UpdData : Form
  {
    DataGridViewRow cRowx;
 
  public event AddAddrEventHandler Addr_Add;
  public delegate void AddAddrEventHandler(DataGridViewRow cRow);



....


    private void btn_add_Click(object sender, EventArgs e)
    {
      if (Addr_Add != null)
      {
        this.Addr_Add(cRowx);  // ET si j'ai bien compris je genere un event
      }
      this.Close(); // Puis on ferme la fenêtre
    }

Dans la form appelante j'essaye d'intercepter

    private void callEntry(int Index)
    {
      DataGridViewRow cRow = dgv_addr.Rows[Index];
      Form upd = new UpdData(cRow );
      upd.Addr_Add += new TestMysql.UpdData.AddAddrEventHandler(this.updData_Addr_Add);      
// Error 1 'System.Windows.Forms.Form' does not contain a definition for 'Addr_Add' and no extension method 'Addr_Add' accepting a first argument of type 'System.Windows.Forms.Form' could be found (are you missing a using directive or an assembly reference?) D:\projets\testMysql\TestMysql\MainForm.cs 347 8 TestMysql
      upd.ShowDialog();
    }

  private void updData_Addr_Add(DataGridViewRow cRow)
  {
     int a=1;
  }   
Commenter la réponse de olibara
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
0
Merci
Les pointeurs en C# n'existe pas, et c'est bien le but d'un langage managé.
Enfin, ils existent presque pas: on peut passer par du code unsafe (/unsafe à rajouter en ligne de commande lors de l'appel de csc) **non traité par le CLR** qui utilise la notion de pointeur; dans ce cas l'instruction qui permet d'indiquer qu'on a à faire à un pointeur est la même qu'en C à savoir une étoile (*).


Tes questions:
- On teste si Addr_Add est null pour savoir si l'appelant s'est enregistré auprès de l'event.
- C'est quoi la forme appelante? Une class génère un event, une autre s'abonne à cet event et le traite dans son event handler.
- cRowx n'est pas un pointeur.
- Non on est pas obligé de travailler avec des events, mais c'est une manière assez propre de signaler qu'un événement s'est produit.







<hr />
-My Blog-
Commenter la réponse de cs_Bidou
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
1
0
Merci
Merci bidou

MAIS

1- cRowx se comporte bien comme un pointeur (ou sens C de l'interpretation)
2- Je comprend bien la notion d'event sans etre habitué a les employer et les declarer (ca vient) mais dans le cas present je me demande si un appel explicite n'est pas plus simple pratiquement je ne genere pas un évenement mais je demande un action precise qui doit etre traitéee par une fonction de la form parent.
Mais je concoit que ce sont deux maniere de penser
Moi je pense Form Parent qui instancie une form enfant modal et qui attends qu'elle arrete de jouer
Toi tu pense Classe form qui genere un event et attends un auutre event
(jer me trompe ?)

Pour ce qui est du probleme de visibilité de l'event

Si je declare l'event static ca marche
Pourquoi chez toi tu n'a pas du le faire ? t'a des combines ?

 static public event AddAddrEventHandler Addr_Add;
  public delegate void AddAddrEventHandler(DataGridViewRow cRow);
Commenter la réponse de olibara
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
0
Merci
1) Je ne sias pas si c'est une bonne idée de penser en pointeur quand on travail en C#. A toi de voir si tu préfères comme ça, mais n'oublie pas qu'ils n'existent pas au niveau de ce langage.

2) Dans le cadre de cette source, je propose plusieurs façon de passer les paramètres. Pour le passage entre deux forms, je n'utilserais pas cette solution mais plutôt celle du constructeur.

Concernant l'event j'ai pas compris ton problème. En tout cas, il ne doit pas être static,c 'est un membre d'instance.
Bonne soirée!

<hr />
-My Blog-
Commenter la réponse de cs_Bidou
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
1
0
Merci
Bonsoir Bidou

J'emploie la solution du constructeur !!

Je passe a la form le DataGridViewRow qui m'interesse

Ce qui devient plus chaud et qui pourait faire l'objet de toute un débat c'est le retour apres mise ajour

Explication

Pour la mise a jour d'un DGV bindé et subsequement la DB on peut travailler avec les event du datagrid et laisser l'utilisateur se balader faire des modifs a gauche a droite.
J'ai opte pour une solution plus structurée :
1- Je charge le DGV
2- Je le met en Read Only
3- J'utilise l'event RowHeaderClick pour ouvrir une form de presentation d'un row du DGV et permettre a l'utilisateur de faire ses modifs avec 4 boutons : Delete Add Modify Cancel

AVANTAGE :
- controle et validation des donnée plus facile
- moins de gestion d'event
- Plus de facilité dans le design des champ de saisie (un combo qui peut se transformer en edit box et vice-versa)
- Facilité de reprendre un row existant pour le modifier et en faire un nouveau sans devoir se balader en bas du DGV

INCONVENIENTS
- passage de parametres entre les form
- pour creer un nouveau row il faut passer par la table du dataset

INCONNUE (label)
- Je cherche encore la solution du delete
Commenter la réponse de olibara
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
0
Merci
Le DataGridView est un Control assez compliqué et très complet.
J'ai un peu peur que tu sois actuellement en train de réinventer la roue. Essayes de lire plus de tutos et d'exemple avec ce Control, car tu peux faire énormément de chose (vérification des données, insert, update, delete "automatique" dans la DB), etc etc (c'est vraiment très très très complet).

<hr />
-My Blog-
Commenter la réponse de cs_Bidou
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
1
0
Merci
Oui je pense aussi que c'est tres complet mais metre a jour un tableau ou mettre a jour une form c'est deux approches différentes

Et comme il faut bien en choisir une ...
Differentes choses m'on fait pencher pour la form
- Pas necessaire d'aller en bas du tableau pour ajouter une row
- Facilité de reprendre les données d'une row pour les transformer et crer une nouvelle
- Facilité d'avoir des combo dans la form pour certains champs (localité code postal) plutot que dans le DGV

- je sais j'aurais pu faire un toolstrip click droit sur le dgv pour les options d'insert, delete copy/paste mais je sais pas tout apprendre d'un coup (ca fait 1 mois que je suis passé du C (le bon vieux pas ++) au C#
Ce sera la prochaine etape !!
Commenter la réponse de olibara