WPF i LINQ to SQL II dio- grouping, filtering, sorting


U prethodnom postu smo vidjeli jedan od načina povezivanja WPF aplikacije sa bazom podataka preko LINQ to SQL. Naše putovanje ide dalje, a ovaj put obradićemo grupiranje, filtriranje i sortiranje. Tutorijal startamo tamo gdje smo stali u prethodnom postu.

Grupiranje podataka

Za razliku od WindowsFormsa u WPF je moguće na vrlo jednostavan način implementirati grupiranje podataka u listbox kontroli. Obzirom da naša listbox kontrola prikazuje samo jednu stavku potrebno ju je kastomizirati. Da bi prikazali više stavki (više kolona i tabele) u listbox kontroli potrebno je implementirati šablon podataka odnosno DataTemplate. Data template nije ništa drugo nego struktura u kojoj je definisano kako treba da izgleda pojedinačna stavka u listi. Kako bi implementirali grupiranje potrebno je, takodjer definisati šablon grupiranja podataka.

U listbox kontroli definisaćemo DataTemplate koji će prikazati DateOrder i ShipPostalCode, a grupiranje ćemo definisati po DateOrder. DataTemplate prikazan je na sljedećoj slici:

<DataTemplate x:Key="sablonPodataka">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="{Binding Path=OrderDate}"/>
        <TextBlock Text="{Binding Path=ShipPostalCode}"/>
    </StackPanel>
</DataTemplate>

Gornji listing prikazuje StackPanel u kojem se vertikalno poravnavaju dvije tektualne kontrole koje su povezane sa kolonama OrderDate i ShipPostalCode.

DataTemplate grupirane liste definisan je sljedećim DataTemplateom

<DataTemplate x:Key="sablonGrupiranihPodataka">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Foreground="Red"/>
    </StackPanel>
</DataTemplate>

Ovdje je nešto drugačija situacija. Zaglavlje grupiranja sastoji se samo od jedne tekstualne kontrole ali ova kontrola je povezana sa nazivom osobine (PropertyName) objekta PropertyGroupDescription klase. Ova dva šablona definisali smo u resursu Windowsa, da bi bili dostupni u kontrolama koje su definisane. Definisane šablone potrebno je još povezati sa listbox kontrolom. Obzirom da listbox kontrola po defaultu prikazuje samo jednu stavku i to onu koja je definisana preko DisplayMemberPath osobine, potrebno je ovu osobinu zamjeniti sa novom ItemTemplate koja ima referencu na DataTemplate koji smo definisali na samom početku.

Pored toga, listbox kontroli potrebo je definisati Stil grupiranja koji će imati referencu na drugi šablon kojeg smo formirali. Sve rečeno prikazano je na listingu:

<ListBox Name="listBox1" Grid.RowSpan="6" Grid.Row="3"
         IsSynchronizedWithCurrentItem="True"
         ItemsSource="{Binding Source={StaticResource listaNarudzbi}}"
         ItemTemplate="{StaticResource sablonPodataka}" Grid.ColumnSpan="2">
    <ListBox.GroupStyle>
        <GroupStyle HeaderTemplate="{StaticResource sablonGrupiranihPodataka}" />
    </ListBox.GroupStyle>
</ListBox>

Kada smo definisali prethodne korake naša aplikacija je spremna za grupiranje podataka. Sada je još potrebno implementirati logiku odnosno opciju za grupiranje podataka. U tom smislu definisaćemo Checkbox dugme kojim ćemo grupirati odnosno degrupirati podatke u listbox kontroli. CheckBox dugme postavićemo kao na slici dolje, te mu implementirati dogadjaje Checked i UnChecked .

image

Implementacija dogadjaja sastoji se u formiranju PropertyGroupDescription objekta i postavljanjem Naziva grupirane kolone OrderDate. Zatim novoformirani objekat pridodajemo u kolekciju grupiranja koja je definisana u defaultView objektu.

Kada želimo grupiranje ukloniti potrebno je iz kolekcije izbaciti objekt za grupiranje. Implementacija se nalazi na sljedećem listingu.

//Grupiranje podataka
private void button3_Checked(object sender, RoutedEventArgs e)
{
    PropertyGroupDescription groupDesc = new PropertyGroupDescription("OrderDate");
    defaultView.GroupDescriptions.Add(groupDesc);
}
//De grupiranje podataka
private void button3_Unchecked(object sender, RoutedEventArgs e)
{
    defaultView.GroupDescriptions.Clear();
}

Pokrenimo aplikaciju te isprobajmo kako grupiranje radi.

Filtriranje podataka

Sljedeća implementacija sastoji se u filtriranju podataka. Filtriranje podataka postižemo definišući osobinu (Property) Filter objekta defaultView. Za ovu implementaciju definisaćemo edit kontrolu koja će filtrirati narudžbe po poštanskom broju (ShiPostalCode). Prilikom kucanja poštanskog broja stavke u listbox kontroli će se filtrirati na osnovu unešenog broja. Edit kontrola prikazana ja na sljedećoj slici:

image

Implementacija filtriranja stavki po poštanskom broju prikazan je na sljedećem listingu:

//Filtriranje podataka u listi
private void textBox6_TextChanged(object sender, TextChangedEventArgs e)
{
    string text = this.textBox6.Text.ToLowerInvariant();
    if (defaultView.CanFilter)
        defaultView.Filter = delegate(object obj)
        {
            Order narudzba = obj as Order;

            if (narudzba != null && narudzba.ShipPostalCode != null)
                return narudzba.ShipPostalCode.ToLowerInvariant().Contains(text);
            return false;
        };
}

Filter smo definisanli delagatom koji za parametar uzima narudžbu iz liste, te provjerava da li sadrži definisani text, te vraća true ako postoji traženi text, inače vraća false.

Sortiranje podataka

Slično kao i kod grupiranja sortiranje definišemo preko objekta ListCollectionView podešavanje propertya SortDescriptions. Sljedeći listing prikazuje sortiranje po datumu te u drugoj metodi uklanjamo sortiranje definisano prethodno.

//Sortiranje po datumu
private void checkBox1_Checked(object sender, RoutedEventArgs e)
{
   SortDescription sortiranjePoDatumu=new SortDescription("OrderDate",ListSortDirection.Ascending);
   defaultView.SortDescriptions.Add(sortiranjePoDatumu);
}
//Resetovanje sortiranje na početno
private void checkBox1_Unchecked(object sender, RoutedEventArgs e)
{
    defaultView.SortDescriptions.Clear();
}

Na sljedećoj slici prikazan je checkbox preko kojeg definišemo sortiranje podataka, Kada otkačimo checkbox sortiranje se resetuje.

image

Ovim smo završili našu implementcaiju grupiranja i sortiranja podatka. Izvorni kod za ovaj primjer dat je na ovom linku.

About Bahrudin Hrnjica

PhD in Mechanical Engineering, Microsoft MVP for .NET. Likes .NET, Math, Mechanical Engineering, Evolutionary Algorithms, Blogging.

Posted on 21/01/2009, in .NET, C#, WPF and tagged , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s