您的位置:首页 > 其它

WPF 自定义分页控件DataPager.xaml

2016-11-15 13:10 621 查看
1、DataPager.xaml

<UserControl x:Class="Client.UserControls.DataPager"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="30" d:DesignWidth="850">
<UserControl.Resources>

<Style x:Key="gridIcon" TargetType="TextBlock">
<Setter Property="FontFamily" Value="iconfont"></Setter>
<Setter Property="Foreground" Value="#FF3498CE"></Setter>
<Setter Property="Padding" Value="5,7,5,5"></Setter>
<Setter Property="Cursor" Value="Hand"></Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#FFA336"></Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="#ccc"></Setter>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="pageNumber" TargetType="TextBlock">
<Setter Property="Padding" Value="5,5,5,5"></Setter>
<Setter Property="Foreground" Value="#FF3498CE"></Setter>
<Setter Property="Cursor" Value="Hand"></Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#FFA336"></Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="#FF02486E"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="400"></ColumnDefinition>
<ColumnDefinition MinWidth="450"></ColumnDefinition>
</Grid.ColumnDefinitions>
<WrapPanel Grid.Column="0" VerticalAlignment="Center">
<TextBlock Padding="5,5,5,5" Foreground="#FF02486E">当前显示第</TextBlock>
<TextBlock Name="PageIndexNumber" Padding="5,5,5,5" Foreground="#FF3498CE"></TextBlock>
<TextBlock Padding="5,5,5,5" Foreground="#FF02486E">页,每页</TextBlock>
<TextBlock Name="PageNumber" Padding="5,5,5,5" Foreground="#FF3498CE">20</TextBlock>
<TextBlock Padding="5,5,5,5" Foreground="#FF02486E">条/共</TextBlock>
<TextBlock Name="TotalNumber" Padding="5,5,5,5" Foreground="#FF3498CE">49</TextBlock>
<TextBlock Padding="5,5,5,5" Foreground="#FF02486E">条</TextBlock>
</WrapPanel>
<WrapPanel Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Right">
<TextBlock Name="BtnFirst" Style="{StaticResource gridIcon}" IsEnabled="False"></TextBlock>
<TextBlock Name="BtnPrev" Style="{StaticResource gridIcon}" IsEnabled="False"></TextBlock>
<Grid Name="GridGrid">
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource pageNumber}">1</TextBlock>
<TextBlock Style="{StaticResource pageNumber}">2</TextBlock>
<TextBlock Style="{StaticResource pageNumber}">3</TextBlock>
<TextBlock Style="{StaticResource pageNumber}">4</TextBlock>
<TextBlock Style="{StaticResource pageNumber}">5</TextBlock>
<TextBlock Style="{StaticResource pageNumber}">6</TextBlock>
<TextBlock Style="{StaticResource pageNumber}">7</TextBlock>
<TextBlock Style="{StaticResource pageNumber}">8</TextBlock>
<TextBlock Style="{StaticResource pageNumber}">9</TextBlock>
</StackPanel>
</Grid>
<TextBlock Name="BtnNext" Style="{StaticResource gridIcon}" IsEnabled="False"></TextBlock>
<TextBlock Name="BtnLast" Style="{StaticResource gridIcon}" IsEnabled="False"></TextBlock>
</WrapPanel>
</Grid>
</UserControl>


2、DataPager.xaml.cs

using System;
using System.Data;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace Client.UserControls
{
/// <summary>
/// DataPager.xaml 的交互逻辑
/// </summary>
public partial class DataPager : UserControl
{
public DataPager()
{
InitializeComponent();
this.Loaded += delegate
{
//首页
this.BtnFirst.MouseLeftButtonUp += btn_First_Click;
this.BtnFirst.MouseLeftButtonDown += btn_First_MouseLeftButtonDown;
//上一页
this.BtnPrev.MouseLeftButtonUp += btn_Prev_Click;
this.BtnPrev.MouseLeftButtonDown += btn_Prev_MouseLeftButtonDown;
//下一页
this.BtnNext.MouseLeftButtonUp += btn_Next_Click;
this.BtnNext.MouseLeftButtonDown += btn_Next_MouseLeftButtonDown;
//末页
this.BtnLast.MouseLeftButtonUp += btn_Last_Click;
this.BtnLast.MouseLeftButtonDown += btn_Last_MouseLeftButtonDown;
};
}
private DataTable _dt = new DataTable();
private int _pageNum;//每页显示条数
//   private int _pageIndex = 1;//当前页码
public int _pageIndex = 1;//当前页码
private int _maxIndex = 1;//总页数
private int _totalNum = 0;//总条数
private DataGrid _dg;
#region 初始化数据
public void ShowPages(DataGrid datagrid, DataTable datatable, int num)
{
if (datatable != null&&datatable.Rows.Count>0)
{
this._dt = datatable.Clone();
this._dg = datagrid;
this._pageNum = num;
this._pageIndex = 1;
this._totalNum = datatable.Rows.Count;
if ((datatable.Rows.Count % num) == 0)
{
this._maxIndex = datatable.Rows.Count / num;
}
else
{
this._maxIndex = (datatable.Rows.Count / num) + 1;
}
foreach (DataRow dr in datatable.Rows)
{
this._dt.ImportRow(dr);
}
}
ReadDataTable();
}
#endregion
#region 读取数据
private void ReadDataTable()
{
try
{
DataTable tmpTable=_dt.Clone();
int first = this._pageNum * (this._pageIndex - 1);
first = (first > 0) ? first : 0;
if (this._dt.Rows.Count >= this._pageNum * this._pageIndex)
{
for (int i = first; i < this._pageNum * this._pageIndex; i++)
{
tmpTable.ImportRow(this._dt.Rows[i]);
}
}
else
{
for (int i = first; i < this._dt.Rows.Count; i++)
{
tmpTable.ImportRow(this._dt.Rows[i]);
}
}
this._dg.ItemsSource = tmpTable.DefaultView;
tmpTable.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
DisplayPagingInfo();
}
}
#endregion
#region 显示数据
private void DisplayPagingInfo()
{
if (this._pageIndex == 1)
{
this.BtnFirst.IsEnabled = false;
this.BtnPrev.IsEnabled = false;
}
else
{
this.BtnFirst.IsEnabled = true;
this.BtnPrev.IsEnabled = true;
}
if (this._pageIndex == this._maxIndex)
{
this.BtnNext.IsEnabled = false;
this.BtnLast.IsEnabled = false;
}
else
{
this.BtnLast.IsEnabled = true;
this.BtnNext.IsEnabled = true;
}
//this.txt_Record.Text = string.Format("每页{0}条/共{1}条", this.pageNum, this.totalNum);
this.PageNumber.Text = this._pageNum.ToString();
this.TotalNumber.Text = this._totalNum.ToString();
this.PageIndexNumber.Text = this._pageIndex.ToString();
int first = (this._pageIndex - 4) > 0 ? (this._pageIndex - 4) : 1;
int last = (first + 9) > this._maxIndex ? this._maxIndex : (first + 9);
this.GridGrid.Children.Clear();
for (int i = first; i <= last; i++)
{
ColumnDefinition col = new ColumnDefinition();
this.GridGrid.ColumnDefinitions.Add(col);
TextBlock tb = new TextBlock();
tb.Text = i.ToString();
//tb.Width = 40;
tb.Style = FindResource("pageNumber") as Style;
tb.MouseLeftButtonDown += new MouseButtonEventHandler(tb_MouseLeftButtonDown);
tb.MouseLeftButtonUp += new MouseButtonEventHandler(tb_MouseLeftButtonUp);
if (i == this._pageIndex)
{
tb.IsEnabled = false;
}
Grid.SetColumn(tb, this.GridGrid.ColumnDefinitions.Count - 1);
Grid.SetRow(tb, 0);
this.GridGrid.Children.Add(tb);
}
}

void tb_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
TextBlock tb = sender as TextBlock;
if (tb == null)
{
return;
}
int index = int.Parse(tb.Text.ToString());
this._pageIndex = index;
if (index > this._maxIndex)
{
this._pageIndex = this._maxIndex;
}
if (index < 1)
{
this._pageIndex = 1;
}
ReadDataTable();
}

void tb_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}
#endregion
#region 首页
void btn_First_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}

void btn_First_Click(object sender, EventArgs e)
{
this._pageIndex = 1;
ReadDataTable();
}
#endregion
#region 上一页
void btn_Prev_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}

void btn_Prev_Click(object sender, EventArgs e)
{
if (this._pageIndex <= 1)
{
return;
}
this._pageIndex--;
ReadDataTable();
}
#endregion
#region 下一页
void btn_Next_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}

void btn_Next_Click(object sender, EventArgs e)
{
if (this._pageIndex >= this._maxIndex)
{
return;
}
this._pageIndex++;
ReadDataTable();
}
#endregion
#region 末页
void btn_Last_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}

void btn_Last_Click(object sender, EventArgs e)
{
this._pageIndex = this._maxIndex;
ReadDataTable();
}
#endregion
}
}


3、调用:

界面前台引用:
xmlns:local="clr-namespace:Client.UserControls"


分页控件显示:
<local:DataPager x:Name="pagnav"></local:DataPager>


后台调用分页方法(调用WebApi接口):

Dictionary

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Text;
using System.Threading.Tasks;
using Ruang.Extend;

namespace Client.Backend
{
/// <summary>
/// API调用基础类
/// </summary>
public class ApiCaller
{
private static readonly string BaseUri = ConfigurationManager.AppSettings["ApiUri"];
/// <summary>
/// GET请求--异步方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="action">方法</param>
/// <param name="param">参数</param>
/// <returns></returns>
public static async Task<T> TryGetAsync<T>(string action, Dictionary<string, string> param) where T : class
{
using (HttpClient client = new HttpClient())
{
//基地址/域名
client.BaseAddress = new Uri(BaseUri);
//设定传输格式为json
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

StringBuilder strUri = new StringBuilder();
//方法
strUri.AppendFormat("{0}?", action);
//参数
if (param.Count > 0)
{
foreach (KeyValuePair<string, string> pair in param)
{
strUri.AppendFormat("{0}={1}&&", pair.Key, pair.Value);
}
strUri.Remove(strUri.Length - 2, 2);//去掉'&&'
}
else
{
strUri.Remove(strUri.Length - 1, 1);//去掉'?'
}
HttpResponseMessage response = await client.GetAsync(strUri.ToString());
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
return JSONHelper.GetObjectFromJson<T>(result);
}
else
{
return null;
}
}
}
/// <summary>
/// 无参数GET请求--异步方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="action"></param>
/// <returns></returns>
public static async Task<T> TryGetAsync<T>(string action) where T : class
{
using (HttpClient client = new HttpClient())
{
//基地址/域名
client.BaseAddress = new Uri(BaseUri);
//设定传输格式为json
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = await client.GetAsync(action);
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
return JSONHelper.GetObjectFromJson<T>(result);
}
else
{
return null;
}
}
}

/// <summary>
/// POST请求--异步方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="action">方法</param>
/// <param name="param">参数</param>
/// <returns></returns>
public static async Task<T> TryPostAsync<T>(string action, object param) where T : class
{
using (HttpClient client = new HttpClient())
{
//基地址/域名
client.BaseAddress = new Uri(BaseUri);
//设定传输格式为json
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = await client.PostAsync(action, param, new JsonMediaTypeFormatter());
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
return JSONHelper.GetObjectFromJson<T>(result);
}
else
{
return null;
}
}
}

/// <summary>
/// GET请求--同步方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="action">方法</param>
/// <param name="param">参数</param>
/// <returns></returns>
public static T TryGet<T>(string action, Dictionary<string, string> param) where T : class
{
using (HttpClient client = new HttpClient())
{
//基地址/域名
client.BaseAddress = new Uri(BaseUri);
//设定传输格式为json
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

StringBuilder strUri = new StringBuilder();
//方法
strUri.AppendFormat("{0}?", action);
//参数
if (param.Count > 0)
{
foreach (KeyValuePair<string, string> pair in param)
{
strUri.AppendFormat("{0}={1}&&", pair.Key, pair.Value);
}
strUri.Remove(strUri.Length - 2, 2);//去掉'&&'
}
else
{
strUri.Remove(strUri.Length - 1, 1);//去掉'?'
}
HttpResponseMessage response = client.GetAsync(strUri.ToString()).Result;
if (response.IsSuccessStatusCode)
{
string result = response.Content.ReadAsStringAsync().Result;
return JSONHelper.GetObjectFromJson<T>(result);
}
else
{
return null;
}
}
}

/// <summary>
/// POST请求--同步方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="action">方法</param>
/// <param name="param">参数</param>
/// <returns></returns>
public static T TryPost<T>(string action, object param) where T : class
{
using (HttpClient client = new HttpClient())
{
//基地址/域名
client.BaseAddress = new Uri(BaseUri);
//设定传输格式为json
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = client.PostAsync(action, param, new JsonMediaTypeFormatter()).Result;
if (response.IsSuccessStatusCode)
{
string result = response.Content.ReadAsStringAsync().Result;
return JSONHelper.GetObjectFromJson<T>(result);
}
else
{
return null;
}
}
}
}
}


5、webapi分页接口类:

using RGang.BizLogic;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace API.Controllers
{
/// <summary>
/// 分页
/// </summary>
public class PageController : ApiController
{
#region 分页
/// <summary>
/// 分页
/// </summary>
/// <param name="rolename">字段(逗号隔开)</param>
/// <param name="pagesize">每页条数</param>
/// <param name="currentpage">当前页数</param>
/// <param name="tablename">表名</param>
/// <param name="uniquefield">唯一标识</param>
/// <param name="where">条件</param>
/// <param name="orderby">排序</param>
/// <returns></returns>
[AcceptVerbs("GET")]
public DataTable GetPage(string rolename, int pagesize, int currentpage, string tablename, string uniquefield, string where, string orderby)
{
//    DBHelper.GetDataByPage("RowGuid",2,1, "INFO_MobileClient","RowGuid"," 1=1 ", " order by OperationDate desc");
int _totalnum;
DataTable dt = DB.GetData_Page(rolename, pagesize, currentpage, tablename, uniquefield, where, orderby, out _totalnum);
return dt;
}
#endregion
}
}


public static DataTable GetData_Page(string RoleName, int PageSize, int CurrPage, string TableName, string UniqueField, string Where, string OrderBy, out int TotalNum)
{
if (!Where.TrimStart(new char[0]).ToLower().StartsWith("where"))
{
Where = " where " + Where;
}
if (!(!(OrderBy.Trim() != "") || OrderBy.TrimStart(new char[0]).ToLower().StartsWith("order by")))
{
OrderBy = " order By " + OrderBy;
}
DataTable table = null;
Database database = DatabaseFactory.CreateDatabase(Conn.GetConnectionStringName("RongGuangMis_ConnectionString"));
if (database.DbProviderFactory.ToString() == "System.Data.OracleClient.OracleClientFactory")
{
string str = "select " + RoleName + " from " + TableName + " " + Where + " " + OrderBy;
string query = "select " + RoleName + " from ( select row_.*, rownum rownum_ from (" + str + ") row_  where rownum <= " + Convert.ToString((int)(CurrPage * PageSize)) + ")  where rownum_ >" + Convert.ToString((int)((CurrPage - 1) * PageSize));
DbCommand sqlStringCommand = database.GetSqlStringCommand(query);
table = database.ExecuteDataSet(sqlStringCommand).Tables[0];
string str3 = "select count(*) from " + TableName + " " + Where;
sqlStringCommand = database.GetSqlStringCommand(str3);
TotalNum = Convert.ToInt32(database.ExecuteScalar(sqlStringCommand));
return table;
}
DBOperate operate = new DBOperate(Conn.GetConnectionStringName());
return operate.GetData_Page(RoleName, PageSize, CurrPage, TableName, UniqueField, Where, OrderBy, out TotalNum);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分页 wpf 控件