WPF TreeView – Hierarchikus adat megjelenítése

MEGOSZTÁS

Ha tetszett a cikk, akkor nyugodtan oszd meg ismerőseiddel, valószínű ők is örülni fognak neki.

A Windows Presentation Foundation TreeView vezérlője egy speciális ItemsControl, ami TreeViewItem objektumokat tartalmaz. A TreeViewItem objektumok rendelkeznek azzal a képességgel, hogy több TreeViewItem-et tartalmazzanak. Ebben a cikkben szeretném bemutatni, hogy adatbázisban hierarchikus rendben tárolt adatot, miképp lehet fastruktúrába rendezni, TreeView-ban megjeleníteni.

Példaként rendelkezésre áll SQL szerveren hierarchikus rendben tárolt Kategóriák adattábla, ami egy termékeket bemutató alkalmazás termékkategóriáinak adatait tárolja. A Kategoriak tábla a következőképpen épül fel:

Adatmezők:

  • kategoriaID: A kategória egyedi azonosítója. Elsődleges kulcs. (uniqueidentifier)
  • nev: A kategória neve. (nvarchar(200))
  • szulokategoriaID: A szülőkategória azonosítója. (uniqueidentifier)

A hierarchikus felépítést az adattáblában elhelyezett szulokategoriaID mező biztosítja, amely egy kategóriához tartozó szülőkategória azonosítóját tartalmazza. Így biztosítva a szülő-gyerek kapcsolatot. Annak a kategóriának, amelynek nincs szüksége szülőkategóriára, annak sem hagyható üresen a szulkategoriaID mezője. Erre az esetre létrehozásra került egy úgynevezett üres kategória a táblában, ami az ilyen kategóriák szülőjeként szolgálhat.

Az SQL szerveren tárolt adatok eléréséhez a legegyszerűbb mód a LINQ to SQL használata. Egy üres WPF projekthez adjunk hozzá egy új LINQ to SQL Classes fájlt (DB.dbml). A Server Explorerről húzzuk le a Kategoriak táblát az ablakba. Ezzel a mozdulattal megtörténik a leképezés a relációs adatbázis elemeiről az objektumorientált világ elemeire.

Az adatok megjelenítésére szolgáló TreeView vezérlőt (tvKategoriak) egy GroupBox-ban helyeztem el. Ennek megfelelő XAML kód:


    

A TreeView feltöltése adatokkal a Window_Loaded eseményben kerül megvalósításra. A kódrészlet egy LINQ lekérdezéssel visszaadja a Kategoriak tábla teljes tartalmát. A kategóriák mindegyikéről eldönti, hogy a legfelső szinten állnak-e a hierarchikus struktúrában. Ha egy ilyenről van szó, akkor létrehozásra kerül számára egy TreeViewItem (parentnode). Az alá tartozó kategóriákat rekurzívan az AlKategoriak(kategoria, TreeViewItem) függvény adja meg. A teljes leszármazott részfa meghatározása után az adott parentnode-ot a TreeView Items gyűjteményéhez adja hozzá.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
     /*A kategóriák adataihoz szükséges DataContext objektum*/
     DBDataContext dc = new DBDataContext();

     /*LINQ lekérdezés*/
     var katlist = from c in dc.kategorias
     orderby c.nev ascending
     select c;
     TreeViewItem felso= null;
     foreach (kategoria kat in katlist)
     {
          /*Minden kategóriára, amelynek a szülője az üres kategória, meghatározza a leszármazott kategóriákat.*/
          if (kat.szulokategoriaID == new Guid(“D483E990-8F41-457D-ADC6-97E64AE2DE8C”))
          {
               felso= new TreeViewItem();
               felso.Header = kat.nev;
               if (kat.kategorias != null)
               {
                    AlKategoriak(kat, felso);
               }
               tvKategoriak.Items.Add(felso);
          }
     }
}

A teljes adatstruktúra TreeView-ba való megjelenítéséhez szükség van egy segédfüggvényre, ami a paraméterül kapott kategóriába (kat) tartozó alkategóriákat helyezi el a megfelelő TreeViewItem (csomopont) alá:

public void AlKategoriak(kategoria kat, TreeViewItem csomopont)
{
     /*Minden alkategóriát a csomopont alá helyez el, majd egy szinttel lejjebb található leszármazottakat keres*/
     foreach (kategoria c1 in kat.kategorias)
     {
          TreeViewItem alkategoria= new TreeViewItem();
          alkategoria.Header = c1.nev;
          csomopont.Items.Add(alkategoria);
          if (c1.kategorias != null)
          {
               AlKategoriak(c1, alkategoria);
          }
     }
}

Írta: Sallai Máté

MEGOSZTÁS

Ha tetszett a cikk, akkor nyugodtan oszd meg ismerőseiddel, valószínű ők is örülni fognak neki.

HOZZÁSZÓLÁS

Ha nem hagy nyugodni az, amit a cikkben olvastál, akkor nyugodtan írd meg kérdésed vagy észrevételed kommentbe. Így szerzőnk könnyen tud neked válaszolni.

Vélemény, hozzászólás?