2010-03-12 10 views
8

Je ne suis même pas sûr si je le fais correctement. Mais fondamentalement j'ai une liste d'objets qui sont construits hors d'une classe. De là, je lie la liste à une vue de grille de données qui est sur un Windows Form (C#)Liste d'objets Liste d'objets à un WinGrenses DataGridView, mais ne pas afficher certaines propriétés publiques

De là, il montre toutes les propriétés publiques de l'objet, dans la vue DataGrid. Cependant, il y a certaines propriétés dont j'ai besoin encore accessible à partir d'autres parties de mon application, mais ne sont pas vraiment nécessaires pour être visible dans le DataGridView.

Donc, y at-il un attribut ou quelque chose de similaire que je peux écrire au-dessus de la propriété pour l'exclure de l'affichage.

P.S. Im liaison à l'exécution. Donc je ne peux pas éditer les colonnes via le concepteur.

P.P.S. S'il vous plaît pas de réponses de simplement faire des variables publiques (Bien que si c'est le seul moyen, faites le moi savoir :)).

+3

Vous pouvez désactiver 'DataGridView.AutoGenerateColumns' (http://goo.gl/41qt) et ajouter dynamiquement les colonnes requises. Je ne comprends pas vraiment quand vous dites "... je lie à l'exécution, donc je ne peux pas éditer les colonnes via le concepteur." – Vivek

+0

Ce que je dis est. Je n'utilise pas le concepteur et la liaison à une source de données. J'écris simplement: datagridview.datasource = mylist; – MindingData

+0

Peut-être que vous pourriez nous dire pourquoi vous liez au moment de l'exécution plutôt que via le concepteur. Cela pourrait aider –

Répondre

14

Ajouter [Browsable(false)] attribut aux propriétés publiques que vous ne souhaitez pas générer colonne pour.

+1

+1 Si l'ajout de cette fonction fonctionne, c'est beaucoup mieux que ma réponse! :-) – Javier

+0

bien que je l'ai essayé, ça marche =) J'essayais de faire cela en ajoutant mes classes personnalisées. Merci! – Javier

2

Je devais répondre à la même chose que @Vivek dit dans son commentaire. Je ne sais pas pourquoi il n'a pas ajouté une réponse ici ...

Eh bien, si vous laissez un contrôle DataGridView générer automatiquement ses colonnes, il affiche toutes les propriétés dans les objets liés. Donc tout d'abord, vous devez activer DataGridView.AutoGenerateColumns = false.

Ensuite, vous pouvez ajouter des colonnes lors de l'exécution. Par exemple:

DataGridViewColumn myColumn = new DataGridViewTextBoxColumn(); 
myColumn.DataPropertyName.HeaderText = "Title of the column"; 
myColumn.DataPropertyName = "NameOfTheProperty"; 

//... 

MyDataGridView.Columns.Add(myColumn); 
+0

Ajoutant tout manuellement est probablement mon dernier recours ici. – MindingData

+0

Ensuite, j'ai une idée, mais c'est trop gros, je vais le mettre dans une autre réponse. – Javier

+1

Oubliez cette deuxième idée. Voir la réponse de @Vivek à la place = P – Javier

0

En plus de ma réponse précédente, puisque vous préférez indiquer de ne pas ajouter les colonnes manuellement, je vous propose une autre option: à l'aide des attributs personnalisés dans votre définition des propriétés.

D'abord, vous devez coder votre attribut personnalisé:

classe MyPropertyAttribute

Vous pouvez l'utiliser dans vos classes, comme ceci:

Foo classe

public class Foo 
{ 
    private string name; 
    private string surname; 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.visible)] 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.invisible)] 
    public string Surname 
    { 
     get 
     { 
      return surname; 
     } 
     set 
     { 
      surname = value; 
     } 
    } 

} 

Vous pouvez écrire une méthode qui itère les propriétés de vos objets liés, en utilisant la réflexion, et tester si elles sont marquées comme visibles ou invisibles, afin d'ajouter ou de ne pas ajouter de colonnes. Vous pourriez même avoir un DataGridView personnalisé avec ce comportement, ainsi vous ne devez pas répéter ceci chaque fois. Vous utiliserez uniquement votre DataGridView personnalisé et marquerez la visibilité dans les propriétés.

Quelque chose comme ça ...

public class MyCustomDataGridView : DataGridView 
    { 

     public MyCustomDataGridView() 
     { 
      this.AutoGenerateColumns = false; 
     } 

     public void Load<T>(ICollection<T> collection) 
     { 

      foreach(object myAttribute in typeof(T).GetCustomAttributes(typeof(MyPropertyAttribute).GetType(), true)) 
      { 
       if (((MyPropertyAttribute)myAttribute).Visibility == MyPropertyAttribute.VisibilityOptions.visible) 
       { 
        //... 
       } 
      } 

     } 

    } 
0

Je sais que c'est un peu un ancien message, mais juste pour plus de clarté, je tiens à ajouter que cela peut également être réalisé en définissant la définition de type personnalisé en utilisant ICustomTypeDescriptor interface. Cela ressemble à un peu plus de travail mais vous ne pouvez implémenter que ce dont vous avez besoin (dans ce cas GetProperties). Cela facilite les choses plus tard car la plupart des grilles/listes de colonnes auto-gen listées supportent cette approche.