olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 2010
-
29 févr. 2008 à 10:45
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 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)
{
}
}
}
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 29 févr. 2008 à 11:46
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 ?
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 29 févr. 2008 à 12:13
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
}
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 29 févr. 2008 à 16:21
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
}
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 29 févr. 2008 à 17:34
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;
}
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 29 févr. 2008 à 18:04
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.
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 29 févr. 2008 à 19:21
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);
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 29 févr. 2008 à 19:55
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!
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 29 févr. 2008 à 21:04
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
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 29 févr. 2008 à 21:20
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).
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 29 févr. 2008 à 22:11
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 !!