在Silverlight3.0中,可以通过扩展DataPager控件来实现更复杂的分页功能。本文将介绍如何实现“显示X-Y条记录,共Z条”的功能。
在Silverlight中,DataPager控件用于对数据进行分页,并为数据绑定控件显示导航控件。它还可以显示文本,如“显示记录1-5,共12条”。
DataPager类用于分页数据,并为数据绑定控件显示导航控件。
PagedCollectionView表示用于对分页数据集合进行分组、排序、过滤和导航的视图。
资源字典是一个键值对字典,可以在XAML和代码中使用。XAML是最常见的用法,特别是用于最初定义资源字典中的对象资源。
为了实现显示记录数的功能,首先需要修改DataPager的默认样式,并添加一个TextBlock用于显示记录数。可以使用Expression Blend来修改DataPager的样式,手动编辑非常复杂且耗时。以下是所做的一些样式更改。
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SampleDataPager.App"
xmlns:test="clr-namespace:AdvancedDataPager;assembly=AdvancedDataPager"
xmlns:Control="clr-namespace:AdvancedDataPager;assembly=AdvancedDataPager">
<Application.Resources>
<ResourceDictionary>
...
<TextBlock x:Name="txtPage"
Grid.Column="10"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Margin="5,0,5,0"
Text="{Binding DisplayRecordsText, RelativeSource={RelativeSource TemplatedParent}}"/>
...
</ResourceDictionary>
</Application.Resources>
</Application>
为了测试分页功能,创建了一个Employee类来存储员工ID、姓名、部门和薪水等信息。
public class Employee
{
public int EmployeeID { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public double Salary { get; set; }
}
DataGrid控件用于以可定制的网格形式显示数据。
<sdk:DataGrid Name="grdEmployees"
Grid.Row="0"
AutoGenerateColumns="True"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"/>
为了实现分页功能,需要将AdvancedDataPager.dll的引用添加到项目中,并在Page.xaml中拖放DataPagerPlus控件。
<UserControl x:Class="SampleDataPager.MainPage"
xmlns:Control="clr-namespace:AdvancedDataPager;assembly=AdvancedDataPager"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
mc:Ignorable="d"
d:DesignHeight="400"
d:DesignWidth="500">
<Grid x:Name="LayoutRoot"
Background="White"
Width="500"
Height="400">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<sdk:DataGrid Name="grdEmployees"
Grid.Row="0"
AutoGenerateColumns="True"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"/>
<Control:DataPagerPlus Name="pagerEmployees"
Grid.Row="1"
PageSize="5"
VerticalAlignment="Top"
HorizontalAlignment="Stretch"/>
</Grid>
</UserControl>
在MainPage.xaml.cs中,需要绑定数据到DataGrid,并将其ItemSource分配给DataPagerPlus。
PagedCollectionView employees = new PagedCollectionView(Employees.Load());
grdEmployees.ItemsSource = employees;
pagerEmployees.Source = grdEmployees.ItemsSource;
Employees.Load()函数将返回员工的列表。
public class Employees : ObservableCollection<Employee>
{
public static ObservableCollection<Employee> Load()
{
ObservableCollection<Employee> objColEmp = new ObservableCollection<Employee>();
// 添加员工数据...
return objColEmp;
}
}
为了显示记录数,需要修改App.xaml中的Application.Resources。
<Application.Resources>
<ResourceDictionary>
<Style TargetType="Control:DataPagerPlus">
...
<TextBlock Grid.Column="10"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Margin="5,0,5,0"
Text="{Binding DisplayRecordsText, RelativeSource={RelativeSource TemplatedParent}}"/>
...
</Style>
</ResourceDictionary>
</Application.Resources>
为了扩展DataPager,需要创建一个DataPagerPlus类,并注册一个依赖属性来显示记录数。
public class DataPagerPlus : DataPager
{
// 创建依赖属性...
this.PageIndexChanged += new EventHandler(CustomPager_PageIndexChanged);
}
private void CustomPager_PageIndexChanged(object sender, EventArgs e)
{
SetDisplayRecordsText(sender);
}
private void SetDisplayRecordsText(object sender)
{
int RecordCount = (base.ItemCount == 0) ? ((PagedCollectionView)((DataPager)sender).Source).ItemCount : base.ItemCount;
int PageSize = base.PageSize;
int PageIndex = (base.PageIndex + 1);
int currentEndRow = (PageIndex * PageSize);
if (currentEndRow > RecordCount) currentEndRow = RecordCount;
if (currentEndRow < PageSize) PageSize = currentEndRow;
int currentStartRow = (RecordCount > 0) ? (currentEndRow - PageSize) + 1 : 0;
int TotalRecordsOnPage = (PageIndex * PageSize) - RecordCount;
currentStartRow = (TotalRecordsOnPage == 1) ? currentEndRow : ((PageIndex - 1) * PageSize) + 1;
this.DisplayRecordsText = string.Format("Displaying record(s) {0:0}-{1:0} of {2:0}", currentStartRow, currentEndRow, RecordCount);
}