RaUI/Source/ryControls/Controls/ctlMyPage.cs
鑫Intel 966ebb0259 ### 2022-02-09更新
------
#### MyDbV4    V3.0.2202.0901
- *.[改进]新增ToNString扩展函数,支持将数字转换成小数点末尾不带0的字符串。
2022-02-11 16:56:56 +08:00

614 lines
24 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//--------------------------日期:2014-03-18
//--------------------------版本:2.0.5.0
//--------------------------作者:itrycn
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
#pragma warning disable IDE1006 // 命名样式
namespace MyPage
{
/// <summary>
/// 分页控件
/// </summary>
[DefaultEvent("OnPageChange")]
[Description("分页控件")]
public partial class ctlMyPage : UserControl
{
//public delegate void TimeHandler(object sender, TimeInfo e);
//public delegate void SomeHandler(object sender, DataTable e);
/// <summary>
/// 首页文本
/// </summary>
[Description("首页文本")]
public string T_FirstCaption
{
get { return LblStartPage.Text; }
set { LblStartPage.Text = value; ChangePosition(); }
}
/// <summary>
/// 上一页文本
/// </summary>
[Description("上一页文本")]
public string T_PreCaption
{
get { return LblPre.Text; }
set { LblPre.Text = value; ChangePosition(); }
}
/// <summary>
/// 下一页文本
/// </summary>
[Description("下一页文本")]
public string T_NextCaption
{
get { return LblNext.Text; }
set { LblNext.Text = value; ChangePosition(); }
}
/// <summary>
/// 末页文本
/// </summary>
[Description("末页文本")]
public string T_LastCaption
{
get { return LblLast.Text; }
set { LblLast.Text = value; ChangePosition(); }
}
/// <summary>
/// 跳页文本
/// </summary>
[Description("跳页文本")]
public string T_SkipCaption
{
get { return label1.Text; }
set { label1.Text = value; ChangePosition(); }
}
private string m_TipCaption = "{pageindex}/{pagecount} 页,共 {recordcount} 条记录,每页 {pagesize} 条";
/// <summary>
/// 页面信息文本
/// </summary>
[Description("页面信息文本")]
public string T_TipCaption
{
get { return m_TipCaption; }
set { m_TipCaption = value; ChangePosition(); }
}
private object[] m_Parameters;
/// <summary>
/// 存储SQL参数
/// </summary>
[Description("存储SQL参数")]
public object[] T_Parameters
{
get { return m_Parameters; }
set { m_Parameters = value; }
}
private int m_CurrPageIndex = 0; //当前页数
/// <summary>
/// 最后一页的页码
/// </summary>
[Description("最后一页的页码")]
public int T_LastPageIndex
{
get { return m_PageCount; }
}
/// <summary>
/// 在发生页码变化时激发
/// </summary>
[Description("在发生页码变化时激发")]
public event EventHandler OnPageChange;
/// <summary>
/// 在发生页码变化前激发
/// </summary>
[Description("在发生页码变化前激发")]
public event CancelEventHandler OnBeforePageChange;
private string GetTipCaption(string sText)
{
//{pagecount}表示页数,{recordcount}表示记录总数,{pagesize}表示页面大小,{pageindex}
string tmpText = sText.Replace("{pagecount}", m_PageCount.ToString());
tmpText = tmpText.Replace("{recordcount}", m_RecordCount.ToString());
tmpText = tmpText.Replace("{pagesize}", m_PageSize.ToString());
tmpText = tmpText.Replace("{pageindex}", m_CurrPageIndex.ToString());
return tmpText;
}
private void ChangePosition()
{
LblPre.Left = LblStartPage.Left + LblStartPage.Width + 5;
LblNext.Left = LblPre.Left + LblPre.Width + 5;
LblLast.Left = LblNext.Left + LblNext.Width + 5;
label1.Left = LblLast.Left + LblLast.Width + 5;
NumPage.Left = label1.Left + label1.Width + 5;
lblTip.Left = NumPage.Left + NumPage.Width + 10;
lblTip.Text = GetTipCaption(m_TipCaption);
}
private void ChangeState()
{
lblTip.Text = GetTipCaption(m_TipCaption);
//m_CurrPageIndex + "/" + m_PageCount + " 页,共 " + m_RecordCount + " 条记录,每页 " + m_PageSize + " 条"
if (m_CurrPageIndex == 1) //如果当前在第一页
{
LblStartPage.Enabled = false;
LblPre.Enabled = false;
if (m_PageCount > 1) { LblNext.Enabled = true; } else { LblNext.Enabled = false; }
if (m_PageCount > 1) { LblLast.Enabled = true; } else { LblLast.Enabled = false; }
}
else if (m_CurrPageIndex == m_PageCount) //如果当前在最后一页
{
LblNext.Enabled = false;
LblLast.Enabled = false;
if (m_PageCount > 1) { LblStartPage.Enabled = true; } else { LblStartPage.Enabled = false; }
if (m_PageCount > 1) { LblPre.Enabled = true; } else { LblPre.Enabled = false; }
}
else if (m_CurrPageIndex <= 0) //如果当前没页数
{
LblStartPage.Enabled = false;
LblPre.Enabled = false;
LblNext.Enabled = false;
LblLast.Enabled = false;
}
else
{
LblStartPage.Enabled = true;
LblPre.Enabled = true;
LblNext.Enabled = true;
LblLast.Enabled = true;
}
}
private int m_PageSize = 50;
/// <summary>
/// 设置/返回每页显示的量大小
/// </summary>
[Description("设置/返回每页显示的量大小")]
public int PageSize
{
get { if (m_PageSize <= 0) { m_PageSize = 50; } return m_PageSize; }
set
{
m_PageSize = value;
m_PageCount = Convert.ToInt32(Math.Ceiling((float)m_RecordCount / (float)PageSize).ToString());
}
}
private int m_RecordCount = 0;
private int m_PageCount = 0;
/// <summary>
/// 设置/返回记录总数
/// </summary>
[Description("设置/返回记录总数")]
public int RecordCount
{
get { return m_RecordCount; }
set
{
m_RecordCount = value;
m_PageCount = Convert.ToInt32(Math.Ceiling((float)m_RecordCount / (float)PageSize).ToString());
}
}
private string m_SQLText = "";
/// <summary>
/// 设置/返回分页SQL语句,{pagecount}表示页数,{recordcount}表示记录总数,{pagesize}表示页面大小,
/// {pageindex}表示当前页数,{recordnum}表示当前页记录数,{pageendnum}表示当前页最后一条记录的记录数
/// </summary>
[Description("设置/返回分页SQL语句,{pagecount}表示页数,{recordcount}表示记录总数,{pagesize}表示页面大小,{pageindex}表示当前页数,{recordnum}表示当前页记录数,{pageendnum}表示当前页最后一条记录的记录数")]
public string SQLText
{
get
{
return m_SQLText;
}
set { m_SQLText = value; }
}
private string m_SQLText2 = "";
/// <summary>
/// 设置/返回当{recordnum}小于等于0时的分页SQL语句(比如第一页),如果为空则默认使用SQLText值。{pagecount}表示页数,
/// {recordcount}表示记录总数,{pagesize}表示页面大小,{pageindex}表示当前页数,{recordnum}表示当前页记录数,{pageendnum}表示当前页最后一条记录的记录数
/// </summary>
[Description("设置/返回当{recordnum}小于等于0时的分页SQL语句,如果为空则默认使用SQLText值。{pagecount}表示页数,{recordcount}表示记录总数,{pagesize}表示页面大小,{pageindex}表示当前页数,{recordnum}表示当前页记录数,{pageendnum}表示当前页最后一条记录的记录数")]
public string SQLText2
{
get
{
return m_SQLText2;
}
set { m_SQLText2 = value; }
}
/// <summary>
/// 获取当前页码
/// </summary>
/// <returns></returns>
public int GetCurrPageIndex()
{
return m_CurrPageIndex;
}
/// <summary>
/// 设置分页语句
/// </summary>
/// <param name="dp">数据库类型</param>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,以及不包含排序语句;,如果不存在条件判断语句,请为空</param>
/// <param name="OrderBySQL">排序语句必须包含Order By;,如果不存在排序语句,请为空</param>
/// <returns></returns>
public int SetPageSQL(ryCommonDb.DataProvider.DataProviderType dp, string tableName, string whereSQL, string OrderBySQL)
{
switch(dp)
{
case ryCommonDb.DataProvider.DataProviderType.MySqlDataProvider:
SetPageSQLByMySQL(tableName, whereSQL, OrderBySQL);
return 1;
case ryCommonDb.DataProvider.DataProviderType.SQLiteDataProvider:
SetPageSQLBySQLite(tableName, whereSQL, OrderBySQL);
return 1;
case ryCommonDb.DataProvider.DataProviderType.SqlDataProvider:
SetPageSQLByMSSQL(tableName, whereSQL, OrderBySQL);
return 1;
default:
return -1;
}
}
/// <summary>
/// 获取数据库指定条件的记录总数
/// </summary>
/// <param name="dp">数据库类型</param>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,以及不包含排序语句;,如果不存在条件判断语句,请为空</param>
/// <returns></returns>
public string GetPageCountSQL(ryCommonDb.DataProvider.DataProviderType dp, string tableName, string whereSQL)
{
switch (dp)
{
case ryCommonDb.DataProvider.DataProviderType.MySqlDataProvider:
return GetPageCountSQLByMySQL(tableName, whereSQL);
case ryCommonDb.DataProvider.DataProviderType.SQLiteDataProvider:
return GetPageCountSQLBySQLite(tableName, whereSQL);
case ryCommonDb.DataProvider.DataProviderType.SqlDataProvider:
return GetPageCountSQLByMSSQL(tableName, whereSQL,"");
default:
return "";
}
}
/// <summary>
/// 设置分页语句为MySQL分页语句
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,以及不包含排序语句;,如果不存在条件判断语句,请为空</param>
/// <param name="OrderBySQL">排序语句必须包含Order By;,如果不存在排序语句,请为空</param>
/// <returns></returns>
public int SetPageSQLByMySQL(string tableName, string whereSQL, string OrderBySQL)
{
string m_where = "";
if (whereSQL.Length>0)
{
m_where = " where " + whereSQL;
}
string m_order = "";
if (OrderBySQL.Length > 0)
{
m_order = " (" + OrderBySQL + ")";
}
m_SQLText = "select * from " + tableName + m_where + m_order + " limit {pagesize} offset {recordnum}";
m_SQLText2 = "";
return 1;
}
/// <summary>
/// 获取MySQL数据库指定条件的记录总数
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,以及不包含排序语句;,如果不存在条件判断语句,请为空</param>
/// <returns></returns>
public string GetPageCountSQLByMySQL(string tableName, string whereSQL)
{
string m_where = "";
if (whereSQL.Length > 0)
{
m_where = " where " + whereSQL;
}
return "select count(*) from " + tableName + m_where;
}
/// <summary>
/// 设置分页语句为MSSQL分页语句
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,以及不包含排序语句;,如果不存在条件判断语句,请为空</param>
/// <param name="OrderBySQL">排序语句必须包含Order By;,如果不存在排序语句,请为空</param>
/// <returns></returns>
public int SetPageSQLByMSSQL(string tableName, string whereSQL, string OrderBySQL)
{
string m_where = "";
if (whereSQL.Length > 0)
{
m_where = " where " + whereSQL;
}
string m_order = "(order by id)";
if (OrderBySQL.Length > 0)
{
m_order = "(" + OrderBySQL + ")";
}
m_SQLText = "select * from (select *,(ROW_NUMBER() OVER"+m_order+")as myrow from " + tableName + m_where + ") as t where t.myrow between {recordnum1} and {pageendnum1}";
return 1;
}
/// <summary>
/// 获取MSSQL数据库指定条件的记录总数
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,以及不包含排序语句;,如果不存在条件判断语句,请为空</param>
/// <param name="OrderBySQL">排序语句必须包含Order By;,如果不存在排序语句,请为空</param>
/// <returns></returns>
public string GetPageCountSQLByMSSQL(string tableName, string whereSQL, string OrderBySQL)
{
string m_where = "";
if (whereSQL != "")
{
m_where = " where " + whereSQL;
}
string m_order = "(order by id)";
if (OrderBySQL != "")
{
m_order = "(" + OrderBySQL + ")";
}
return "select count(*) from (select *,(ROW_NUMBER() OVER" + m_order + ") as myrow from " + tableName + m_where + ") as t";
}
/// <summary>
/// 设置分页语句为SQLite分页语句
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,以及不包含排序语句;,如果不存在条件判断语句,请为空</param>
/// <param name="OrderBySQL">排序语句必须包含Order By;,如果不存在排序语句,请为空</param>
/// <returns></returns>
public int SetPageSQLBySQLite(string tableName, string whereSQL, string OrderBySQL)
{
string m_where = "";
if (whereSQL.Length > 0)
{
m_where = " where " + whereSQL;
}
string m_order = "";
if (OrderBySQL.Length > 0)
{
m_order = " (" + OrderBySQL + ")";
}
m_SQLText = "select * from " + tableName + m_where + m_order + " limit {pagesize} offset {recordnum}";
m_SQLText2 = "";
return 1;
}
/// <summary>
/// 设置分页语句为SQLite分页语句
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,可包含order by,如果不存在条件判断语句,请为空</param>
/// <returns></returns>
public int SetPageSQLBySQLite(string tableName, string whereSQL)
{
string m_where = "";
if (whereSQL.Length > 0)
{
m_where = " where " + whereSQL;
}
m_SQLText = "select * from " + tableName + m_where + " limit {pagesize} offset {recordnum}";
m_SQLText2 = "";
return 1;
}
/// <summary>
/// 获取SQLite数据库指定条件的记录总数
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="whereSQL">条件判断sql语句注意不包含where,可包含order by,如果不存在条件判断语句,请为空</param>
/// <returns></returns>
public string GetPageCountSQLBySQLite(string tableName, string whereSQL)
{
string m_where = "";
if (whereSQL.Length > 0)
{
m_where = " where " + whereSQL;
}
return "select count(*) from " + tableName + m_where;
}
/// <summary>
/// 返回分页SQL语句
/// </summary>
[Description("返回分页SQL语句")]
public string GetSQLText
{
get
{
if (m_CurrPageIndex == 0) { m_CurrPageIndex = 1; }
int recordnum = m_PageSize * (m_CurrPageIndex - 1);
if (recordnum < 0) { recordnum = 0; }
string sxText;
if ((recordnum > 0) || (m_SQLText2 == ""))
{
sxText = m_SQLText.Replace("{pagecount}", m_PageCount.ToString());
sxText = sxText.Replace("{recordcount}", m_RecordCount.ToString());
sxText = sxText.Replace("{pagesize}", m_PageSize.ToString());
sxText = sxText.Replace("{pageindex}", m_CurrPageIndex.ToString());
sxText = sxText.Replace("{recordnum}", recordnum.ToString());
sxText = sxText.Replace("{recordnum1}", (recordnum+1).ToString());
sxText = sxText.Replace("{pageendnum}", (recordnum + m_PageSize-1).ToString());
sxText = sxText.Replace("{pageendnum1}", (recordnum + m_PageSize).ToString());
return sxText;
}
else
{
sxText = m_SQLText2.Replace("{pagecount}", m_PageCount.ToString());
sxText = sxText.Replace("{recordcount}", m_RecordCount.ToString());
sxText = sxText.Replace("{pagesize}", m_PageSize.ToString());
sxText = sxText.Replace("{pageindex}", m_CurrPageIndex.ToString());
sxText = sxText.Replace("{recordnum}", recordnum.ToString());
sxText = sxText.Replace("{recordnum1}", (recordnum + 1).ToString());
sxText = sxText.Replace("{pageendnum}", (recordnum + m_PageSize-1).ToString());
sxText = sxText.Replace("{pageendnum1}", (recordnum + m_PageSize).ToString());
return sxText;
}
}
}
/// <summary>
/// 分页控件
/// </summary>
public ctlMyPage()
{
InitializeComponent();
}
private void LblStartPage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
GotoFirst();
}
private void LblLast_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
GotoLast();
}
private void LblPre_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
GotoPrev();
}
private void LblNext_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
GotoNext();
}
private void NumPage_ValueChanged(object sender, EventArgs e)
{
CancelEventArgs ev = new CancelEventArgs();
OnBeforePageChange?.Invoke(this, ev);
if (ev.Cancel) { return; }
try
{
m_CurrPageIndex = Convert.ToInt32(NumPage.Value);
if (m_CurrPageIndex > m_PageCount)
{
m_CurrPageIndex = m_PageCount;
if (m_PageCount == 0)
{
NumPage.Value = 1;
}
else if (m_PageCount > NumPage.Maximum)
{
NumPage.Value = NumPage.Maximum;
}
else
{
NumPage.Value = m_PageCount;
}
}
else
{
m_CurrPageIndex = Convert.ToInt32(NumPage.Value);
OnPageChange?.Invoke(this, new EventArgs());
}
ChangeState();
}
catch { }
}
/// <summary>
/// 设置当前页为指定页
/// </summary>
/// <param name="mPageIndex"></param>
public void GotoPageIndex(int mPageIndex)
{
CancelEventArgs ev = new CancelEventArgs();
OnBeforePageChange?.Invoke(this, ev);
if (ev.Cancel) { return; }
if (mPageIndex >= m_PageCount)
{
m_CurrPageIndex = m_PageCount;
}
else
{
m_CurrPageIndex = mPageIndex;
}
OnPageChange?.Invoke(this, new EventArgs());
ChangeState();
}
/// <summary>
/// 下一页
/// </summary>
public void GotoNext()
{
CancelEventArgs ev = new CancelEventArgs();
OnBeforePageChange?.Invoke(this, ev);
if (ev.Cancel) { return; }
if (m_CurrPageIndex >= m_PageCount)
{
m_CurrPageIndex = m_PageCount;
}
else
{
m_CurrPageIndex++;
}
OnPageChange?.Invoke(this, new EventArgs());
ChangeState();
}
/// <summary>
/// 上一页
/// </summary>
public void GotoPrev()
{
CancelEventArgs ev = new CancelEventArgs();
OnBeforePageChange?.Invoke(this, ev);
if (ev.Cancel) { return; }
if (m_CurrPageIndex <= 1)
{
m_CurrPageIndex = 1;
}
else
{
m_CurrPageIndex--;
}
OnPageChange?.Invoke(this, new EventArgs());
ChangeState();
}
/// <summary>
/// 末页
/// </summary>
public void GotoLast()
{
CancelEventArgs ev = new CancelEventArgs();
OnBeforePageChange?.Invoke(this, ev);
if (ev.Cancel) { return; }
if (m_PageCount == 0)
{
m_CurrPageIndex = 0;
}
else
{
m_CurrPageIndex = m_PageCount;
}
OnPageChange?.Invoke(this, new EventArgs());
ChangeState();
}
/// <summary>
/// 首页
/// </summary>
public void GotoFirst()
{
CancelEventArgs ev = new CancelEventArgs();
OnBeforePageChange?.Invoke(this, ev);
if (ev.Cancel) { return; }
if (m_PageCount == 0)
{
m_CurrPageIndex = 0;
}
else
{
m_CurrPageIndex = 1;
}
OnPageChange?.Invoke(this, new EventArgs());
ChangeState();
}
private void CtlMyPage_Resize(object sender, EventArgs e)
{
Height = 26;
}
private void CtlMyPage_Load(object sender, EventArgs e)
{
ChangeState();
}
}
}