2010-06-17 3 views
2

Nous avons simplement créé dynamiquement un contrôle DataGridView et l'avons lié à un DataTable. Nous étions en train d'attacher du style à certaines colonnes. Mais, quand nous avons essayé d'accéder aux colonnes, nous avons eu une référence nulle. Une enquête plus approfondie, nous avons constaté que si nous ajoutons le contrôle DataGridView au formulaire principal, puis essayez d'accéder à ses colonnes, ça fonctionne bien !!!les colonnes datagridview créées dynamiquement ne sont pas accessibles à moins d'être ajoutées à un formulaire ... pourquoi?

Code qui jette l'erreur:

DataGridView gv = new DataGridView(); 
gv.DataSource = GetDataTable(); //binding it to datatable 
Debug.Assert(gv.Columns == null); 
code

qui fonctionne très bien:

DataGridView gv = new DataGridView(); 
gv.DataSource = GetDataTable(); //binding it to datatable 
this.Controls.Add(gv); //adding to form 
Debug.Assert(gv.Columns == null); //the assertion fails! 

Pourquoi ce comportement ainsi? Y at-il une solution de contournement pour cela?

+0

Pourquoi avez-vous besoin d'une solution de contournement? Que faites-vous avec le DGV si vous ne l'ajoutez pas à un formulaire? –

+0

La création du contrôle gridview se passe dans un thread. nous espérions "terminer" tout le travail ici ... avant de revenir au fil principal. De plus, dans le thread principal, nous n'avons pas de référence au contrôle créé dynamiquement. Nous devions entrer pour une réécriture majeure ... c'est pourquoi j'ai demandé s'il y avait une solution de rechange – deostroll

+0

Beats moi pourquoi on voudrait créer un dgv dans un fil séparé. Après tout, c'est obtenir les données et remplir la grille ce qui prend du temps, pas la création de la grille. –

Répondre

1

J'ai eu un problème similaire mais je ne suis pas sûr qu'il pourrait vous aider.

Vous pouvez attacher un gestionnaire à l'événement DataGridView.DataBindingComplete.

Lorsque la DataGridView est représentée dans le thread principal se monterait cet événement et là, vous avez toutes les colonnes créées et accessibles

+0

Oui, c'est incroyable comment j'ai raté ça ...! :) – deostroll

+0

DataGridView est lourd: D J'ai raté beaucoup de choses aussi – Drake

0

Er, un petit coup de couteau dans l'obscurité; mais c'est probablement dû au fait que les colonnes générées par l'utilisation de la propriété AutoGenerateColumns nécessitent un BindingContext pour générer et gérer correctement les liaisons pour les valeurs de cellule. En règle générale, BindingContext ne peut pas être déterminé tant que le contrôle Parent n'est pas défini.

+0

PS. Quel est le problème avec l'ajout comme contrôle de l'enfant? Pour quoi d'autre voulez-vous l'utiliser? – Reddog

Questions connexes