Autor Wątek: ListView i własna klasa  (Przeczytany 3226 razy)

Offline Xirdus

  • Redaktor

# Kwiecień 16, 2012, 17:47:51
Mam tablicę obiektów własnej klasy, której wszystkie pola są publiczne i typu string. Chcę zrobić teraz kontrolkę WinForms ListView, której danymi będą te obiekty, a kolejne kolumny odpowiadały kolejnym polom.

1) Czy idzie takie coś zrobić?
2) Czy da się mieszać typy danych (np. kilka intów, parę DateTime)?
3) Jeśli się nie da, macie propozycje rozwiązania tego w inny sposób?

VS 2008, .NET 3.5

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kuba D.

  • Użytkownik

# Kwiecień 16, 2012, 18:10:18
1. tak
2. tak
3. nie dotyczy

W miare problematyczna moze byc sytuacja gdzie nie znasz tych pol, ich typow, ilosci (klasa jest dynamicznie tworzona) ale to tez da rade obsluzyc ( property grid jest tego dobrym przykladem).

Offline ShadowDancer

  • Redaktor

# Kwiecień 16, 2012, 18:11:37
Ja bym użył refleksji, do wyciągnięcia nazw i wartości pól, a potem zbudować na podstawie tych danych listviewa.
Jednak zastanów się, czy PropertyGrid nie spełnia twoich wymagań - można zaznaczyć kilka obiektów naraz (jednak nie wiem jak to dokładnie działa).

Offline Xirdus

  • Redaktor

# Kwiecień 16, 2012, 18:40:10
Może mało sprecyzowałem pytanie: czy jest w VS jakiś wbudowany automat do takiej rzeczy, i jeśli tak to jak go użyć?

Offline ShadowDancer

  • Redaktor

# Kwiecień 16, 2012, 19:20:06
O ile wiem, to nie - ale napisanie tego to może 20 linijek kodu.

Offline koirat

  • Użytkownik

# Kwiecień 16, 2012, 20:13:11
Ja bym również szedł w property grid. To co chcesz zrobić za pomocą ListView jest po prostu nazbyt problematyczne. Powiedz co chcesz osiągnąć może coś doradzimy. Jeśli potrzebujesz edycji obiektu to PropertyGrid rządzi. Natomiast jeśli chcesz mieć listę obiektów do sortowania poprzez kolumny to rzeczywiście musisz do tego podejść inaczej.

Offline Xirdus

  • Redaktor

# Kwiecień 16, 2012, 20:19:50
Tabela danych, czyli PropertyGrid odpada. Aktualnie bawię się z DataGridView, ale też nie bardzo mi wychodzi.

Offline Fiołek

  • Użytkownik
    • Blog

# Kwiecień 16, 2012, 20:28:48
WinForms to naprawdę potężne narzędzie, które masę rzeczy ma OOTB.
DataGridView.AutoGenerateColumns, i generalnie data bindings(DataSource, DataPropertyName itp.).

Jeśli nie jesteś w stanie przewidzieć kolumn, to AutoGenerateColums zrobi to za Ciebie(ale kolumny będą miały "brzydkie" nazwy, będą standardowe formatowania). Jeśli potrzebujesz tworzyć to na gorąco, to trochę refleksji, LINQ i zamkniesz się w kilkunastu linijkach(włącznie z nazwą i formatowaniem dla kolumny pobieranych z atrybutu właściwości).

Offline Kos

  • Użytkownik
    • kos.gd

# Kwiecień 16, 2012, 20:31:29
O, a ja myślałem że bindingi i te bajery to dopiero w WPF są...

Offline koirat

  • Użytkownik

# Kwiecień 16, 2012, 20:33:27
A jak próbowałeś z DataGridView ? Ustawiłeś DataGridView.DataSource  na swoją listę obiektów (IList) ? I nic się nie wyświetliło ?

[edit]
Ok zostałem troszku uprzedzony :P
[/edit]

O, a ja myślałem że bindingi i te bajery to dopiero w WPF są...
W sumie Data Binding był od początku, problem w tym iż kontrolki w Win Forms są tak dziwnie zaprojektowane, niby mają zintegrowany buffer danych w sobie ale można czasem mieć go poza kontrolką :| taki ni pies ni wydra. Ostatecznie większość ludzi robiła po swojemu a Binding to był dla zaawansowanych :P
« Ostatnia zmiana: Kwiecień 16, 2012, 20:37:00 wysłana przez koirat »

Offline Fiołek

  • Użytkownik
    • Blog

# Kwiecień 16, 2012, 20:35:49
@Kos: WPF ma je bardzo rozbudowane i o wiele bardziej user-friendly, ale te z WinForms też spełniają swoją rolę. Co prawda jakby przyszło pisać je z palca, to idzie się pociąć na początku, ale Visualowy designer ładnie to wszystko ogarnia.

EDIT:
Ad. @up(edit): wydają się dziwnie zaprojektowane ale jak dłużej z nimi pobyć to idzie się zaprzyjaźnić i wydają się całkiem przemyślane(mówię o czystym kodzie, bez designera, który to wymiata). Nie bardzo wyobrażam sobie pisać jakąkolwiek aplikację w WinForms bez bindingów(przecież to załatwia masę kodu, a jest bajecznie proste do wyklikania).
« Ostatnia zmiana: Kwiecień 16, 2012, 20:39:41 wysłana przez Fiołek »

Offline Xirdus

  • Redaktor

# Kwiecień 16, 2012, 20:50:52
Ja potrzebuję jakiegoś wideotutoriala do tego :/ Co mam po kolei zrobić żeby zbindować pod DataGridView jakąś tablicę (powiedzmy że siedzącą jako static w klasie Program - tej z Mainem)?

Offline koirat

  • Użytkownik

# Kwiecień 16, 2012, 21:02:32
dataGridView1.DataSource = mojaTablica;

I niech coś już będzie w tej tablicy przed zbindowaniem, chyba że używasz jakiegoś specjalnie przystosowanego kontenera zamiast zwykłej tablicy.

opcjonalnie możesz odświeżyć BindingContext ale to dłuższa historia.
« Ostatnia zmiana: Kwiecień 16, 2012, 21:15:35 wysłana przez koirat »

Offline Xirdus

  • Redaktor

# Kwiecień 16, 2012, 21:10:51
OK, już powoli załapuję, trza robić propertiesy zamiast gołych publiców...

Offline Fiołek

  • Użytkownik
    • Blog

# Kwiecień 16, 2012, 21:11:11
Masz tutorial: Odpal sobie Visual Studio, utwórz sobie nowy projekt WinForms, napisz sobie prostą klasę Data(dwa pola: string A, int B), utwórz sobie formatkę, dodaj doń dwa textboxy i zmień ich ustawienia. Jak otworzysz toolboxa Properties będziesz i odnajdziesz pole "Text" w grupie "Data Bindings" to będziesz miał możliwość ustawienia bindingu dla tego pola. Potem masz ładne prowadzenie za rączkę - dodanie Project Data Source, wybranie pola itp. Potem w konstruktorze przypisujesz do DataSource obu textboxów obiekt klasy Data i WinForms zrobi resztę za Ciebie - przy zmianie(ew. przy stracie focusu, nie pamiętam jak to jest domyślnie) przypisze nowe wartości do odpowiednich pól DataSource.
(Może mało to "wideo" ale powinieneś sobie poradzić, nie jest to strasznie trudne.)

Dla DGV jest więcej klikania, bo trzeba to robić dla każdej kolumny(ale Project Data Source już jest, więc wystarczy z drzewka wybrać), za to można do jego DataSource przypisać coś, co implementuje IList(a tablica jest jego implementacją) a on sam wypełni wiersze na podstawie danych.