2010-04-25 14 views
5

Sto tentando di associare una raccolta a un DataGridView. Poiché risulta impossibile per l'utente modificare qualsiasi cosa in questo DataGridView sebbene EditMode sia impostato su EditOnKeystrokeOrF2.
ecco il codice semplificato:Associazione di raccolte a DataGridView in Windows Form

public Supplies() 
{ 
    InitializeComponent(); 
    List<string> l = new <string>(); 
    l.Add("hello"); 
    this.SuppliesDataGridView.DataSource = l; 
} 

Inoltre non funziona quando cambia il tipo di raccolta per SortableBindingList, dizionario o anche utilizzare un BindingSource.

Cosa può essere che non va?

risposta

0

Una volta impostata la proprietà DataSource si desidera poi di sparare il metodo DataBind().

this.SuppliesDataGridView.DataSource = l; 
this.SuppliesDataGridView.DataBind(); 

UPDATE:

Come lei ha giustamente sottolineato nei commenti, il metodo DataBind() non esiste per questo controllo.

Questo link potrebbe fornire alcune informazioni utili: http://msdn.microsoft.com/en-us/library/fbk67b6z%28v=VS.90%29.aspx

+0

Non esiste un metodo di questo tipo in SuppliesDataGridView. – Sergey

2

Prova questa:

public class CustomCollection { public string Value { get; set; } } 

    public Supplies() 
    { 
     InitializeComponent(); 
     List<CustomCollection> l = new List<CustomCollection> { new CustomCollection { Value = "hello" } }; 
     this.SuppliesDataGridView.DataSource = l; 
    } 
5

Per me il seguente metodo funziona come previsto:

  • aprire il tuo modulo (UserControl, etc.) con il designer
  • Aggiungi un BindingSource al modulo
  • Selezionare il BindingSource nel modulo e aprire la pagina delle proprietà
  • Selezionare la proprietà DataSource e fare clic sulla freccia giù
  • Cliccare sulla Add origine di dati
  • Selezionare oggetto
  • Selezionare l'oggetto tipo che desideri gestire
    • Questo dovrebbe essere il tipo che verrà gestito dalla tua raccolta, non dalla stessa CustomCollection!
  • apparire le fonti di dati disponibili selezionando dal Data MenuBar - Mostra origini dati
  • Trascinare e rilasciare i ItemType dai DatasSources sul modulo
  • Go nel codice del modulo e si legano il vostro CustomCollection al BindingSource

    var cc = new CustomCollection(); 
        bindingSource1.DataSource = cc; 
    

Osservazioni:
DataGridView è solo l'ultima parte della catena per (dis) consentire di modificare, aggiungere e rimuovere oggetti dall'elenco (o da CustomCollection).V'è anche una proprietà AllowNew all'interno del BindingSource e l'interfaccia ICollection ha una proprietà IsReadOnly che deve essere impostato per false per consentire la modifica. Ultimo ma non meno importante, le proprietà della classe all'interno della raccolta devono avere un metodo di setter pubblico per consentire la modifica di un valore.

+0

Ho fatto ciò che hai fatto, ma quando provo ad aggiungere un nuovo oggetto all'elenco, DataGridView non si aggiorna, sebbene l'elenco stesso sia corretto e il casting del DataSource del binding restituisce anche un elenco corretto. –

+0

Se si manipola la raccolta (aggiungi, rimuovi, inserisci, cancella), l'origine dell'associazione deve essere informata di tale modifica. O implementate 'IBindingList' e alzate l'evento ListChanged quando necessario; usa al posto della tua collezione normale il 'BindingList ' o chiami 'bindingSource.ResetBindings (false)' – Oliver

Problemi correlati