本来想写成自定义控件的,觉得麻烦,并且暂时没有太多的时间来弄这个。就偷懒,写了个用户控件将就用。
用户控件的html部分
<div style="text-align: right; height: 20px">
<table style="display: inline; float: right;">
<tr>
<td style=" 35px">
<asp:LinkButton ID="BTN_First" runat="server" Text="首页" CommandArgument="First" OnClick="BTN_Pager_Click" />
</td>
<td style=" 35px">
<asp:LinkButton ID="BTN_Pre" runat="server" Text="上页" CommandArgument="Pre" OnClick="BTN_Pager_Click" />
</td>
<td style=" 35px">
<asp:LinkButton ID="BTN_Next" runat="server" Text="下页" CommandArgument="Next" OnClick="BTN_Pager_Click" />
</td>
<td style=" 35px">
<asp:LinkButton ID="BTN_End" runat="server" Text="尾页" CommandArgument="End" OnClick="BTN_Pager_Click" />
</td>
</tr>
</table>
<div style="float: right; margin-right: 10px;">
<asp:TextBox ID="TB_GoTo" runat="server" Width="25px"></asp:TextBox>
<asp:Button ID="BTN_GoTo" runat="server" Text="跳" Height="25px" OnClick="BTN_GoTo_Click" /></div>
<div style="float: right; margin-right: 10px;">
当前是第<asp:Literal ID="L_PageIndex" Text="1" runat="server" />/<asp:Literal ID="L_PageCount"
Text="0" runat="server" />页</div>
<div style="float: right; margin-right: 10px;">
共有<asp:Literal ID="L_RecordCount" Text="0" runat="server" />条记录</div>
<div style="float: right; margin-right: 10px;">
每页<asp:Literal ID="L_PageSize" Text="10" runat="server" />条记录</div>
</div>
用户控件的后台部分。
定义了一个委托,调用外部根据数据源进行绑定数据的方法,以便在不同的分页应用到不同的场合。
namespace Fireice.Edo.Web.UserControl
{
public delegate void PagerDataTable(DataTable dt);
public partial class Pager : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
BoundData();
DIV_Pager.Attributes.Add("style", _style);
//text-align: right; margin-right:40px; margin-bottom:20px; height: 20px
}
public PagerDataTable PagerDataTableHander;
public string TableName
{
get
{
if (ViewState["TableName"] == null)
throw new Exception("没有指定表名");
else
return ViewState["TableName"].ToString();
}
set { ViewState["TableName"] = value; }
}
public string OrderField
{
get
{
if (ViewState["OrderField"] == null)
throw new Exception("没有指定排序的字段");
return ViewState["OrderField"].ToString();
}
set { ViewState["OrderField"] = value; }
}
public string WherePart
{
get { return ViewState["WherePart"] == null ? String.Empty : ViewState["WherePart"].ToString(); }
set { ViewState["WherePart"] = value; }
}
public OrderDirect OrderDirect
{
get
{
if (ViewState["OrderDirect"] == null)
return OrderDirect.ASC;
return (OrderDirect)Enum.Parse(typeof(OrderDirect), ViewState["OrderDirect"].ToString());
}
set { ViewState["OrderDirect"] = value; }
}
public DatabaseType DatabaseType
{
get
{
if (ViewState["DatabaseType"] == null)
return DatabaseType.MySql;
return (DatabaseType)Enum.Parse(typeof(DatabaseType), ViewState["DatabaseType"].ToString());
}
set { ViewState["DatabaseType"] = value; }
}
private void BoundData()
{
string tableName = TableName;
string orderField = OrderField;
string orderDirect = OrderDirect.ToString();
Fireice.Edo.Helper.DB.DBHelper db = new Fireice.Edo.Helper.DB.DBHelper();
//db.GetDataTable();
int count = Convert.ToInt32(db.GetSingleFieldBySQL("select count(*) from " + tableName + " " + WherePart + " "));
RecordCount = count;
PageCount = AccountPageCount(PageSize, RecordCount);
string sql = String.Empty;
switch (DatabaseType)
{
case DatabaseType.MySql:
sql = " select * from " + tableName + " " + WherePart + " order by " + orderField + " " + orderDirect + " limit " + (PageIndex - 1) * PageSize + "," + PageSize + " ";
break;
case DatabaseType.SqlServer2000:
sql = " SELECT TOP " + PageSize + " * FROM " + tableName + " WHERE (" + orderField + " NOT IN (SELECT TOP " + PageSize * (PageIndex - 1) + " " + orderField + " FROM " + tableName + " ORDER BY " + orderField + " " + orderDirect + ")) ORDER BY " + orderField + " " + orderDirect + " ";
break;
}
DataTable dt = db.GetDataTable(sql);
if (PagerDataTableHander != null)
PagerDataTableHander(dt);
//_gv.DataSource = dt;
//_gv.DataBind();
}
private void ControlState()
{
if (PageCount <= 1)
{
TB_GoTo.Enabled = false;
BTN_GoTo.Enabled = false;
}
else
{
BTN_GoTo.Enabled = true;
}
if (PageIndex == 1 || PageIndex == 0)
{
BTN_First.Enabled = false;
BTN_Pre.Enabled = false;
}
else
{
BTN_First.Enabled = true;
BTN_Pre.Enabled = true;
}
if (PageIndex == PageCount)
{
BTN_Next.Enabled = false;
BTN_End.Enabled = false;
}
else
{
BTN_Next.Enabled = true;
BTN_End.Enabled = true;
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ControlState();
}
/// <summary>
/// 每页显示的记录数
/// </summary>
public int PageSize
{
get { return Convert.ToInt32(L_PageSize.Text); }
set { L_PageSize.Text = value.ToString(); }
}
/// <summary>
/// 总记录数
/// </summary>
public int RecordCount
{
get { return Convert.ToInt32(L_RecordCount.Text); }
set { L_RecordCount.Text = value.ToString(); }
}
/// <summary>
/// 当前是第几页
/// </summary>
public int PageIndex
{
get { return Convert.ToInt32(L_PageIndex.Text); }
set { L_PageIndex.Text = value.ToString(); }
}
/// <summary>
/// 总页数
/// </summary>
public int PageCount
{
get { return Convert.ToInt32(L_PageCount.Text); }
set { L_PageCount.Text = value.ToString(); }
}
/// <summary>
/// 根据总记录数和每页显示的页数计算出总页数
/// </summary>
/// <param name="pageSize"></param>
/// <param name="recordCount"></param>
/// <returns></returns>
private int AccountPageCount(int pageSize, int recordCount)
{
if (pageSize == 0 || recordCount == 0)
return 0;
else
{
if (recordCount % pageSize == 0)
{
return recordCount / pageSize;
}
else
{
return recordCount / pageSize + 1;
}
}
}
protected void BTN_Pager_Click(object sender, EventArgs e)
{
string command = ((LinkButton)sender).CommandArgument;
switch (command)
{
case "First":
{
PageIndex = 1;
break;
}
case "Pre":
{
PageIndex--;
break;
}
case "Next":
{
PageIndex++;
break;
}
case "End":
{
PageIndex = PageCount;
break;
}
}
BoundData();
}
protected void BTN_GoTo_Click(object sender, EventArgs e)
{
string pageNumber = TB_GoTo.Text;
int goToPageNumber = 0;
bool check = true;
check = Int32.TryParse(pageNumber, out goToPageNumber);
if (goToPageNumber <= 0 || goToPageNumber > PageCount)
{
check = false;
}
if (check)
{
PageIndex = goToPageNumber;
BoundData();
}
else
{
string key = "PagerErrorkey";
if (!Page.ClientScript.IsStartupScriptRegistered(key))
{
Page.ClientScript.RegisterStartupScript(this.GetType(), key, "alert('输入的跳转页数格式不正确或超出范围!');", true);
}
}
}
private string _style;
public string Style
{
set { _style = value; }
}
}
public enum OrderDirect
{
DESC, ASC
}
public enum DatabaseType
{
SqlServer2000,
MySql
}
}
具体的使用如下:
protected void Page_Load(object sender, EventArgs e)
{
Pager1.TableName = "accessrecord";
Pager1.OrderDirect = Fireice.Edo.Web.UserControl.OrderDirect.DESC;
Pager1.OrderField = "Recordtime";
Pager1.PageSize = 20;
Pager1.Style = "text-align: right; margin-right:10px; margin-top:10px;margin-bottom:20px; height: 20px";
Pager1.DatabaseType = Fireice.Edo.Web.UserControl.DatabaseType.MySql;
Pager1.PagerDataTableHander += new Fireice.Edo.Web.UserControl.PagerDataTable(BoundGV);
}
private void BoundGV(DataTable dt)
{
GridView1.DataSource = dt;
GridView1.DataBind();
}