GridView 忽略分页排序

本文介绍了一种使用SQL Server存储过程和ASP.NET GridView控件实现忽略分页的排序方法。通过存储过程进行排序,并结合jQuery和ASP.NET分页控件,使得在翻页时保持原有的排序状态。

        由于上篇博文并没有被大家拍得神志不清,心中不由"沾沾自喜",今天突然有点小爽,就决定把昨天工作中一点心得分享给大伙,

还希望大伙不要给我面子,拿起板砖死命拍。昨天遇到另一个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 忽略分页排序,当然这个方法在我的思路中并不是好的方法,如果数据量过大这也是一个头痛的问题
    当往往这样的需求数据量不会很大的,在这里也要感谢园友李渐澜的帮助。同时也给需要有此要求的园友提供一个并不是很好的思路。

    由于时间仓促,未能美化页面,敬请谅解!

 
       

 

转载于:https://www.cnblogs.com/chen-jing/archive/2010/11/24/1886291.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值