2009-07-24 15 views
7

Dire che ho un oggetto business chiamato Sample e ho BindingList of Samples. Un campione ha 4 proprietà.Associazione a BindingList <T> - scegliere cosa associare?

Posso selezionare quali proprietà sono associate a DataGrid o non esiste un'opzione per personalizzare una cosa del genere?

NOTA: Sto usando Compact Framework, dove NON è DataGridView, così come proprietà di Autogenerate e DataMember.

Si prega di tenere questo presente durante la risposta.

risposta

0

Suppongo che si intenda DataGrid in WinForms, ma lo stesso è applicabile alla maggior parte dei controlli associabili.

Sì, è possibile farlo. Il modo per farlo è un processo in 2 fasi

  • Impostare il membro DataSource come istanza di BindingList<T>.
  • Impostare la proprietà DataMember come nome della stringa della proprietà che si desidera limitare.
+0

Grazie. La proprietà DataMember manca nella classe DataGrid di Compact Framework. C'è un modo per farlo al livello BindingList? Quello che sto cercando è un modo per contrassegnare una proprietà Sample non associabile ... – sarsnake

9
BindingList<Sample> samples = new BindingList<Sample>(); 
DataGridView dgv = new DataGridView(); 
dgv.DataSource = samples; 

Questo dovrebbe visualizzare ogni proprietà pubblica come una colonna sulla DataGridView. Se si desidera cambiare cui vengono visualizzate le proprietà, è necessario eseguire le seguenti operazioni così:

dgv.AutoGenerateColumns = false; 

e andare nelle proprietà del datagridview, aggiungere le colonne manualmente e si imposta la DataPropertyName al nome della proprietà.

Se si è creato il datagridview nel codice, il seguente creerà e aggiungerà una colonna al dgv.

DataGridViewColumn dgvc = new DataGridViewColumn(); 
dgvc.Name = "PropertyA"; 
dgvc.HeaderText = "Property A"; 
dgvc.DataPropertyName = "PropertyA"; 
dgv.Columns.Add(dgvc); 


EDIT

Questo dovrebbe dare qualcosa di più vicino a quello che vogliono. Tuttavia, poiché utilizza una classe anonima, non è possibile utilizzare BindingList (che io sappia). In alternativa, puoi creare una classe SampleBinding che ha solo le proprietà che vuoi siano visualizzate e generarle dalla lista di campioni normali.

public class Sample 
{ 
    public int PropertyA {get;set;} 
    public bool PropertyB {get;set;} 
    public string PropertyC {get;set;} 
    public double PropertyD {get;set;} 
} 

List<Sample> samples = new List<Samples>(GetSamples()); 
var sampleBinding = from sample in samples 
        select new 
        { 
         PropertyA = sample.PropertyA, 
         PropertyC = sample.PropertyC 
        }; 

BindingList bl = new BindingList(); 
bl.DataSource = sampleBinding; 
dgv.DataSource = bl; 


EDIT 2

public class Sample 
{ 
    [Browsable(false)] 
    public int PropertyA {get;set;} 
    public bool PropertyB {get;set;} 
    public string PropertyC {get;set;} 
    [Browsable(false)] 
    public double PropertyD {get;set;} 
} 
+0

Grazie, sto facendo qualcosa di equivalente a questo in Compact Framework. Ma questo non è molto dinamico in quanto ho ancora bisogno di hardcode stringa "PropertyA" o caricarlo su qualche costante. Mi riferivo di più a ciascuna proprietà di Sample che ha una proprietà Bindable che può essere attivata o disattivata. O in altre parole, legare il BindingList personalizzato .... Suppongo che non sia possibile? Per ora dimentichiamo le colonne DataGrid (so come farlo). C'è un modo per farlo attraverso BindingList? – sarsnake

+0

Guardando le proprietà/metodi per BindingList che non sembra probabile. Dammi qualche minuto per creare un altro codice per un altro modo in cui potresti provare questo. –

+0

qualcosa del genere http://www.jardinesoftware.net/2007/10/23/hide-properties-in-bindinglist/ ma lui/lei non elabora e non capisce come ciò che ha scritto si usa. – sarsnake

1

ho gestito questo un paio di modi diversi, Speriamo che questo sia utile.

La prima opzione, come ha detto Justin, è impostare AutoGennerateColumns = false e farlo manualmente da lì. Se lo si lega, il runtime creerà le colonne per tutte le proprietà pubbliche di Sample. Se si desidera rimuovere loro, è possibile farlo con

DataGridView.Columns["SomePropertyOfSample"].Remove(); 

Questa soluzione è un po 'problematico, in quanto è necessario tenerlo aggiornato, e rimuovere in modo esplicito gli elementi.

L'opzione Justin's Edit 2 di impostare l'attributo Browsable su false sulla proprietà è interessante, non l'ho mai provato prima.

La soluzione che ho finito per utilizzare e che penso funzioni piuttosto bene ruota attorno a un'interfaccia.

Avevo due DataGridView differenti che dovevano mostrare gli stessi dati, ma che mostravano e nascondevano ogni volta diverse colonne. In questo caso si dovrebbe fare:

public interface ISimpleSample 
{ 
    string Name {get;} 
    int ID {get;} 
} 

public interface IAdvancedSample 
{ 
    string Name {get; set;} 
    int ID {get; set;} 
    string Make {get; set;} 
    string Model {get; set;} 
} 

public class Sample : ISimpleSample, IAdvancedSample 
{ 
    //Implementation skipped 
} 

È quindi creare la vostra collezione di esempio utilizzando

BindingList<ISimpleSample> = new BindingList<ISimpleSample>(); 

e si legano a questo.

Se si desidera aggiungere colonne in un secondo momento, è sufficiente aggiungerle all'interfaccia appropriata.

Questo ha funzionato bene per il mio progetto, fatemi sapere cosa ne pensate.