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

C# .NET .NET (C# a Visual Basic) WPF - binding tabulky o předem neznámém počtu sloupců American English version English version

Avatar
Honza
Člen
Avatar
Honza:

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. června 14:48
Odpovědět 3. června 14:45
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:

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. června 18:46
Nahoru Odpovědět 3. června 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:

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. června 20:56
Avatar
Lako
Člen
Avatar
Odpovídá na Honza
Lako:

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. června 20:26
 
Nahoru Odpovědět 4. června 20:25
Avatar
Honza
Člen
Avatar
Odpovídá na sadlomaslox25
Honza:

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. června 10:41
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Lako
Honza:

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. června 10:43
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Honza:

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. června 10:15
Nahoru Odpovědět  +1 13. června 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.