Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Windows > Windows Forms
Windows Forms Forum d'entraide sur le développement Windows Forms & Applications Windows. Avant de poster -> Articles Windows Forms
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/12/2012, 11h45   #1
kickoff
Invité de passage
 
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 1
Points : 1
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
kickoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 12h21   #2
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

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

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
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!)
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 12h36   #3
sisqo60
Membre Expert
 
Avatar de sisqo60
 
Homme
Consultant informatique
Inscription : février 2006
Messages : 731
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 : 731
Points : 1 150
Points : 1 150
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
sisqo60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 13h09   #4
kickoff
Invité de passage
 
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 1
Points : 1
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".
kickoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 13h29   #5
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

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

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
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 ? )
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 14h05   #6
kickoff
Invité de passage
 
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 1
Points : 1
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 ?
kickoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 14h21   #7
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

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

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
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...
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 14h25   #8
kickoff
Invité de passage
 
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 1
Points : 1
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
kickoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h22.


 
 
 
 
Partenaires

Hébergement Web