2008-06-25 22:23
金色海洋(jyk)
阅读(1014)
评论()
编辑
收藏
举报
本来想写在一起的,但是代码贴多了,IE的反应速度就越慢,所以只好分成两个了。
namespace JYK.Controls.PageManage


{

/**//// <summary>
/// 生成分页控件需要的SQL语句
/// </summary>
public class PageSQL

{

/**//// <summary>
/// 分页控件的实例
/// </summary>
public JYKPage myPage = null;

生成分页用的SQL语句的模版#region 生成分页用的SQL语句的模版

生成首页的SQL语句#region 生成首页的SQL语句

/**//// <summary>
/// 生成首页的SQL语句
/// </summary>
public virtual void CreateFirstPageSQL()

{
//第一页的SQL语句,
//select top PageSize * from table where order by
System.Text.StringBuilder sql = new StringBuilder(100);
sql.Append("set nocount on; ");
sql.Append("select top ");
sql.Append(myPage.PageSize );
sql.Append(" ");
sql.Append(myPage.TableShowColumns);
sql.Append(" from ");
sql.Append(myPage.TableName );
sql.Append(" ");

//查询条件
if (myPage.TableQuery.Length > 0)

{
sql.Append(" where ");
sql.Append(myPage.TableQuery);
}

sql.Append(" order by ");
sql.Append(myPage.TableOrderColumns );
sql.Append(" set nocount off; ");
//保存
myPage.SQLGetFirstPage = sql.ToString();
sql.Length = 0;

}
#endregion


生成任意页的SQL语句#region 生成任意页的SQL语句

/**//// <summary>
/// 生成任意页的SQL语句的模版
/// </summary>
public virtual void CreateNextPageSQL()

{
//指定页号的SQL语句的模版
//SQL 2005 数据库,使用 Row_Number()分页
//set nocount on;
//with t_pager as (
// select *,rn = ROW_NUMBER() OVER (ORDER BY id desc) FROM test_indexorder
// )
//SELECT id,name,content,co1,co2,co3,co4,co5 from t_rn WHERE rn between 19007 and 19057;

System.Text.StringBuilder sql = new StringBuilder(500);
sql.Append("set nocount on; ");
sql.Append("with t_pager as (select myIndex = ROW_NUMBER() OVER (ORDER BY ");
sql.Append(myPage.TableOrderColumns);
sql.Append(" ),* from ");
sql.Append(myPage.TableName);

//查询条件
if (myPage.TableQuery.Length > 0)

{
sql.Append(" where ");
sql.Append(myPage.TableQuery);
}

sql.Append(" ) select ");
sql.Append(myPage.TableShowColumns );
sql.Append(" from t_pager where myIndex between {0} and {1} ");
sql.Append(" set nocount off; ");
//保存
myPage.SQLGetNextPage = sql.ToString();
sql.Length = 0;
}
#endregion


生成最后一页的SQL语句#region 生成最后一页的SQL语句

/**//// <summary>
/// 最后一页的SQL语句。依据算法而定,不是所有的情况都需要实现
/// </summary>
public virtual void CreateLastPageSQL()

{
}
#endregion

#endregion



生成SQL语句模版、获取总记录数,计算页数。#region 生成SQL语句模版、获取总记录数,计算页数。
public void CreateSQL()

{
//重新生成SQL语句模版
CreateFirstPageSQL();
CreateNextPageSQL();
CreateLastPageSQL();

//获取总记录数,计算页数。

System.Text.StringBuilder sql = new StringBuilder();
sql.Append("select count(1) from ");
sql.Append(myPage.TableName);
if (myPage.TableQuery.Length > 0)

{
sql.Append(" where ");
sql.Append(myPage.TableQuery);
}

//总记录数
string tmpCount = myPage.DAL.RunSqlGetFirstColValue(sql.ToString());
if (tmpCount != null)

{
//计算页数
Int32 intCount = Int32.Parse(tmpCount);
myPage.PageRecordCount = intCount;
Int32 tmpPageCount = intCount / myPage.PageSize;
tmpPageCount += intCount % myPage.PageSize == 0 ? 0 : 1;

myPage.PageCount = tmpPageCount;
}
}
#endregion


获取分页用的SQL语句#region 获取分页用的SQL语句

/**//// <summary>
/// 传入页号,返回指定页号的SQL语句
/// </summary>
/// <param name="PageIndex">页号</param>
public string GetSQL(Int32 PageIndex)

{
if (PageIndex == 1)

{
//指定页号
myPage.PageIndex = 1;
return myPage.SQLGetFirstPage;
}
else

{
if (PageIndex < 1)
PageIndex = 1;

if (PageIndex > myPage.PageCount)
PageIndex = myPage.PageCount;

//指定页号
myPage.PageIndex = PageIndex;

Int32 p1 = myPage.PageSize * (PageIndex - 1) + 1;
Int32 p2 = p1 + myPage.PageSize - 1;

return string.Format(myPage.SQLGetNextPage, p1, p2);

}
}
#endregion


}
}
namespace JYK.Controls.PageManage


{

/**//// <summary>
/// 负责绘制分页控件的显示内容
/// </summary>
public class PageUI

{

/**//// <summary>
/// 分页控件的实例
/// </summary>
public JYKPage myPage = null;


/**//// <summary>
/// 客户端ID
/// </summary>
public string BtnClientID = "";


/**//// <summary>
/// 添加UI
/// </summary>
public virtual void AddPageUI()

{
AddPageDataInfo();
AddPageNavi();
AddPageText();
}


添加记录数等的显示#region 添加记录数等的显示

/**//// <summary>
/// 添加记录数等的显示
/// </summary>
public virtual void AddPageDataInfo()

{
string str = myPage.PageUIAllCount.Replace("{0}", myPage.PageRecordCount.ToString());
LiteralControl lc1 = new LiteralControl();
lc1.ID = "p_data1";
lc1.Text = str;
myPage.Controls.Add(lc1);

str = myPage.PageUIAllPage.Replace("{0}", myPage.PageIndex.ToString()).Replace("{1}", myPage.PageCount.ToString());
lc1 = new LiteralControl();
lc1.ID = "p_data2";
lc1.Text = str;
myPage.Controls.Add(lc1);

str = myPage.PageUIAllPageCount.Replace("{0}", myPage.PageSize.ToString());
lc1 = new LiteralControl();
lc1.ID = "p_data3";
lc1.Text = str;
myPage.Controls.Add(lc1);
}
#endregion


修改当前页号#region 修改当前页号

/**//// <summary>
/// 修改当前页号
/// </summary>
public virtual void UpdatePageIndex()

{
string str = myPage.PageUIAllPage.Replace("{0}", myPage.PageIndex.ToString()).Replace("{1}", myPage.PageCount.ToString());
LiteralControl lc1 = (LiteralControl)myPage.FindControl("p_data2");
lc1.Text = str;

}
#endregion


添加上一页等#region 添加上一页等

/**//// <summary>
/// 添加上一页等
/// </summary>
public virtual void AddPageText()

{
BtnClientID = myPage.ClientID + "_dh";

System.Text.StringBuilder str = new StringBuilder();


首页#region 首页
str.Append("<a id=\"P_First\" href=\"");
str.Append(GetAHref(1));
str.Append("\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >");
str.Append(myPage.PageUIFirst);
str.Append("</a> ");

LiteralControl lc1 = new LiteralControl();
lc1.ID = "p_First";
lc1.Text = str.ToString();
myPage.Controls.Add(lc1);
str.Length = 0;
#endregion


上一页#region 上一页
str.Append("<a id=\"P_Prev\" href=\"");
str.Append(GetAHref(-3));
str.Append("\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >");
str.Append(myPage.PageUIPrev);
str.Append("</a> ");

lc1 = new LiteralControl();
lc1.ID = "P_Prev";
lc1.Text = str.ToString();
myPage.Controls.Add(lc1);
str.Length = 0;
#endregion


下一页#region 下一页
str.Append("<a id=\"P_Next\" href=\"");
str.Append(GetAHref(-2));
str.Append("\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >");
str.Append(myPage.PageUINext);
str.Append("</a> ");

lc1 = new LiteralControl();
lc1.ID = "P_Next";
lc1.Text = str.ToString();
myPage.Controls.Add(lc1);
str.Length = 0;
#endregion


末页#region 末页
str.Append("<a id=\"P_Last\" href=\"");
str.Append(GetAHref(myPage.PageCount));
str.Append("\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >");
str.Append(myPage.PageUILast);
str.Append("</a> ");

lc1 = new LiteralControl();
lc1.ID = "P_Last";
lc1.Text = str.ToString();
myPage.Controls.Add(lc1);
str.Length = 0;
#endregion


GO#region GO
str.Append(" <a id=\"P_GO\" href=\"javascript:_GO()\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >");
str.Append(myPage.PageUIGO);
str.Append("</a> ");

JYKTextBox txt = new JYKTextBox();
txt.ID = "Txt_GO";
txt.MaxLength = 3;
txt.Columns = 1;
myPage.Controls.Add(txt);

lc1 = new LiteralControl();
lc1.ID = "P_Go";
lc1.Text = str.ToString();
myPage.Controls.Add(lc1);
str.Length = 0;
#endregion
}
#endregion

//导航

页面导航#region 页面导航

/**//// <summary>
/// navigation
/// </summary>
public virtual void AddPageNavi()

{
string str = GetNavi();

LiteralControl lc1 = new LiteralControl();
lc1.ID = "p_no";
lc1.Text = str;
myPage.Controls.Add(lc1);

}
#endregion


修改#region 修改

/**//// <summary>
/// 修改
/// </summary>
public virtual void UpdatePageNavi()

{
Int32 pIndex = myPage.PageIndex;

LiteralControl lc1 = (LiteralControl)myPage.FindControl("p_no");

Int32 NoCount = myPage.NaviCount; //一组页号的数量
//Int32 cp = myPage.PageIndex / NoCount * NoCount;

if (pIndex % NoCount == 0 || pIndex % NoCount == NoCount - 1)

{
lc1.Text = GetNavi();
}
else

{
string str = lc1.Text.Replace(">-", ";>[");
str = str.Replace("-<", "]<");
str = str.Replace("[" + pIndex + "]", "-" + pIndex + "-");
lc1.Text = str;
}
}
#endregion


重新计算导航页号#region 重新计算导航页号

/**//// <summary>
/// 重新计算导航页号
/// </summary>
public virtual void ReloadPageNavi()

{
string pIndex = myPage.PageIndex.ToString();
LiteralControl lc1 = (LiteralControl)myPage.FindControl("p_no");
lc1.Text = GetNavi();
}
#endregion


生成导航的html#region 生成导航的html

/**//// <summary>
/// 生成导航的html
/// </summary>
/// <returns></returns>
private string GetNavi()

{
System.Text.StringBuilder str = new StringBuilder();

Int32 pIndex = myPage.PageIndex;
Int32 NoCount = myPage.NaviCount ; //一组页号的数量
Int32 cp = pIndex / NoCount; // *NoCount;

if (pIndex != NoCount && cp != 0)

{
//前导页
str.Append(" <a id=\"P_aa\" href=\"");
str.Append(GetAHref(-99));
str.Append("\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >");
str.Append("
");
str.Append("</a> ");
str.Append(" ");
}

Int32 i = 0;
Int32 pCount = myPage.PageCount;

cp *= NoCount;

//没有想到更好的解决办法
if (pIndex % NoCount == 0)
cp -= NoCount;

for (i = 1; i <= NoCount; i++)

{
if (pIndex == cp + i)

{
str.Append(" <a id=\"P_b" + i.ToString() + "\" href=\"");
str.Append(GetAHref(cp + i));
str.Append("\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >-");
str.Append(cp + i);
str.Append("-</a> ");
}
else

{
str.Append(" <a id=\"P_b"+ i.ToString() +"\" href=\"");
str.Append(GetAHref(cp + i));
str.Append("\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >[");
str.Append(cp + i);
str.Append("]</a> ");
}

if (cp + i >= pCount)

{
i = 9999;
}
}

if (cp + i < pCount)

{
//后导页
str.Append(" <a id=\"P_zz\" href=\"");
str.Append(GetAHref(-88));
str.Append("\" class=\"");
str.Append(myPage.CssClass);
str.Append("\" >");
str.Append("
");
str.Append("</a> ");
str.Append(" ");
}
return str.ToString();
}

#endregion



}
}


namespace JYK.Controls.PageManage


{

/**//// <summary>
/// 依据PageSQL提供的SQL语句,通过数据访问函数库到数据库里提取数据
/// </summary>
public class PageGetData

{

/**//// <summary>
/// 分页控件的实例
/// </summary>
public JYKPage myPage = null;

/**//// <summary>
/// 返回DataTable记录集
/// </summary>
/// <param name="PageIndex">页号。从1开始计数</param>
/// <returns></returns>
public DataTable GetDataTable(Int32 PageIndex)

{
string sql = myPage.ManagerPageSQL.GetSQL(PageIndex);
return myPage.DAL.RunSqlDataTable(sql);
}

//public T GetDataList<T>(Int32 PageIndex)
//{
// string sql = myPage.ManagerPageSQL.GetSQL(PageIndex);
// return myPage.DAL.RunSqlDataTable(sql);
//}

}
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述