Lista jako źródło danych dla DataGridView

W życiu każdego programisty zdarzają się sytuacje kiedy świadomie lub nie, wybieramy drogę na skróty, która okazuje się drogą przez mękę i może doprowadzić do furii i szewskiej pasji ;). Niby wszystko takie oczywiste a jednak o czymś czasem zapominamy… Oto “problem” z którym się dzisiaj borykałem.

Załóżmy, że posiadamy klasę z kilkoma publicznymi polami zadeklarowaną jak poniżej:

public class MyCustomClass
{
    public int ObjectID;
    public string Name;
    public string Description;
}

Mamy również listę obiektów tej klasy, którą chcemy zaprezentowac na DataGridView:

var results = new List<MyCustomClass>();

Utworzyliśmy w tym celu formatkę a na niej DataGridView:

Kod, który dodajemy do zdarzenia przycisku “Wyświetl” jest następujący:

var results = new List<MyCustomClass>();
results.Add(new MyCustomClass() { ObjectID = 1, Name = "Nazwa 1", Description = "Description 1" });
results.Add(new MyCustomClass() { ObjectID = 2, Name = "Nazwa 2", Description = "Description 2" });
results.Add(new MyCustomClass() { ObjectID = 3, Name = "Nazwa 3", Description = "Description 3" });
dgvCustomData.DataSource = results;

No i oczywiście zonk… Po uruchomieniu programu i kliknięciu przycisku, dane nie zostały wyświetlone na gridzie a nasza formatka wygląda tak:

Zgadza się liczba wierszy, która odpowiada liczbie obiektów dodanych do naszej listy, natomiast dane te nie zostały wyświetlone.

Dlaczego tak się stało? Ponieważ bindowanie danych może odbywać się tylko za pomocą właściwości a nie za pomocą pól obiektu. Wystarczy zmienić naszą klasę tak aby posiadała właściwości (które możemy połączyć z polami klasy):

public class MyCustomClass
{
    private int _objectID;
    private string _name;
    private string _description;

    public int ObjectID
    {
        get { return _objectID; }
        set { _objectID = value; }
    }

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public string Description
    {
        get { return _description; }
        set { _description = value; }
    }
}

Po uruchomieniu aplikacji efekt jak na załączonym obrazku:

Mam nadzieję, że tym wpisem oszczędzę komuś trochę czasu spędzonego na przeszukiwaniu sieci 😉


Tagi:, , ,

komentarzy 6 do “Lista jako źródło danych dla DataGridView”

  1. ss 9 maja 2015 w 17:43 #

    wystarczyło dopisac to list 🙂

    dgvCustomData.DataSource = results.ToList();

    • Marcin Kozub 9 maja 2015 w 18:20 #

      Szkoda, że nie czytasz ze zrozumieniem ;P
      Dane, które zostały użyte jako źródło danych są już w postaci listy.

  2. atrodurry 4 grudnia 2011 w 22:47 #

    co szukalem, dzieki

    • Marcin Kozub 1 marca 2012 w 11:09 #

      Cieszę się, że wpis się komuś przydał. Już myślałem, że tylko mi się takie rzeczy przytrafiają 😉

  3. Tomek 2 listopada 2011 w 13:27 #

    a jesli nie musimy wypełniac DGV gdyż mamy go wypelnionego z Data Seta
    wtedy jak zaimplementować ten kod????

    • Marcin Kozub 9 listopada 2011 w 10:18 #

      Witaj Tomku,

      Skoro masz już wypełnionego DataGridView danymi pochodzącymi z DataSeta to ten kod do niczego Ci nie posłuży.

      Przykład ten miał na celu jedynie pokazanie, jak ustawić listę obiektów jako źródło danych dla DataGridView. Całkowicie mi wypadło z głowy, że do bindowania należy używać właściwości obiektu zamiast jego pól i stąd ten wpis 🙂

Dodaj komentarz

Uzupełnij * Time limit is exhausted. Please reload the CAPTCHA.