La référence d'objet n'est pas définie à une instance d'un objet

Fermé
Th3Rimas - Modifié par baladur13 le 30/03/2016 à 11:06
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 31 mars 2016 à 13:57
bonjour,
je développe une application sur Ado.net et j'utilise la technologie ADO( le mode deconnecté et Link TO Sql) et j'ai rencontré un problème : "la référence d'objet n'est pas définie à une instance d'un objet"
voilà le code que j'ai ecrit:
 //========================Enregistrer des lignes de commande dans la table detail
            for (int i = 0; i <= dataGridView1.Rows.Count - 1; ++i)
            {
                detail d = new detail();
                d.NumCom = textBox1.Text;
                d.codeart = dataGridView1.Rows[i].Cells[0].Value.ToString();
                d.Qte = int.Parse(dataGridView1.Rows[i].Cells[3].Value.ToString());
                l.details.InsertOnSubmit(d);

le message s'affiche au niveau de ce ligne là:
--->> d.codeart = dataGridView1.Rows[i].Cells[0].Value.ToString();
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

3 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié par Whismeril le 30/03/2016 à 10:46
Bonjour

tout d'abord, c'est bien domage d'utiliser linq et de construire ta collection "à la main".
Intéresse toi au binding.
https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource

Le message d'erreur en lui même, veut dire qu'au moins un objet de la ligne vaut null (donc n'est pas définit)

Dans
d.codeart = dataGridView1.Rows[i].Cells[0].Value.ToString();

dataGridView1.Rows[i] doit exister au vu de ta boucle
Donc soit
  • la collection de Cells n'est pas initialisée (normalement si)
  • soit elle est vide, il n'y a donc pas de Cells[0] dans la collection (théoriquement ça n'est pas possible non plus)
  • Soit il n'y a rien d'écrit dans la cellule et donc Value est null (probablement ça), et dans ce cas le binding l'aurait traité à ta place....


Pour savoir précisémement ou se situe le problème, quand le programme plante, survolle la ligne avec la souris et attends à chauqe élément se que t'indique l'info bulle. Si ça n'est pas assez parlant, espionne chaque partie
dataGridView1.Rows[i]
dataGridView1.Rows[i].Cells[0]
dataGridView1.Rows[i].Cells[0].Value

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Th3Rimas Messages postés 12 Date d'inscription mardi 29 mars 2016 Statut Membre Dernière intervention 2 mai 2016
30 mars 2016 à 11:47
j'ai changer le code depuis cela :
d.codeart = dataGridView1.Rows[i].Cells[0].Value.ToString();
Au :
d.codeart = dataGridView1.Rows[i].Cells[0].ToString();
mais j'avais le meme probleme au 2eme ligne et je l'ai changer comme celui la mais un autre problem :
d.Qte = int.Parse(dataGridView1.Rows[i].Cells[3].ToString());
il m'a dit que le format de la chaine d'entre est incorrect
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
30 mars 2016 à 11:54
Même chose si la cellule est vide, tu ne peux pas faire un int à partir d'une valeur null.
Là encore, le binding gérerait ça à ta place.

Je trouve toujours inutile de disposer d'outils performants et de ne pas s'en servir.....
0
Th3Rimas Messages postés 12 Date d'inscription mardi 29 mars 2016 Statut Membre Dernière intervention 2 mai 2016 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
30 mars 2016 à 12:02
qu'est ce que je dois faire alors ?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
30 mars 2016 à 12:32
Ben tu,pourrais lire des tutos sur le binding, en commençant par celui que je t'ai mis plus haut.

Sinon vérifier que les cellules ne soient pas vides avant de tenter des affectations ou des conversions, avec un if sur Value, ou une fusion null https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator ou un opérateur ternaire https://docs.microsoft.com/fr-fr/dotnet/csharp/language-reference/operators/conditional-operator

Sinon tu peux aussi faire TryParse, mais tu devras aussi faire un if dessus
0
Th3Rimas Messages postés 12 Date d'inscription mardi 29 mars 2016 Statut Membre Dernière intervention 2 mai 2016
31 mars 2016 à 09:49
qu'est ce que je dois metter en code svp
0
Th3Rimas Messages postés 12 Date d'inscription mardi 29 mars 2016 Statut Membre Dernière intervention 2 mai 2016
31 mars 2016 à 12:35
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
31 mars 2016 à 13:57
Ça ne répond pas à ma question, dans le commentaire numéro 6, je t'ai proposé 4 façons de faire, laquelle veux tu que je te montre?
Je ne redemanderai pas une fois de plus.
0