Silverlight 数据分页控件扩展

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类

为了测试分页功能,创建了一个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; } }

修改Application.Resources以显示记录数

为了显示记录数,需要修改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

为了扩展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); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485