由于GridView自身必须加载所有数据,才能正常显示。对于数据量很大的情况下,加载比较慢,所有自己写了个分页控件,不再使用Gridview里面的pageindex和pagecount,用viewstate保存,从而达到真分页,存储过程用ROW_NUMBER实现分页
<table cellpadding='2' cellspacing='0' width="100%">
<tr>
<td align="right" style="background-image: url(../../images/datagridbbg.jpg); height: 28px;">
<asp:Label ID="lblPageInfo" CssClass="Normal" runat="server" Visible="True"></asp:Label>
<asp:LinkButton ID="lbtnFirstPage" runat="server" CssClass="CommandButton" OnCommand="PagerButton_Click"
CommandName="FirstPage" CausesValidation="False" Text="首页"></asp:LinkButton>
<asp:LinkButton ID="lbtnPreviousPage" runat="server" CssClass="CommandButton" OnCommand="PagerButton_Click"
CommandName="PreviousPage" CausesValidation="False" Text="上一页"></asp:LinkButton>
<asp:LinkButton ID="lbtnNextPage" runat="server" CssClass="CommandButton" OnCommand="PagerButton_Click"
CommandName="NextPage" CausesValidation="False" Text="下一页"></asp:LinkButton>
<asp:LinkButton ID="lbtnLastPage" runat="server" CssClass="CommandButton" OnCommand="PagerButton_Click"
CommandName="LastPage" CausesValidation="False" Text="尾页"></asp:LinkButton>
<asp:TextBox ID="txtPageNum" runat="server" Width="41px"></asp:TextBox>
<asp:CompareValidator ID="cmpValPageNum" CssClass="NormalRed" runat="server" ControlToValidate="txtPageNum"
Display="Dynamic" ErrorMessage=">0" Operator="GreaterThan" Type="Integer" ValidationGroup="WebUserPager"
ValueToCompare="0"></asp:CompareValidator>
<asp:LinkButton ID="lbtnGoto" runat="server" CssClass="CommandButton" OnCommand="PagerButton_Click"
CommandName="Go" ValidationGroup="WebUserPager" Text="跳转"></asp:LinkButton>
</td>
</tr>
</table>
protected void Page_PreRender(object sender, EventArgs e)
{
RefreshUI();
}
protected void PagerButton_Click(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "FirstPage":
ViewState["PageIndex"] = 0;
break;
case "PreviousPage":
ViewState["PageIndex"] = int.Parse(ViewState["PageIndex"].ToString()) - 1;
break;
case "NextPage":
ViewState["PageIndex"] = int.Parse(ViewState["PageIndex"].ToString()) + 1;
break;
case "LastPage":
ViewState["PageIndex"] = int.Parse(ViewState["PageCount"].ToString()) - 1;
break;
case "Go":
if (this.txtPageNum.Text.Length > 0)
{
if (Regex.IsMatch(this.txtPageNum.Text, @"^\d*$") && int.Parse(this.txtPageNum.Text) >= 0
&& int.Parse(this.txtPageNum.Text) < int.Parse(ViewState["PageCount"].ToString()) + 1)
ViewState["PageIndex"] = Int32.Parse(txtPageNum.Text) - 1;
else
{
ViewState["PageIndex"] = int.Parse(ViewState["PageCount"].ToString()) - 1;
this.txtPageNum.Text = ViewState["PageCount"].ToString();
}
}
else
ViewState["PageIndex"] = 0;
break;
}
BindData();
}
public void RefreshUI()
{
int pageCount = int.Parse(ViewState["PageCount"].ToString());
if (pageCount < 2)
{
this.lbtnFirstPage.Enabled = false;
this.lbtnNextPage.Enabled = false;
this.lbtnPreviousPage.Enabled = false;
this.lbtnLastPage.Enabled = false;
this.lbtnGoto.Enabled = false;
this.txtPageNum.Enabled = false;
}
else
{
this.lbtnFirstPage.Enabled = true;
this.lbtnNextPage.Enabled = true;
this.lbtnPreviousPage.Enabled = true;
this.lbtnLastPage.Enabled = true;
this.lbtnGoto.Enabled = true;
this.txtPageNum.Enabled = true;
if (int.Parse(ViewState["PageIndex"].ToString()) == 0)
{
this.lbtnFirstPage.Enabled = false;
this.lbtnPreviousPage.Enabled = false;
}
else if (int.Parse(ViewState["PageIndex"].ToString()) == pageCount - 1)
{
this.lbtnNextPage.Enabled = false;
this.lbtnLastPage.Enabled = false;
}
}
this.lblPageInfo.Text = ViewState["PageSummery"] as string;
}
create Procedure ...
@WorkOrder nvarchar(50)
, @ProductNo nvarchar(50)
, @IMEI nvarchar(50)
, @CreateDateFrom datetime
, @CreateDateTo datetime
, @CreateMan nvarchar(50)
, @PageCount int
, @CurrentPageIndex int
As
with temp as (
select ROW_NUMBER() over (order by CreateDate desc) as RowId,* from ...
where (WorkOrder=@WorkOrder or @WorkOrder is Null) and (ProductNo=@ProductNo or @ProductNo is Null) and
(IMEI=@IMEI or @IMEI is Null) and (CreateMan=@CreateMan or @CreateMan is Null) and
(CreateDate>=@CreateDateFrom or @CreateDateFrom is Null) and (CreateDate<=@CreateDateTo or @CreateDateTo is Null)
)
SELECT * FROM temp where RowId between (@CurrentPageIndex-1)*@PageCount+1 and @CurrentPageIndex*@PageCount
select count(*) from dbo.CSMS_FeiBaoWorkOrder
where (WorkOrder=@WorkOrder or @WorkOrder is Null) and (ProductNo=@ProductNo or @ProductNo is Null) and
(IMEI=@IMEI or @IMEI is Null) and (CreateMan=@CreateMan or @CreateMan is Null) and
(CreateDate>=@CreateDateFrom or @CreateDateFrom is Null) and (CreateDate<=@CreateDateTo or @CreateDateTo is Null)
go