Új hozzászólás Aktív témák

  • Gregorius

    őstag

    válasz yash #850 üzenetére

    Felteszem a VS 2008 SP1-et már telepítetted. Ha nem, pótold.
    Az alapok:
    1. Végy egy projektet
    2. Adj hozzá egy új elemet: LINQ to SQL Classes. (Az ADO.NET Entity Data Model is hasonló célú, de a LINQ to SQL könnyebb és gyorsabb egyszerű adatbáziskezelésre, bár van benne néhány kellemetlenség, amit egyre fárasztóbb körbelőni, ahogy bonyolódik az alkalmazásod.) Ne felejts el nevet adni a fájlnak, legyen mondjuk EShop.dbml.
    3. Kapsz egy üres felületet. Tanács szerint nyisd meg a Server Explorert, ha itt nem látod az adatbázisod, akkor fent ott van a "Connect to Database" gombóc, azzal hozzá kell adni. Majd ugyanebben az ablakban maradva kiválogatod, hogy az adatbázisokból mivel akarsz foglalkozni és egyszerűen ráhúzod az üres felületre. Mentés, bezárás.

    És ennyi, az infrastruktúra egyik fele készen van. A következő módon tudsz pl. egy tábla tartalmából listát csinálni:

    List<Customers> customers;
    using( var db = new EShopDataClasses() )
    {
    customers = db.Customers.ToList();
    }

    A WPF oldal egy kicsit gáz, ugyanis habár a WPF-nek ezerszer jobb (lesz) az adatkötése (mihelyst rendes designer támogatás is lesz hozzá), utolsó értesüléseim szerint a WPF még nem rendelkezik olyan szofisztikált griddel, mint a WinForms. (A CodePlexen már van valami előzetes változat, amibe csak beledobod az adatot és mindent elintéz, de még nem az igazi) Úgyhogy inkább dolgozzunk azzal, amink van és csináljunk egy egyszerű megjelenített listát, amiben még csak lépkedni sem lehet kurzorral.
    Ha WPF appot hoztál létre, akkor elvileg már van egy Window1.xaml-ed, használjuk ezt. Fejléc is kell, úgyhogy egy StackPanelben egymás alá rakjuk a fejlécet és egy ItemsControlt, ami a lista elemeit jeleníti meg. (Haladóknak van HeaderedItemsControl, de ott stílusokkal is kell vacakolni.) Kissé fapados és kézihajtányos, de erre a célra most jó lesz.
    Lévén szeretnénk ha a fejléc és a tartalom nem csúszna el egymástól, mindkét helyen egy gridet fogunk használni közös méretezéssel. Az egyszerűség kedvéért most csak két oszlopot csinálok meg. A fejléc grid így néz ki:

    <Grid>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100" />
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" Text="Customer ID" />
    <TextBlock Grid.Column="1" Text="Company name" />
    </Grid>

    A tartalomsablon szinte azonos vele:

    <Grid>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100" />
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" Text="{Binding CustomerID}" />
    <TextBlock Grid.Column="1" Text="{Binding CompanyName}" />
    </Grid>

    Ahol a Binding mondja meg, hogy oda majd a CustomerID illetve a CompanyName mező kerül. A fix méretezés kicsit gáz, rá lehet venni a grideket, hogy együtt méreteződjenek, de az már a haladó kurzus része.
    Az egész összeépítve:

    <StackPanel>
    <Grid>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100" />
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" Text="Customer ID" />
    <TextBlock Grid.Column="1" Text="Company name" />
    </Grid>
    <ItemsControl Name="DataList" ItemsSource="{Binding}">
    <ItemsControl.ItemTemplate>
    <DataTemplate>
    <Grid>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100"/>
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" Text="{Binding CustomerID}" />
    <TextBlock Grid.Column="1" Text="{Binding CompanyName}" />
    </Grid>
    </DataTemplate>
    </ItemsControl.ItemTemplate>
    </ItemsControl>
    </StackPanel>

    Itt két dolog van, amit még nem érintettem: az ItemsControlon a Name teszi lehetővé, hogy kódból hivatkozzunk rá, továbbá még meg kell adni az ItemsControlnak, hogy az elemeit honnan vegye. Ez legyen egyszerűen {Binding}, akkor a saját DataContext-jéből veszi az elemeket, azt pedig kódból máris beállítjuk a főablak Loaded eseménykezelőjében, itt ér össze a WPF és a fentebb lekért adat:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
    using( var db = new EShopDataContext() )
    {
    this.DataList.DataContext = db.Customers.Take(10).ToList();
    }
    }

    És már készen is vagyunk, el lehet indítani, lehet csodálkozni vagy borzonkodni a gagyi adatlistánkon. Hogy ne hányja tele a képernyőt csak az első 10 rekordot kéri le a fenti kód. Ha az összes kell, egyszerűen töröld ki a Take(10)-et, viszont akkor úgy kell módosítani a layoutot is, hogy működjön a scrollozás.

    Ha esetleg komolyabb adatkezelő projektbe fogsz, akkor a WPF-et a helyedben inkább hanyagolnám és maradnék WinForms alatt, ott használható az ArchElf által emlegetett DataGridView is, azt meg úgy szabhatod testre, ahogy tetszik.

Új hozzászólás Aktív témák