+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Invité
    Invité(e)

    Par défaut Datagridview et objet non défini

    Bonjour,

    j'ai développé un programme avec Visual Studio 2010 en WinForm.

    Dans ce programme avec l'interface je rajoute un DataGridView (que je renomme). Via la fenêtre de propriété je renseigne le champ "DataSource" en le faisant correspondre avec un objet que j'ai créé avec tout plein de propriétés.
    Puis je vais dans le champ "Columns" pour renommer proprement mes colonnes de mon DataGridView.

    Enfin dans mon code je construit tous mes objets que je stocke dans une List<monobjet>.

    Jusqu'ici pas de soucis.
    Mais au moment de mettre ma List dans mon DataGridView j'ai une exception fatale... pim pam poum badaboum...
    La référence d'objet n'est pas définie à une instance d'un objet.

    (merci le déboggeur Visual Studio).

    Du coup, je regarde ce que contient mon DataGridView est il est à NULL.
    Voici le morceau de code où ça pète :
    Code :
    dgv_ResultSearchProcs.DataSource = _listeSearchProcs;
    Et mon dgv_ResultSearchProcs est à NULL, tandis que _listeSearchProcs contient bien tous les objets comme il faut.

    Là où je suis étonné c'est que j'ai déjà fait des trucs de ce genre et j'ai jamais eu de soucis et le code marche parfaitement sur d'autres projets.
    Normalement ce n'est pas au logiciel de s'occuper d'initialiser le DataGridView et compagnie quand je le rajoute via l'interface dans le InitializeComponent ?

    J'ai jeté un coup d'oeil dans le InitializeComponent et tout me parait bon... (je me suis amusé à comparer une version du logiciel qui fonctionnait avec celle qui fonctionnait pas)

    Ca fait 3h que je suis dessus je commence à m'agacer du coup je viens vous demander de l'aide. Un oeil extérieur est toujours plus efficace que le sien...

    Bien sur si il y a besoin de plus de code ou d'informations n'hésitez pas.

    Merci beaucoup pour votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : décembre 2012
    Messages : 107
    Points : 227
    Points
    227

    Par défaut

    Bonjour,

    Normalement, lorsque les éléments sont créés via le designer, l'instanciation ce fait de manière automatique, en générant le code comme il faut dans InitializeComponent (comme tu l'as très bien souligné ).

    Maintenant, il faudrait avoir plus de détail. Le code de ton formulaire ou du contrôle utilisateur que tu définis.

    A l'aveugle, je dirais que tu essaies d'initialiser ton DataGridView dans le constructeur de ton formulaire, et avant l'appel de InitializeComponent (ou que cet appel est carrément manquant!)

  3. #3
    Modérateur
    Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : février 2006
    Messages : 754
    Points : 1 174
    Points
    1 174

    Par défaut

    Bonjour,

    Je dirais que tu as écris cette ligne :
    Code :
    dgv_ResultSearchProcs.DataSource = _listeSearchProcs;
    dans le constructeur de ta form juste avant le initialisecomponents. Donc c'est normal. Si tu mets cette ligne après le initialisecomponents, ce sera bon

    Si c'est pas ça, il faut nous envoyer du code...

    [EDIT] : Grillé
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  4. #4
    Invité
    Invité(e)

    Par défaut

    merci pour vos réponses et voici plus de détails au niveau de mon code.

    En tout premier j'ai :
    Code :
    1
    2
    3
    4
    5
    6
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    Puis l’évènement au clic de mon bouton :
    Code :
    1
    2
    3
    4
    5
    6
    7
     /// <summary>
            /// Lorsque l'on cliquer sur le bouton "Rechercher les procs
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btn_SearchProcs_Click(object sender, EventArgs e)
            {}
    j'ai enlevé le code de l'événement pour pas que ça fasse trop. Dans cette méthode j'en déclenche une autre qui va s'occuper de renseigner mon DataGridView : LoadSearchProcs();

    La voici :
    Code :
    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
     
    private void LoadSearchProcs()
            {
    while (_dtrProcs.Read())
                    {
                        SearchProcs _sp = new SearchProcs();
     
                        _sp.NomProc = _dtrProcs["nom_proc"].ToString();
                        if (int.TryParse(_dtrProcs["descid_chp_declenche"].ToString(), out _descidDeclenche))
                            _sp.DescidChpDeclenche = _descidDeclenche;
                        _sp.NomChpDeclenche = _dtrProcs["nom_chp_declenche"].ToString();
                        _sp.SqlChpDeclenche = _dtrProcs["sql_chp_declenche"].ToString();
                        _sp.FormuleBas = _dtrProcs["formule_bas"].ToString();
                        if (int.TryParse(_dtrProcs["descid_chp_declencheur"].ToString(), out _descidDeclencheur))
                            _sp.DescidChpDeclencheur = _descidDeclencheur;
                        _sp.NomChpDeclencheur = _dtrProcs["nom_chp_declencheur"].ToString();
                        _sp.SqlChpDeclencheur = _dtrProcs["sql_chp_declencheur"].ToString();
                        _sp.ContenuProc = _dtrProcs["contenu_proc"].ToString();
     
                        _listeSearchProcs.Add(_sp);
                    }
     
                    //j'affiche dans mon gridview
                    dgv_ResultSearchProcs.DataSource = _listeSearchProcs;
    }
    et donc l'erreur est à la fin après le commentaire "j'affiche dans mon gridview".

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : décembre 2012
    Messages : 107
    Points : 227
    Points
    227

    Par défaut

    D'un rapide coup d'oeil, je ne vois rien qui me choque.

    Question subsidiaire : tu ne nous fais pas la blague d'assigner une nouvelle valeur à ton datagridview quelque part dans ton code (et je dirais au hasard : null ? )

  6. #6
    Invité
    Invité(e)

    Par défaut

    euh....

    alors j'avais mis des :
    datagrid.datasource = null;

    à certains endroits notamment dans les catch en cas d'erreur...
    J'ai mis toutes ces lignes en commentaire et maintenant cela fonctionne... Mais cela fait planter d'autres fonctionnalités mais c'est pas le sujet...

    Du coup, c'est quoi le morceau de code magique pour vider ma datasource afin d'en réassigner une autre...
    Exemple, je charge ma datasource tout bien. Après je clique sur le nom d'une colonne pour trier. Du coup, je voudrais vider le datasource pour lui remettre avec les valeurs triées.

    En tout cas merci beaucoup même si je comprends pas pourquoi la première version fonctionnait et pas la nouvelle.

    EDIT :

    Pour essayer de comprendre. Je reviens sur mon tri.
    Je charge mon datagridview comme expliqué plus haut.
    Quand je clique sur l'entête d'une colonne je déclenche une méthode qui va récupérer ma liste d'objet, les trier et afin de les remettre dans mon datagridview je fais :
    Code :
    1
    2
    dgv_ResultEudoChamps.DataSource = null;
                        dgv_ResultEudoChamps.DataSource = _listeChampsEudo;
    et là ça marche parfaitement...
    Alors pourquoi "dgv_ResultEudoChamps.DataSource = null;" j'avais ce problème avant ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : décembre 2012
    Messages : 107
    Points : 227
    Points
    227

    Par défaut

    Au vue de l'erreur que tu avais, tu avais très certainement écrit un
    Code :
    dgv_ResultEudoChamps = null;
    en voulant écrire
    Code :
    dgv_ResultEudoChamps.DataSource = null;
    C'est pourquoi lorsque tu essayais de réaffecter un DataSource à ta GridView tu avais une exception, car tu avais mis à null ta GridView et non le DataSource de la GridView...

  8. #8
    Invité
    Invité(e)

    Par défaut

    grillé

    oui je viens de m'en rendre compte en faisant des tests et en mettant mes lunettes

    c'est exactement ce que je faisais !

    En tout cas merci beaucoup pour votre aide et désolé pour le dérangement pour si peu

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •