2010-04-25 17 views
5

Próbuję powiązać kolekcję z DataGridView. Jak się okazuje, nie można edytować niczego w tym DataGridView, chociaż EditMode jest ustawiony na EditOnKeystrokeOrF2.
Oto uproszczony kod:Łączenie kolekcji z DataGridView w Windows Forms

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

To również nie działa przy zmianie typu kolekcji do SortableBindingList, słownik lub nawet użyć BindingSource.

Co tu może być nie tak?

Odpowiedz

0

Po ustawieniu właściwości DataSource należy następnie uruchomić metodę DataBind().

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

UPDATE:

Jak słusznie zauważył w komentarzach, metoda DataBind() nie istnieje dla tej kontroli.

Ten link może zapewnić kilka przydatnych informacji: http://msdn.microsoft.com/en-us/library/fbk67b6z%28v=VS.90%29.aspx

+0

Nie ma takiej metody w SuppliesDataGridView. – Sergey

2

Spróbuj tego:

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

Dla mnie następująca metoda działa zgodnie z oczekiwaniami:

  • Otwórz swoją formę (usercontrol, etc.) z projektantem
  • Dodaj BindingSource do swojego formularza
  • Wybierz BindingSource w swojej formie i otworzyć stronę właściwości
  • Wybierz właściwość DataSource i kliknij strzałkę w dół
  • Kliknij Dodaj źródło danych projekt
  • Wybierz Object
  • Wybierz obiekt typ, który chcesz obsłużyć:
    • Powinien to być typ, który będzie obsługiwany przez kolekcję, a nie przez samą kolekcję CustomCollection!
  • Lista dostępnych źródeł danych, wybierając z danych MenuBar - Pokaż Źródła danych
  • przeciągnąć i upuścić itemtype z DatasSources na formularzu
  • Go do kodu swojej formie i wiążą Twój CustomCollection do BindingSource

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

Uwagi:
DataGridView to ostatnia część łańcucha, aby (dis) umożliwić zmianę, dodawanie i usuwanie obiektów z listy (lub CustomCollection).Istnieje również właściwość AllowNew w interfejsie BindingSource, a interfejs ICollection ma właściwość IsReadOnly, która musi być ustawiona na false, aby umożliwić edycję. Last but not least, właściwości twojej klasy w kolekcji muszą mieć publiczną metodę ustawiania, aby umożliwić zmianę wartości.

+0

Zrobiłem to, co zrobiłeś, ale kiedy próbuję dodać nowy obiekt do listy, DataGridView nie odświeża się, chociaż sama lista jest poprawna, a odlewanie DataSource wiązania również zwraca poprawną listę. –

+0

Jeśli manipulujesz kolekcją (dodawaj, usuwaj, wstawiaj, usuwaj), źródło powiązania musi zostać poinformowane o tej zmianie. W razie potrzeby zaimplementuj 'IBindingList' i podnieś zdarzenie ListChanged; używaj zamiast swojej normalnej kolekcji 'BindingList ' lub wywołaj 'bindingSource.ResetBindings (false)' – Oliver

Powiązane problemy