NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: WPF - binding tabulky o předem neznámém počtu sloupců

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Honza
Člen
Avatar
Honza:3.6.2016 14:45

Ahoj, nějak jsem se zasekl u bindingu dat a potřeboval bych nasměrovat, jak by se to dalo co nejjednodušeji vyřešit.

Takže, do své WPF aplikace implementuju funkci, která dovolí uživateli import dat z MS Excel. Vytvořil jsem si na to svojí datovou strukturu která je následující.

  1. Třída ExcelDataHolder reprezentuje celou tabulku. Má property dataRows která je typu ObservableCollec­tion<ExcelData­Row>
  2. Třída ExcelDataRow rešprezentuje jeden řádek tabulky. Má property dataColumns která je typu ObservableCollec­tion<object> a reprezentuje jednotlivé buňky (chcete-li sloupce) na daném řádku.

Je tam samozřejmě i nějaká vnitřní logika aby všechny řádky měly stejný počet sloupců atd. Potud to je ok.

Teď bych ale chtěl načtená data zobrazit v datagridu a zde jsem narazil. Předem totiž nevím jaký excel uživatel otevře, kolik bude mít sloupců, jestli nebude prázdný atd. A přitom když chci použít binding, tak potřebuju namapovat jednotlivé property na jednotlivé sloupce, což je tady problém, když to mám uložené jako list.

Předem říkám že bych chtěl využít binding, protože uživatel bude mít možnost data modifikovat, než se pošlou do databáze. Bez bindingu bych musel propagaci změn na data řešit ručně. Nevěděl by někdo jakým směrem se ubrat? Nebo na to jdu úplně špatně? V jednu chvíli jsem rezignoval na vlastní datovou strukturu a rozhodl jsem se že použiju DataTable, ale moc jsem si nepomohl, protože jsem ani u ní nepřišel na to, jak jí nacpat do DataGridu. A DataGridView používat nechci, protože WinForms komponenty nejdou stylovat a bylo by to jako pěst na oko.

Editováno 3.6.2016 14:48
Odpovědět
3.6.2016 14:45
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:3.6.2016 18:45

Nejsem si jistý, ale mám za to, že pokud necháš v DataGridu vlastnost AutoGenerateColumn na True, tak ti automaticky vykreslí tolik sloupců, kolik najde v kolekci... třeba v té DataTable

Editováno 3.6.2016 18:46
Nahoru Odpovědět
3.6.2016 18:45
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Honza
sadlomaslox25:3.6.2016 20:56

bindovni je featura MVVM pristupu. v ramci MVVM ten problem muzes vyresit 3 zpusoby:

  1. konverterem ktery predela ty tvoje vstupni tridy do objektu kteremu rozumi DataGrid
  2. wrapnout datagrid do userControlu (velice univerzalni reseni)
  3. pres Behavior

bez MVVM se to da vyresit nejakym "bastlenim" kde pri prichodu dat pregenerujes sloupce v datagridu.

 
Nahoru Odpovědět
3.6.2016 20:56
Avatar
Lako
Člen
Avatar
Odpovídá na Honza
Lako:4.6.2016 20:25

Problém je v tom, že když binduješ tvojí kolekci do datagridu, tak ono to chce dělat sloupečky podle vlastností třídy ze které se skládá ta kolekce, takže tvoje property dataColumns je tím pádem jenom jedním sloupečkem. (autogenerate columns tedy fungovat nebude)

Narazil jsi na pěknou otázku. Tady je něco dosti podobného: http://stackoverflow.com/…r-of-columns

Řeší tam ale spíš hlavičku jednotlivých sloupců.

Potom bys měl možná lepší, kdyby sis vytvořil 2D pole jednotlivých buněk. Jak takovou věc dostat do datagridu se dočteš zde: http://stackoverflow.com/…rray/4002409#…

Kdyby si nepotřeboval datagrid, tak by to šlo asi bez problému udělat pomocí listview v listview, nebo tak něco...
Dej vědět, jak si se s tím popasoval

Editováno 4.6.2016 20:26
 
Nahoru Odpovědět
4.6.2016 20:25
Avatar
Honza
Člen
Avatar
Odpovídá na sadlomaslox25
Honza:6.6.2016 10:41

Určitě chci jít cestou userControlu, tímhle způsobem dělám většinu svých aplikací. Sice to ze začátku dá nějakou práci si controly připravit, ale pak už jde vývoj docela rychle, protože to je jako skládačka.

Nahoru Odpovědět
6.6.2016 10:41
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Lako
Honza:6.6.2016 10:43

No právě, to je přesně ten problém který se mi nedaří vyřešit :) Jak mu říct že tam jsou nějaké další sloupečky s nějakým jménem :)
Ten první příklad vypadá zajímavě, zkusím to projít a dám vědět, díky :)

Nahoru Odpovědět
6.6.2016 10:43
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Honza:13.6.2016 10:14

Tak jsem to nakonec vyřešil tak, že jsem si udělal userControl a data samotná držím v dataTable, což mi přišlo jako cesta nejmenšího odporu. Díky všem za rady :)

Editováno 13.6.2016 10:15
Nahoru Odpovědět
13.6.2016 10:14
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.