Ajout ligne dans datagridview

Signaler
Messages postés
8
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006
-
Messages postés
8
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006
-
bonjour,
ça doit être une question récurrente, mais comment fait-on pour programmatiquement ajouter une ligne à une datagridview qui est liée à une db ?

J'ai ajouté une datasource, fais un drag&drop dans une form et ça m'a crée automatiquement datagridview, dataset, tableadapter, bindingnavigator, etc.
J'ai essayé de manipuler directemment le datagridview, le dataset, le tableadapter.

Rien ne marche. Les lignes n'apparaissent pas.
Alors qu'un click sur le + du binding navigator m'ajoute immédiatement une ligne.
La seule chose qui marche, c'est un sql insert puis un refresh ( fill du tableadapter ).

Or je veux faire le contraire:
Je veux remplir le datagridview et à la fin sauvegarder mes lignes insérées.

Merci d'avance.

PS: je comprends pas que ce soit si compliqué à manipuler.
Faire une listview et flusher dans une db les rows me poseraient bien moins de pb.

8 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,
Je ne sais pas exactement ce que tu veux faire, mais si ton dataGridView est bindé avec un dataSet (comme c'est très souvent le cas) alors tu peux appeler la méthode NewRow() de la DataTable qui t'intéresse pour créer une nouvelle ligne (ça renvoie un DataRow si je me trompe pas).


<HR>

[Pub]
http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]

C# forever
/infomsg/auteurdetail.aspx?ID=13319
Messages postés
8
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

top délire!!!!!!!!!!!!!!!!!!
je viens de comprendre. ( enfin presque ).

C'est exactement ce que j'avais fais et ça ne fonctionnait pas:
Mon code était dans form load et ne générait pas d''erreur, ni d'exception....

testdb.testdbDataSet.mytableRow dr = ( testdb.testdbDataSet.mytableRow)this.testdbDataSet.mytable.NewRow();
dr[1]= "a";
dr[2] = "b";
this.testdbDataSet.mytable.AddmytableRow(dr);


J'ai alors crée un bouton, qui rappelle ce code.
Alors j'ai eu une exception m'indiquant que la colonne 0 ne pouvait pas être nulle.

J'ai rajouté dr[0] =
new System.
Guid() et maintenant ça marche.

Si je vous disais combien d'heures j'ai passé rien que pour ça, plus personne n'écrirait que .net est super productif :-)
Enfin bref, c'est quand même bien...
C'est étonnant que ça n'ait pas levé d'exception dans le form_load.
Messages postés
8
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

j'ai encore creusé un peu plus.

En fait si je protège mon code dans un try catch, ça me génère bien une exception.
Par contre si je ne protège pas par un try catch, dans le form load, l'exception est catchée sans afficher aucune erreur ou faire un throw.

En gros, l'erreur est complètement ignorée sans le mécanisme classique des first chance et second chance exception.
Il doit y avoir derrière le form load un try catch qui ne fait rien dans le catch.

A+ pour de nouvelles aventures.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,
Je ne sais pas exactement ce que tu fais comme manipulation de ton programme (pas assez de code) mais je dois avouer que je n'ai pas vraiment compris ton explication dans le dernier poste.
Pour ce qui est de l'exception, elle vient éventuellement du fait que par défaut le dataSet n'accepte pas de valeur null (or c'est ce qui se passe chez toi étant donné que tu ne spécifie pas la valeur de la première colonne [ pas de dr[0] = ... ] ).
Pour corriger ceci, tu peux faire :



DataColumn dc =
new
DataColumn();
dc.AllowDBNull =
true;

dc étant bien entendu la colonne où tu ne spécifie aucune valeur.


<HR>
/auteurdetail.aspx?ID=13319[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Petite précision pendant que j'y suis. Tu peux aussi utiliser la property DefaultValue pour spécifier des valeurs par défaut quand tu ne les rentres pas :



DataColumn dc =
new
DataColumn();
dc.AllowDBNull =
true;
dc.DefaultValue =
"salut";

Voilà ! A+


<HR>
/auteurdetail.aspx?ID=13319[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319
Messages postés
8
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

Salut Bidou,

merci de ton aide.
Tu vas très vite comprendre ce qui s'est passé:

Crée un nouveau projet de type windows app. Crée un bouton et met ce code:
private void button1_Click(object sender, EventArgs e)
{
int a = 0;
int val = 4 / a;
}

Tu t'attends à quoi?
Réponse : Ton programme plante avec une Exception divide by zero.
Normal non? Au moins tu sais que tu as un problème à corriger.

Maintenant met le même code dans le form load:
private void Form1_Load(object sender, EventArgs e)
{
int a = 0;
int val = 4 / a;
}
Et là, stupeur, il ne se passe rien !!!!!!!!!!!!!!!!!!!!!!!!!!!!

C'est ce qui s'est passé dans la manipulation de mon datagridview, une erreur due à une colonne qui ne devait pas être vide et aucun plantage ou erreur pour m'aiguiller.
Je pensais simplement que je n'utilisais pas la bonne méthode.
J'ai passé des heures... à chercher mon problème, pour en désespoir de cause poser la question sur un forum.

Maintenant bien sûr, si j'avais fais un try catch j'aurais tout de suite sû...

Sinon effectivement, c'était un pb de dr[0] qui ne pouvait pas être nul.
... mais pour le savoir, j'avais besoin qu'une erreur soit levée pour m'indiquer un éventuel pb.

A+ et merci d'avoir cherché à m'aiguiller sur la bonne piste.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Quand j'ai lu ce que tu as écrit, j'étais sur que c'était pas possible, mais j'ai quand même testé (bon ok, tu m'as mis un doute ). Si je mets :

int a = 0;

int val = 4 / a;

dans le load, j'ai bien entendu une exception (attempted to divide by zero) qui est levée.

Si tu n'as pas d'erreur, c'est qu'elle catchée ailleurs dans ton programme, avant que le main (c'est à dire le framework) se charge de la prendre en main pour toi !


<HR>
/auteurdetail.aspx?ID=13319[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319
Messages postés
8
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

Ok, merci pour l'info.
J'ai eu confirmation par une autre source que ce pb survient uniquement en 64 bit.
C'est lié à une nouveauté du kernel 64 bit et la façon de gérer les exceptions.
Ce ne sera pas fixé.
En fait le pb survient uniquement dans Visual studio en mode debug.
Car Winform ne lance pas Form_load de la même manière dans un debugger ou hors debugger.
Il appelle dans un cas une fonction qui a un try catch et dans l'autre cas une autre fonction qui n'en a pas.
L'exception n'est alors pas levée et catchée ailleurs.
C'est la que survient le pb.
Du à une nouveauté du kernel 64 bit, une manip interdite fait que le kernel retire alors l'exception et supprime sa stackframe associée.

Donc pb mineur, limite cosmétique uniquement dans vs en mode debug sur 64 bit, les exceptions générées dans nu form load sont ignorées.

A+