Практикум
Постраничный вывод
Теперь добавим элемент, который будет осуществлять Paging, т.е. постраничный вывод данных, разбитие их на страницы. Для этого служит элемент DataPager. Добавляем его на страницу:
<data:DataPager
Source="{Binding Data, ElementName=ProductsData}"
PageSize="10"Привязываем этот элемент к данным ProductsData, так же как привязывали данные к DataGrid.
Группировка
Теперь добавим возможность группировки данных. Это можно сделать в коде:
public MainPage()
{
InitializeComponent();
ProductsData.GroupDescriptors.Add(new GroupDescriptor("Color"));
}Можно в описании xaml, добавив как свойство GroupDescriptor из набора GroupDescriptors источника данных:
<ria:DomainDataSource
…
<ria:DomainDataSource.GroupDescriptors>
< riaData:GroupDescriptor PropertyPath="Color"/>
</ria:DomainDataSource.GroupDescriptors>
</ria:DomainDataSource>Полей для группировки может быть несколько:
<riaData:GroupDescriptor PropertyPath="ProductLine"/>
<riaData:GroupDescriptor PropertyPath="Color"/>
ProductsData.GroupDescriptors.Add(new GroupDescriptor("ProductLine"));
ProductsData.GroupDescriptors.Add(new GroupDescriptor("Color"));Это будет выглядеть так:
Фильтрация
Добавим на страницу xaml поле для ввода фильтра FilterText:
<TextBlock Text="Filter Name:"/> <TextBox x:Name="FilterText" TextChanged="FilterText_TextChanged"/>
В описание источника данных добавляем описание фильтра:
<ria:DomainDataSource
<ria:DomainDataSource.FilterDescriptors>
<riaData:FilterDescriptorCollection>
<riaData:FilterDescriptor
PropertyPath="Name"
Operator="Contains">
<riaData:ControlParameter
ControlName="Filter"
PropertyName="Text"
RefreshEventName="TextChanged" />
</riaData:FilterDescriptor>
</riaData:FilterDescriptorCollection>
</ria:DomainDataSource.FilterDescriptors>
</ria:DomainDataSource>Обратите внимание на атрибут Operator. RIA сервисы предлагают дополнительные условия фильтрации:
Либо в коде добавляем обработчик событий:
private void FilterText_TextChanged
(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
FilterDescriptorCollection fcollection =
new FilterDescriptorCollection();
FilterDescriptor fdescr =
new FilterDescriptor
("Name", FilterOperator.Contains, FilterText.Text);
fcollection.Add(fdescr);
ProductsData.FilterDescriptors = fcollection;
}Получаем работающий фильтр:
Теперь перейдем к изменению данных в таблице. Добавим в MainPage.xaml элемент управления DataForm:
<dataFormToolkit:DataForm
x:Name="productEditForm"
CurrentItem="{Binding
ElementName=productGrid, Path=SelectedItem}"
AutoCommit="False"
AutoEdit="True"
Header="Details"/>Как видно из описания, он привязан к другому элементу productGrid, и при выборе строки SelectedItem отображает содержимое всей строки таблицы базы данных.
Получается приложение такого вида:
Изменения данных (было Blue, стало Green ) отслеживаются этим элементом. Видно появление звездочки вверху элемента, кнопки OK и отмена активизировались и появились изменения в DataGrid. После нажатия кнопки OK изменения появятся и в источнике данных и. Можно тоже самое сделать с помощью кода. Для манипуляции с данными к этому добавим панель с кнопками, код C# и изменим описание DataForm. Добавим в DataForm:
<dataFormToolkit:DataForm
CommandButtonsVisibility="None"Добавим панель с кнопкой сохранения изменений:
<StackPanel Orientation="Horizontal"
Height="23"
VerticalAlignment="Bottom">
<Button Content="Save changes"
Click="Button_Click"/>
</StackPanel>И метод в код страницы:
private void Button_Click
(object sender, RoutedEventArgs e)
{
productEditForm.CommitEdit();
ProductsData.SubmitChanges();
}Для удаления строки добавим кнопку удалить со следующим описанием:
<Button Content="Delete"
Click="ButtonDelete_Click"/>private void ButtonDelete_Click(object sender, RoutedEventArgs e)
{
productEditForm.CommitEdit();
productEditForm.DeleteItem();
ProductsData.SubmitChanges();
}Заключение
На данном практическом занятии мы рассмотрели пример работы с базой данных MS SQL 2008, с таблицами, научились делать выборку, сортировать, группировать и фильтровать строки, удалять, изменять данные таблиц, а также, оценили роль .NET RIA Services, значительно упрощающих разработку приложения Silverlight. Исходный код данного примера приведен в файле DataBase.zip.



