Китай |
Практикум
Постраничный вывод
Теперь добавим элемент, который будет осуществлять 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.