2010-03-12 9 views
8

Non sono nemmeno sicuro se lo sto facendo correttamente. Ma fondamentalmente ho una lista di oggetti che sono costruiti fuori da una classe. Da lì, leggo l'elenco a una vista datagrid su un Windows Form (C#)Elenco Databind di oggetti per un DataGridView WinForms, ma non per mostrare alcune proprietà pubbliche

Da lì, mostra tutte le proprietà pubbliche dell'oggetto, nella vista datagrid. Tuttavia ci sono alcune proprietà che ho ancora bisogno di accedere da altre parti della mia applicazione, ma non sono necessarie per essere visibili in DataGridView.

Quindi c'è un attributo o qualcosa di simile che posso scrivere sopra la proprietà per escluderlo dall'essere mostrato.

P.S. Im vincolante in fase di runtime. Quindi non posso modificare le colonne tramite il designer.

P.P.S. Per favore non ci sono risposte solo per rendere variabili pubbliche (anche se questo è l'unico modo, fammi sapere :)).

+3

È possibile disabilitare "DataGridView.AutoGenerateColumns" (http://goo.gl/41qt) e aggiungere le colonne richieste in modo dinamico. Non capisco davvero quando dici "... sono vincolante in fase di esecuzione, quindi non posso modificare le colonne tramite il designer." – Vivek

+0

Quello che sto dicendo è. Non utilizzo la finestra di progettazione e il collegamento a un'origine dati. Sto semplicemente scrivendo: datagridview.datasource = mylist; – MindingData

+0

Forse potresti dirci perché sei impegnativo in fase di esecuzione piuttosto che tramite il designer. Questo potrebbe aiutare –

risposta

14

Aggiungi [Browsable(false)] attributo per le proprietà pubbliche che non si desidera generare colonna per.

+1

+1 Se solo aggiungendo questo funziona, questo è molto meglio della mia risposta! :-) – Javier

+0

nice I've provato, funziona =) stavo cercando di fare questo aggiungendo le mie lezioni personalizzate. Grazie! – Javier

2

Ho dovuto rispondere allo stesso come dice @Vivek nel suo commento. Non so perché non ha aggiunto una risposta qui ...

Bene, se si lascia un controllo DataGridView per generare automaticamente le sue colonne, mostra tutte le proprietà negli oggetti binded. Quindi, prima di tutto, è necessario attivare DataGridView.AutoGenerateColumns = false.

Quindi è possibile aggiungere colonne in fase di esecuzione. Per esempio:

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

//... 

MyDataGridView.Columns.Add(myColumn); 
+0

Aggiungere tutto manualmente è probabilmente la mia ultima risorsa qui. – MindingData

+0

Allora, ho un'idea, ma è troppo grande, la metterò in un'altra risposta. – Javier

+1

Dimentica questa seconda idea. Vedi @Vivek answer = P – Javier

0

Oltre alla mia precedente risposta, dal momento che si preferisce indicare non per aggiungere le colonne manualmente, io vi suggerisco un'altra opzione: attributi utilizzando personalizzato nelle proprietà della definizione.

In primo luogo, è necessario codificare il tuo attributo personalizzato:

classe MyPropertyAttribute

Si potrebbe utilizzare nelle vostre classi, proprio come questo:

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; 
     } 
    } 

} 

È possibile scrivere un metodo, che itera le proprietà negli oggetti associati, utilizzando la reflection e verificare se sono contrassegnati come visibili o invisibili, per aggiungere o non aggiungere colonne. Potresti persino avere un DataGridView personalizzato con questo comportamento, quindi non devi ripetere questo ogni volta. Dovrai solo utilizzare il tuo DataGridView personalizzato e contrassegnare la visibilità nelle proprietà.

qualcosa di simile ...

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

So che è un po 'un vecchio post, ma solo per chiarezza desidero aggiungere che questo può essere ottenuto anche definendo la definizione del tipo personalizzato usando l'interfaccia ICustomTypeDescriptor. Sembra un po 'più di lavoro ma puoi implementare solo ciò che ti serve (in questo caso GetProperties). Rende le cose più facili in seguito perché la maggior parte delle colonne elencate auto-gen grids/lists supportano questo approccio.

Problemi correlati