GridView 忽略分页排序
由于上篇博文并没有被大家拍得神志不清,心中不由"沾沾自喜",今天突然有点小爽,就决定把昨天工作中一点心得分享给大伙,
还希望大伙不要给我面子,拿起板砖死命拍。昨天遇到另一个gridview排序的问题,要求按时间排序时,忽略分页,也就是点击下一页
的时候,还是按照升序或者降序排序,而在当前页点击列头还是排序。
因为这个问题以前没遇到过,gridview自带的排序肯定不能实现要求,用ASPxGridView排序也只能在当前页排序,于是想到了
Jquery虽然用jQuery的ajax方法可以实现,但在分页上遇到一点小麻烦,测试是可以通过,但在我的实际运用中,操作起来却让人有
点头痛,时间急迫,于是用一个最简单的方法,但关于用jQuery来解决还有待研究。
第一步:在SQL SERVER(我用的是2008)数据库中写一个存储过程,把排序作为参数,存储过程如下:
SQL 存储过程
CREATE PROCEDURE [dbo].[SORT_PAGINATION]
@PageSize INT,--分页条数
@PageIndex INT,--当前页数
@Sort VARCHAR(50) --条件排序
AS
SELECT CouponId,CouponTopic,EffectiveDate,BeginDate,EndDate,
case @sort
when ' SI_EndDate DESC ' then ROW_NUMBER() OVER(ORDER BY EndDate DESC)
when ' SI_EndDate ASC ' then ROW_NUMBER() OVER(ORDER BY EndDate ASC)
else ROW_NUMBER() OVER(ORDER BY CouponId ASC)
end
AS RowNum FROM CouponInfo
WHERE RowNum BETWEEN(@PageIndex-1)*@PageSize+1 AND(@PageSize*@PageIndex)
ORDER BY RowNum
第二步,在Visual Studio(我用的是2010)中添加一个测试页面,Linq To Sql 类
在测试页面中放一个gridview ,一个分页控件,我用的是AspNetPager ,一个隐藏域,
页面代码
<div><asp:GridView ID="gvShoppe" runat="server" ateColumns="False"AutoGenerateColumns="False"><Columns> <asp:TemplateField HeaderText="协议开始时间"><ItemTemplate><asp:Label ID="Label4" runat="server" Text='<%# Eval("SI_BeginDate") %>' ></asp:Label></ItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="协议结束时间"><HeaderTemplate><asp:LinkButton ID="lBtnEndDate" runat="server" CommandName="dfd"onclick="lBtnEndDate_Click">协议结束时间</asp:LinkButton></HeaderTemplate><ItemTemplate>
<asp:Label ID="Label33" runat="server"Text='<%# Eval("EndDate") %>' ></asp:Label></ItemTemplate></asp:TemplateField></Columns></asp:GridView><webdiyer:AspNetPager ID="AspNetPager1" runat="server" CustomInfoHTML="第%CurrentPageIndex%/%PageCount%页,每页%PageSize%条,共%RecordCount%条"FirstPageText="<<首页" PrevPageText="<上一页" NextPageText="下一页>"LastPageText="尾页>>"AlwaysShow="True" PageIndexBoxType="TextBox"ShowPageIndexBox="Always" SubmitButtonText="Go" TextAfterPageIndexBox="页"PageSize="3" TextBeforePageIndexBox="转到" Height="25px" NumericButtonCount="1"Width="500px" CenterCurrentPageButton="True" CustomInfoTextAlign="Left"HorizontalAlign="Right" NavigationButtonsPosition="Right"ShowMoreButtons="False" ShowPageIndex="False" ShowCustomInfoSection="Left"PagingButtonSpacing="4px" Wrap="False"onpagechanged="AspNetPager1_PageChanged"></webdiyer:AspNetPager><input runat="server" type="hidden" id="hOrderBy" /></div>
在要排序的列头放一个LinkButton 在页面上就显示开始时间和结束时间,
第三步,创建Linq To Sql 类MDClass.dbml,
直接把存储过程拖到Linq To Sql 类中的设计图中创建方法,直接就在页面就可以调用了,系统会生成MDClassDataContext,实例化MDClassDataContext就可以与数据库交互了
第四步,后台绑定 :
后台代码
MDClassDataContext MDC = new MDClassDataContext();
public void DataBindCouponInfo(string sort)
{
this.gvShoppe.DataSource = MDC.SORT_PAGINATION(AspNetPager1.PageSize,sort, AspNetPager1.CurrentPageIndex);
var CouponCount = from c in MDC.CouponInfo select c;
int count = CouponCount.Count();
AspNetPager1.RecordCount = count;//获取总条数
this.gvShoppe.DataBind();
}
//在 LinkButton单击事件中:
protected void lBtnEndDate_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(hOrderBy.Value))
{
hOrderBy.Value = " EndDate ASC ";
}
else
{
if (hOrderBy.Value.Trim().Equals("EndDate ASC"))
{
hOrderBy.Value = " EndDate DESC ";
}
else
{
hOrderBy.Value = " EndDate ASC ";
}
}
DataBindCouponInfo(hOrderBy.Value);
}
//分页时从新绑定
protected void AspNetPager1_PageChanged(object sender, EventArgs e)
{
DataBindCouponInfo(hOrderBy.Value);
}
这样就可以实现gridview 忽略分页排序,当然这个方法在我的思路中并不是好的方法,如果数据量过大这也是一个头痛的问题
当往往这样的需求数据量不会很大的,在这里也要感谢园友李渐澜的帮助。同时也给需要有此要求的园友提供一个并不是很好的思路。
由于时间仓促,未能美化页面,敬请谅解!

浙公网安备 33010602011771号