2008-11-25 8 views
1

Je rencontre des problèmes avec un élément datagridview que j'utilise dans VS2008. Cette DataGridView est en réalité une tabulation dans un élément TabControl. Je lui ai donné 5 colonnes qui ont besoin d'être remplies avec des éléments d'un costum Objet que j'ai fabriqué.Contrôle de DataGridView C# avec une arborescence dans VS2008

Il s'agit essentiellement d'une petite application de bibliothèque qui contient une classe principale et plusieurs classes dérivées de celle-ci. Ils ont tous une méthode ToString() qui représente les données sous la forme d'une chaîne de mots-clés contenant les valeurs nécessaires pour remplir la vue de données.

J'ai seulement besoin du premier 5, certains objets auront jusqu'à 12 mots-clés. Actuellement, chaque fois que j'ajoute un objet, la grille de données ne se remplit pas elle-même, à la place elle ajoute un nombre de colonnes égal au nombre de mots-clés de l'objet spécifique.

Ce que je suis en train de faire est la suivante:

public void libDataGrid_Click(object sender, EventArgs e) 
     { 
      if(this.manager.Lib.LibList[0] != null) 
      { 
       libDataGrid.DataSource = this.manager.Lib.LibList; 
       libDataGrid.Refresh(); 
      } 
     } 

this.manager.Lib.LibList retours et ArrayList, dans lequel tous les objets sont stockés. L'ArrayList peut contenir des éléments de toutes les classes dérivées, mais comme ils sont tous connectés, la représentation sous forme de chaîne contiendra toujours les éléments dont j'ai besoin pour remplir la grille.

Je ne vois pas comment je peux filtrer seulement les cinq premiers et les avoir mis dans les colonnes correctes.

Et une autre chose. Actuellement, je ne peux qu'actualiser le DataGridView en cliquant dessus. Il devrait changer lorsque je passer à l'onglet spécifique sur le Tabcontrol que je veux dire.

J'ai essayé d'ajouter un argument pour SelectedIndexChanged, mais cela ne fait rien vraiment ... Ou du moins, cela ne semble pas faire quoi que ce soit.

Ce que je veux dire est que je commentais le code ci-dessus et a ajouté ceci:

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
       libDataGrid.DataSource = this.manager.Lib.LibList; 
       libDataGrid.Refresh(); 
     } 

Ce rafraîchit à chaque fois l'onglet change, peu importe où l'un. J'ai dû supprimer l'instruction if, car elle m'a donné une exception. Probablement parce que la longueur de ArrayList n'est pas définie lors de l'initialisation.

Répondre

3

Je suis un peu confus par la question, mais voici quelques réflexions:

  1. DataGridView a une propriété AutoGenerateColumns; si vous ne voulez pas créer ses propres colonnes, définissez à false
  2. Pour se lier à des colonnes existantes, le DataPropertyName doit être défini sur chaque
  3. DataGridView (en cmomon avec un contrôle de liste à l'aide TypeDescriptor) sera extrêmement préfèrent List<T> (pour certains T! = object) à ArrayList, car il peut obtenir des métadonnées même pour une liste vide. En général, dans 2.0 en utilisant ArrayList est une erreur.
+0

merci, je vais essayer cela. – Vordreller

0

je ne peux donner une réponse partielle, mais je pense que la raison pour laquelle

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
       libDataGrid.DataSource = this.manager.Lib.LibList; 
       libDataGrid.Refresh(); 
     } 

ne fonctionne pas, parce que vous devez ajouter cette ligne où TabControl1 est en cours d'initialisation. J'ai eu ce problème où VS ne le fera pas lui-même.

tabControl1.SelectedIndexChanged += new EventHandler(tabControl1_SelectedIndexChanged); 
+0

le Eventhandler était déjà en place. Pas de problème là-bas. – Vordreller

0

Si je comprends votre problème, il semble similaire à un problème que je luttais avec récemment dans ce fil sur DataGridViews in C#/.NET2.0

Essayez d'appeler:

libDataGrid.Invalidate(); 

Cela devrait forcer Windows à redessinez votre contrôle. Pas besoin de rattacher la source de données et actualiser. (Je pense que vous pouvez commenter ces deux lignes en toute sécurité.

Également: Quelle était l'exception que vous receviez? Et avez-vous utilisé le "Assistant de configuration de source de données" pour vous aider avec le DataGridView?

+0

Merci, mais cela n'a pas fonctionné – Vordreller

+0

L'Exception était une ArgumentOutOfRangeException – Vordreller

+0

J'ai essayé l'assistant de configuration, mais cela ne m'a pas empêché de choisir le constructeur, qui contient plus que l'ArrayList. – Vordreller

Questions connexes