Contenu de datagridview checkbox dans textbox

Signaler
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007
-
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
-
Je viens de tester un code, j ai pas d erreur mais pas de résultat!
En fait j ai un form découpé en 2 Container découpés en Panel
Sur le container1 Panel 2 j ai un datagridview avec en derniere colonne un checkbox!
et en dessous des textbox!
j aimerai que quand je coche une ligne, les éléments de cette ligne apparaissent dans mes textbox afin de pouvoir modifier si nécessaie les éléments!!!

docn voila mon code~, mais je pense que c est lié aussi à la présence de Panel, j ai du mal à gérer ceux ci!!!

private



void
dataGridView1_CellContentClick(

object
sender,

DataGridViewCellEventArgs
e){
         


if
(e.RowIndex > -1 && dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[e.ColumnIndex] 



                                                                  is
 

 DataGridViewCheckBoxCell
)          {
                       textBox3.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[


"LOGIN"
].Value.ToString();
                        textBox4.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[

"PASSWORD"
].Value.ToString();
                        textBox1.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[

"NAME"
].Value.ToString();
                         textBox2.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[

"FIRSTNAME"
].Value.ToString();
           }
}

Merci
Sabine

19 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
Salut

Tu es sure que ca rentre bien dans ton if ?
Met un point d'arret et vas-y en pas a pas, pour voir ce que ca donne.

Mx
MVP C# 
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

EUh, j aimerai bien mais je sais pas le faire!
et c'est pas ed la volonté qui me manque mais j'ai pas encore appris le débuggage pas à pas... je m autoforme et c'est pas trop ça encore ;-)
J'ai posé un point d arret au niveau du "private void" et apres j ai fais F5 et là ca donne rien, qunad je clique sur F5, ca me lance mon form mais aucune réaction du point d arret quand je coche ou clique sur une cellule du datagridview, meme pas de fleche jaune, rien!!!


je sais pas si je m y prends bien!

Sab
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
Sisi, tu t'y prends bien.
Tu peux mettre un point d'arret sur plusieurs lignes. A ta place, j'en mettrais un sur le if.
Ensuite lance ton appli normalement avec F5, et fais ce que tu dois faire avec. Si ca ne s'arrete jamais, c'est que ca ne passe pas dans ta méthode.
Une fois ton code sur le point d'arret, tu peux voir l'état de tes variables en passant ton curseur dessus (et d'autres options avec le clic droit). Tu peux aussi changer les valeurs de tes variables pendant le debug. Ensuite, tu peux continuer d'éxecuter ton code ligne par ligne avec la touche F11 (ou F10, cas un peu plus particulier)

Enfin bref, pour en revenir a ce que tu dis, si ca ne s'arrete pas alors que tu as mis un point d'arret au niveau de la définition de ta méthode, alors c'est qu'elle n'est jamais appelée.
Tu t'es bien inscrite à l'evenement CellContentClick ? (et non pas simplement copié/collé la méthode ?)

Mx
MVP C# 
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

Ahoui en effet , t as bien fais de me le demander, à force de supprimer , remettre, l évènement CellContentClick n'était pas inscrit, et pourtant j avais cliqué sur le datagridview pour l 'écrire, mais après je l'avais supprimé pensant ne pas etre ca... bref...
il me dit que mon erreur est que le nom de la colonne "LOGIN" n existe pas! Pour moi "LOGIN" est le headertext, alors j ai remplacé par lOGINDataGridViewTextBoxColumn.HeaderText et j'ai le meme erreur!

Pourtant dans des exemples du net les gens mettent le textHeader

ne faut il pas plutot un integer???

Sabine
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
En fait c'est le nom de la colonne que tu dois mettre. Donc dans tont cas "lOGINDataGridViewTextBoxColumn".
Tu peux aussi mettre un entier... Mais gaffe si tu changes l'ordre de tes colonnes par la suite ;)

Mx
MVP C# 
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

C'est bon ca marche, j ai mis le numero de la colonne plutot!!!
par contre je doute sur la logique de mettre à jour des champs!
Voici mon pb:

Quand je coche une ligne, j ai donc maintenant mes infos qui vont dans des textbox!
de là je peux les modifier, et apres je veux cliquer sur un bouton "UPDATE" qui me modifie mes infos dans la base de données et dans le datagrid view!

pour le datagridview j ai pas encore réfléchis mais pour la base de données, je vois bien faire un champ caché qui récupère aussi le login par exmple comme ca je ferai le UPDATE .... WHERE login="ce login caché"!
est ce que ca parait bon???
y a t il plus simple???

merci

Sabine
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
Je peux pas vraiment te dire si c'est bon ou pas, sachant que je ne connais pas ton appli. Mais dans la logique, tu peux tout a fait faire comme ca oui.

Mais, que fais tu si l'utilisateur Check plusieurs lignes ? (sachant, si j'ai bien compris, que tu met dans les textboxs les valeurs de la derniere ligne checkée)

Mx
MVP C# 
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

Ma logique était bonne, mon Update marche bien! cool!


Si l'utilisateur check plusieurs user , alors c'est le dernier coché qui apparait! de toute maniere les textbox servent pour modifier le user, donc se fait en cochant un user à la fois!
par contre quand je coche un user, son nom s affiche dans textbox, puis si je coche un 2ieme user, le nom de celui prend la place du premier! si je viens à déocher le premier, son nom revient alors dans le textbox.... et ça je veux pas, je veux seuleument qu apparaissent dans les textbox les infos d un user seulement coché!!!

J aimerai aussi que si je décoche tout, il n y ait plus rien dans les textbox!!!

voici mon code:


private
void dataGridView1_CellContentClick_1(
object sender,
DataGridViewCellEventArgs e)
{
            
if (e.RowIndex > -1 && dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]
is 

                        DataGridViewCheckBoxCell)
            {
                        textBox3.Text = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
                        textBox5.Text = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
                        textBox4.Text = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
                        textBox1.Text = dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();
                        textBox2.Text = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();
               }
 }

Il me faut rajouter dans mon if quelque chose comme:
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].value != null
mais ca ca marche pas!!! ca change rien

as tu une idée???
merci!

Sabine
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
En fait je pense que de devoir cocher une case pour choisir l'utilisateur a modifier n'est pas la bonne idée.
Parce que dans le comportement que tu décris, ton utilisateur peut cocher plusieurs lignes, mais seules les valeurs de la derniere ligne cliquée apparaissent. Ce qui produit le comportement que tu décris : Si l'utilisateur décoche une ligne, les valeurs de cette ligne apparaissent quand meme (evenement CellContentClick). Pour eviter ca, il faudrait que dans ton if tu vérifies si la ligne cliquée est cochée ou décochée.
Mais que se passe-t-il si l'utilisateur coche plusieur lignes, puis decoche la derniere ligne qu'il a coché ? Tu vas mettre quelles valeurs dans tes TextBox ? Celle de l'avant derniere ligne cochée ? (ce qui veut dire que tu vas devoir te rappeler dans l'ordre toutes les lignes qui ont été cochées). Ou aucune valeur ?(ce qui serait illogique, puisque tu auras encore plein de lignes cochées).

Plutot que de devoir cocher une ligne pour pouvoir modifier des valeurs, pourquoi ne pas simplement permettre a ton utilisateur de selectionner la ligne pas un simple clic (tu mets simplement la ligne selectionnée dans une autre couleur). De cette facon, tu n'as plus que zéro ou une seule ligne selectionnée a un instant t. -> Plus logique et facile a comprendre pour ton utilisateur.
Ca ne demande pas beaucoup de modifications dans ton code (tu as juste a t'inscrire a l'evenement CellClick plutot que CellContentClick et mettre en couleur la ligne qui contient la cellule cliquée, le DataGridiew a tout ce qu'il faut pour ca)

Cependant, tes CheckBox sont toujours valables pour la suppression de plusieurs utilisateurs a la fois ;)

Mx
MVP C# 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
Ou alors, pour que ce soit encore plus clair pour l'utilisateur, tu mets une colonne Bouton (DataGridViewButtonColumn) avec entete "Modifier", et lors du clic sur ce bouton (toujours via l'evenement CellContentClick) tes valeurs s'affichent dans les TextBox.

Mx
MVP C# 
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

Ok, oui tu as raison, ce sera beacoup plus simple à la compréhension!
Je vais donc m attaquer à mettre un datagridviewbuttoncolumn à la place!!!
Merci pour tes indications


Sabine
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

ça y est j'ai une question ;-)
comment fais tu pour mettre un nom sur le bouton du datagriview?
parceque buttonDGV.text="action"; ça marche pas!!!!

et aussi comment fais t on pour que quand je compile et execute le dimensionnement de la fenetre prenne tout l ecran et que je sois pas constament obligée à agrandir la fenetre?

Et aussi je me demandais comment j allais faire pour faire de mon application un site web???

voilà les questions qui me traversent l esprit aujourd hui ;-)

Merci

Sabine 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
En fait, tu ne peux pas afficher de libellé directement sur le bouton, il faut mettre le libellé de l'action en entete de la colonne.

Pour le redimensionnement, tu as la propriété WindowState de ta Form, qu'il faut mettre a Maximized.

Par contre... Tu ne peux pas passer ton application Winform en site web ! Le developpement web est différent, meme si le "codebehind" est du C#, ca reste du dev web, et donc de l'ASP.Net .
Tu devais vraiment faire une application web ? Parce qu'a ce moment la il va falloir refaire pas mal de choses :/ (la plupart de tes methodes en C# resteront valables je suppose, mais il va falloir refaire l'interface, remplacer ton DataGridView par un GridView, etc.)

Et pour tout ca, il va surtout falloir poser les questions sur le forum d'aspfr. Ici on traite du C# "general" et developpement Windows.

Mx
MVP C# 
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

Ah super, oui je devais faire un site web mais vu que je m autoforme j en savais rien! et bien heureusement que je et pose la question maintenant!!!lol

SInon j ai trouvé comment mettre le nom sur le bouton : c est la propriété "UseColumnTextForButtonValue" qu il faut mettre à True!!!

Bon et bien merci je vais desuite voir ASP .NET

Sabine
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
J'étais complétement passé a coté de cette propriété
Bon voyage chez aspfr !

Mx
MVP C# 
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

Une dernière petite question avant mon voyage: ;-)

Maintenant que j ai un bouton à la place de mon checkbox je sais pas trop comment dire que je veux supprimer la ligne du bouton oú je clique.
voici mon erreur :
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
voici mon code:

private
void dataGridView1_CellContentClick_1(
object sender,
DataGridViewCellEventArgs e)
{
         
if (buttonok.Text ==
"Delete")
         {
               
DataConnection m =
new
DataConnection();
               
OracleConnection conn =
null;
               conn = m.DoConnection();
               
try
               {
                        
DataGridViewRow row =
new
DataGridViewRow();
                        
OracleCommand cmd = conn.CreateCommand();
                        
OracleCommand cmd2 = conn.CreateCommand();
                        cmd.CommandText =
"DELETE FROM user_mpl where login=:parm1 and password=:parm2";
                        
cmd2.CommandText =
"COMMIT";
                        

OracleParameter myParameter1 =
new
OracleParameter(
":parm1",
OracleType.VarChar, 30);
myParameter1.Value = row.Cells[0].Value;

OracleParameter myParameter2 =
new
OracleParameter(
":parm2",
OracleType.VarChar, 30);
myParameter2.Value = row.Cells[1].Value;

cmd.Parameters.Add(myParameter1);
cmd.Parameters.Add(myParameter2);

cmd.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
cmd.Dispose();
cmd =
null;
cmd2.Dispose();
cmd2 =
null;

dataGridView1.Refresh();
}
................. (catch, try, else....)
}

Encore merci pour tout
Sab
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
Salut,

Dans ton parametre DataGridViewCellEventArgs passé avec la fonction, tu as 2 propriétés : ColumnIndex et RowIndex. 
Il faut donc que tu remplaces ton if (button.Text == "Delete") par un if qui verifie que :
   e.ColumnIndex != -1
et que
    tonDataGridView.Columns[e.ColumnIndex].Name == leNomDeTaColonneDelete
Une fois dans le if, tu peux recuperer la ligne cliquée via : tonDataGridView.Rows[e.RowIndex]

Mais je sais pas si tout ceci te servira en developpement web ;)

Hésite pas a revenir ici si jamais tu as quand meme des questions de C# "pur"

Mx
MVP C# 
Messages postés
84
Date d'inscription
jeudi 1 mars 2007
Statut
Membre
Dernière intervention
22 juin 2007

Là je nage complet, je sais pas comment faire!
Je comprends pourquoi ce que j ai déjà fais ne peut pas etre réutilisé!!!
bref en tout cas`je reviendrai poser des petites questions, ça c'est sur... ;-)
a bientot

Encore merci
Sabine
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
Le developpement web est très différent du developpement Windows (code qui s'execute du coté du serveur, gestion de la mémoire et interactions avec l'interface différentes, etc.)
Cependant, tes algorithmes seront les memes, ta méthode d'acces au données sera identique, tu pourra conserver tes requetes (et donc par exemple, tout le code qui se trouve dans ton CellContentClick). Faudra surtout reecrire tout l'interface, adapter certaines choses, ... Mais ca ne fait aucun doute que nos amis d'aspfr sauront bien te guider ;)

Mx
MVP C#