IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

(encore.) référence objet non définie à une instance d'objet.


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut (encore.) référence objet non définie à une instance d'objet.
    bonsoir à tous,
    je sais je sais ,encore un pauvre type qui ne comprend pas que ce problème a été posté des milliers de fois

    Oui mais voilà, j'y arrive toujours pas, et vu la complexité (pour un débutant) de mon code, je n'arrive pas à comprendre pourquoi ça ne marche pas...

    Alors le topo de mon appli vite fait (façon de parler ):

    mon appli :
    • 1 datagridview "dataGridView3" contient 2 colonnes de données (dates et prix);
    • 1 graphique ChartFX qui lie en boucle le DGV3 (toutes les rows) et affiches des jolis points ;
    • Seulement suite à un changement de plan, je vais créer un nouveau datagridview nommé "dataGridViewInvis" qui contiendra les prix et dates du datagridview3 mais pour un mois d'une année donnée (via combobox).


    Avant tout marchait niquel, mais quand j'ai créer mon nouveau DGV, comme tous les autres, drag and drop sur ma form, je la place, je vais dans propriétés : visible = false, et je change dans mon code du graph:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    private void CreerGraphique()
            {              
                //On récupère les variables utiles au graph            
                int num = dataGridViewInvis.RowCount;   //avant: int num = dataGridView3.RowCount;
                double ymax = 0;
                
                #region ParamCGraph            
                #endregion            
                                     
                //boucle de lecture des lignes du datagridview pour la définition des points
                for (int i = num - 1; i >= 0; )
                {                
                    string date = (string)dataGridViewInvis.Rows[i].Cells[0].Value.ToString();   //avant: dataGridView3
                    double prix = (double)dataGridView3.Rows[i].Cells[1].Value;        //avant: dataGridView3        
    
                    CGraph.Value[0, i] = prix;
                    CGraph.Legend[i] = date;
                    i--;
                    
                    //mise à jour de la valeur max pour une optimisation de la vision du tableau
                    if (prix > ymax)
                    {
                        ymax = (prix + ((20/100)*prix));
                        CGraph.AxisY.Max = ymax;
                    }
                }
    
                //fermeture des données du graph
                CGraph.CloseData(COD.Values);
                CGraph.RecalcScale();
            }
    Et j'ai l'erreur là.
    Alors j'ai fouillé: google, faq, forums, msdn, et je sais que le problème apparement c'est que mon datagridview "Invis" n'est pas créé (mais instancié, c'est ça?)

    Et donc j'ai regardé le code Designer, et tout le code correspondant à dataGridViewInvis est pareil que les autres dont le datagridview3 initialement à sa place. No comprendo!

    Quelqu'un pourrait m'aider et m'expliquer svp?
    Merci d'avance!
    Défenseur de l'Apéro Social

  2. #2
    Membre extrêmement actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Points : 1 173
    Points
    1 173
    Par défaut
    Cette erreur signifie que tu essayes d'accéder à un objet qui n'a pas encore été instancié! sur quelle ligne le code bug?

  3. #3
    Membre extrêmement actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Points : 1 173
    Points
    1 173
    Par défaut
    double prix = (double)dataGridView3.Rows[i].Cells[1].Value;

  4. #4
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    le code bug sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     string date = (string)dataGridViewInvis.Rows[i].Cells[0].Value.ToString();
    Et je n'ai pas changé la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double prix = (double)dataGridView3.Rows[i].Cells[1].Value;
    car si la première ne marche pas la 2e non plus... (pour être sûre j'ai quand même testé...).

    Cette erreur signifie que tu essayes d'accéder à un objet qui n'a pas encore été instancié!
    Oui, mais l'objet c'est bien mon datagridview "dataGridViewInvis"? Pourtant pour l'instancier, un drag and drop suffit non? Dans mon application j'ai en tout sans celui là 4 DatagridView, et jamais eut de problèmes! Je le drop sur la form tout simplement, et je fais comme j'ai fait avec le "Invis", je balance des données dessus, et là pourquoi il me sort cette erreur?

    Pour le problème de non instanciation, j'ai ajouté tout au début de mon code:
    DataGridView dataGridViewInvis = new DataGridView
    , rien...puis j'ai copié collé cette ligne dans ma méthode (le code que j'ai mis en premier post), rien... et dans le designer le datagridview est bien présent partout!

    Pouvez vous m'expliquer?
    Défenseur de l'Apéro Social

  5. #5
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Je suis pas un expert en c#, mais il manque pas quelque chose dans la déclaration de ta boucle ?

    ...Une décrémentation de variable i, par exemple ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int i = num - 1; i >= 0; )

  6. #6
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Kelpan Voir le message
    Je suis pas un expert en c#, mais il manque pas quelque chose dans la déclaration de ta boucle ?

    ...Une décrémentation de variable i, par exemple ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int i = num - 1; i >= 0; )
    non l'incrémentation est dans le code à la fin, ça ne change rien.
    Défenseur de l'Apéro Social

  7. #7
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    je parle d'une décrémentation pas d'une incrémentation. c'est ce que tu veux faire non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = num - 1; i >= 0; i-- )



    Apprament ton DataGridView est instancié sinon , tu aurais eu l'exeption sur cette ligne. C'est pour ça que je pense que ton erreur vient d'autre chose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //On récupère les variables utiles au graph            
    int num = dataGridViewInvis.RowCount;   //avant: int num = dataGridView3.RowCount;

  8. #8
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Kelpan Voir le message
    je parle d'une décrémentation pas d'une incrémentation. c'est ce que tu veux faire non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = num - 1; i >= 0; i-- )


    Oui pardon, je me suis trompé dans le terme, car avant j'utilisais une incrémentation, mais maintenant je lis à l'envers le DGV, pardon, autant pour moi.

    Citation Envoyé par Kelpan Voir le message
    Apprament ton DataGridView est instancié sinon , tu aurais eu l'exeption sur cette ligne. C'est pour ça que je pense que ton erreur vient d'autre chose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //On récupère les variables utiles au graph            
    int num = dataGridViewInvis.RowCount;   //avant: int num = dataGridView3.RowCount;
    Je suis entièrement d'accord...je ne comprends pas, pourquoi c'est dans ma boucle qu'il ne trouve pas mon datagrifview...et là j'ai du faire deux pauses cafés, car je p**e un cable là dessus...

    Tu n'aurais pas une idée d'ou ça pourrait venir?
    Ce qui est bizarre c'est que mon DGV"Invis" a été drag'n'drop, comme tous les autres, il apparait partout dans mon designer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    private void InitializeComponent()
            {
     //...
    this.dataGridViewInvis = new System.Windows.Forms.DataGridView();
     
    //...
     
    // 
                // dataGridViewInvis
                // 
                this.dataGridViewInvis.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                this.dataGridViewInvis.Location = new System.Drawing.Point(113, 411);
                this.dataGridViewInvis.Name = "dataGridViewInvis";
                this.dataGridViewInvis.Size = new System.Drawing.Size(240, 150);
                this.dataGridViewInvis.TabIndex = 27;
                this.dataGridViewInvis.Visible = false;
     
    //...
    // 
    // Form1
    // 
     
    //...
     
    this.tabPage1.PerformLayout();
                ((System.ComponentModel.ISupportInitialize)(this.dataGridViewInvis)).EndInit();
                this.toolStrip2.ResumeLayout(false);
                this.toolStrip2.PerformLayout();
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView3)).EndInit();
                this.tabControl1.ResumeLayout(false);
                this.toolStrip1.ResumeLayout(false);
                this.toolStrip1.PerformLayout();
    Ah je viens de trouver un truc bizarre.. je m'explique:
    Ce que je vous ai expliqué se passe dans un tabcontrol, dans le premier onglet pour être précis. Dans cet onglet on trouve la dataGridView3, un toolstrip, un graph ChartFX et mon dataGridViewInvis positionné sur le graph en visible = false.

    Mais dans le designer voilà le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    this.tabPage1.SuspendLayout();
                ((System.ComponentModel.ISupportInitialize)(this.dataGridViewInvis)).BeginInit();
                this.toolStrip2.SuspendLayout();
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView3)).BeginInit();
    Les lignes sont-elles liées? Enfin je suis pas sure que ce soit anormal...

    Voilà, je vous ai mis toutes les lignes relatant mon DGV"Invis"... si vous trouvez quelque chose de louche...
    Défenseur de l'Apéro Social

  9. #9
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                for (int i = num - 1; i >= 0; )
                ...
                i--;
    ah ok, j'avais pas vu le 'i--;' , un peu plus loin
    C'est une façon de procéder qui m'étonne quand même !! , le while n'aurait pas été plus adapté ?

    Etant donnée que la ligne ou tu va chercher le nombre de lignes de ta DataGridView ne plante pas, je suppose que ton DataGridView est bien instancié...

    Tu nous dis que la ligne suivante provoque le message d'erreur 'object non instancié.'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string date = (string)dataGridViewInvis.Rows[i].Cells[0].Value.ToString();   //avant: dataGridView3
    dataGridViewInvis <- On a pu faire le rowCount, donc une instance existe...
    .Rows[i] <- tu aurais eu une exception OutOfOrder ...
    .Cells[0] <- tu aurais eu une exception OutOfOrder aussi ...
    .Value <- Une valeur à null peut être pourrait expliquer le plantage (à vérifier si c'est possible)

    donc à part un part une propriété Value à null, je ne vois pas d'autre explication (sauf, si les informations que tu nous donnes sont erronées...)

    EDIT :

    tu as quelque chose dans cette partie ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #region ParamCGraph 
    #endregion

  10. #10
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #region ParamCGraph 
    #endregion
    il y a juste les paramètres du graphiques relatifs à la librairie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CGraph.ToolBar = true;
                CGraph.Gallery = Gallery.Bar;
                CGraph.Border = true;
                CGraph.Chart3D = false;
                CGraph.Grid = ChartGrid.Horz | ChartGrid.Vert;
                CGraph.AxisY.Max = ymax;
                CGraph.AxisY.Min = 0;
                CGraph.OpenData(COD.Values, 1, num);
                CGraph.PointLabels = true;
                CGraph.Gallery = Gallery.Area;
                CGraph.PointLabelColor = Color.Black;
    Donc pas de rapport avec le problème.
    Pour le "i--", c'est juste qu'avant il y avait 2 variables, une incrémentant et l'autre décrémentant, une est partie quand j'ai abandonné une partie de mon idée.

    Donc on est d'accord, mon datagridViewInvis doit etre instancié, car la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int num = dataGridViewInvis.RowCount;
    marche...
    bon je suis pas fou quand même, voilà le débogueur:
    Nom : Sans titre.JPG
Affichages : 135
Taille : 144,6 Ko

    Je vois pas ce qui me manque...
    Défenseur de l'Apéro Social

  11. #11
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    ok, mais rien n'indique que c'est le DataGridView qui est null !!

    essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if !(dataGridViewInvis.Rows[i].Cells[0].Value == null) {
        string date = (string)dataGridViewInvis.Rows[i].Cells[0].Value.ToString();
    }
    ... je suis pas sur de la syntaxe c# ... (je suis plus VB, désolé)

  12. #12
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Merci Kelpan pour ton soutien à cette quête à l'erreur!

    Alors depuis quelques instants j'ai fait plein de tests;
    conclusion: la datagridview n'est pas vide, en effet il affiche bel et bien les valeurs. Pour éviter l'affichage de l'erreur initiale j'ai fait un try catch sur ma boucle.

    Je viens d'essayer ta solution, ça fait pareil, à part que ça me met quand même la valeur sur la graph! Belle avancée :p . Bon je sais pas pourquoi j'ai deux points sur le graph et que le 2e est toujours = 0...

    Je vais creuser du côté de ce que tu m'a dit avec les .Value et les .Value.ToString()!

    Merci déjà!
    Défenseur de l'Apéro Social

  13. #13
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Quelqu'un m'expliquera... j'ai copié collé le datagridview3 qui marchait à merveille, me voilà donc avec un datagridview2 (pas 4 non, 2, je suis comme ça moi ), je remplace tous les dataGridViewInvis par dataGridView2...ça marche... je suis sur le c*l...

    Je n'ai rien changé d'autre! J'ai même enlever ton if Kelpan... j'ai laissé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string date = (string)dataGridView2.Rows[i].Cells[0].Value.ToString();
    sur le principe que avant ça marchait pourquoi maintenant sur le meme principe ça ça devrait changer...

    Et voilà problème résolu sans vraiment comprendre... voilà mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    for (int i = num - 1; i >= 0;i--)
                    {
                        try
                        {                      
                            string date = (string)dataGridView2.Rows[i].Cells[0].Value.ToString();
                            double prix = (double)dataGridView2.Rows[i].Cells[1].Value;
     
                            CGraph.Value[0, i] = prix;
                            CGraph.Legend[i] = date;
     
                            //mise à jour de la valeur max pour une optimisation de la vision du tableau
                            if (prix > ymax)
                            {
                                ymax = Convert.ToInt32(prix) + 30;
                                CGraph.AxisY.Max = ymax;
                            }
                        }
                        catch { }
                        //fermeture des données du graph
                        CGraph.CloseData(COD.Values);
                        CGraph.RecalcScale();
                    }
    Merci beaucoup à Kelpan pour son aide.
    Défenseur de l'Apéro Social

  14. #14
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    euh ! t'es sur que c'est pas ton catch vide qui masque l'erreur ?

  15. #15
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Bah ... lol, je sais pas , mais ça marche... c'est bizarre...
    J'avoue que c'est sale et nul, mais bon à la limite la graph affiche ce qu'il faut, et tout le reste fonctionne...
    Même si maintenant jai la même erreur sur un combobox... ça m'énerve...
    Défenseur de l'Apéro Social

  16. #16
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Citation Envoyé par Saten Voir le message
    J'avoue que c'est sale et nul, mais bon à la limite la graph affiche ce qu'il faut, et tout le reste fonctionne...
    VADE RETRO, SATANAS !!

  17. #17
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Kelpan Voir le message
    VADE RETRO, SATANAS !!
    J'accepte le chatiment

    Bon j'ai rerafistolé tout, le try catch est toujours là, mais mon appli carbure du feu de dieu! Tout marche perfect, donc... mais si vous relisez mon problème et que vous trouvez la faille...seulement j'ai torturé l'appli dans tous les sens, aucune chance que quelque chose plante ou ne marche pas... Donc ... bon... voilà quoi! ()
    Défenseur de l'Apéro Social

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/01/2013, 12h11
  2. Réponses: 4
    Dernier message: 14/04/2010, 08h47
  3. Réponses: 5
    Dernier message: 05/03/2010, 18h49
  4. La référence d'objet n'est pas définie à une instance d'objet
    Par Delphi-ne dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/07/2009, 14h22
  5. Réponses: 20
    Dernier message: 13/08/2007, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo