一个asp.net 的GridVew控件排序的通用类

原创 2007年09月27日 10:28:00

          最近要做一个asp.net 的小程序,页面上用到了很多GridView ,既然用到表格那一定想在上面加个排序。但我的GridView都是帮定到DataTable的,不能简单的应用GridView的允许排序功能, 只好自己写了一个排序的类(这其中参考了网的一些方法)。个人认为还是挺有用的,所以拿来给大家分享,并希望高手指点一下。

主要思想是:首先是在邦定数据源之后把DataTable保存下来,我用的中ViewState,然后排序或分页时再重新读出来并重新邦定。

 

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/**//// <summary>
/// 表格排序类
/// </summary>

public class SortInfo : System.Web.UI.Page   //这里继承了System.Web.UI.Page,因为只有这样才能用ViewState.
...{
    
public string SortDirection
    
...{
        
get
        
...{
            
return ViewState["SortDirection"as string ?? "ASC";
        }

        
set
        
...{
            ViewState[
"SortDirection"= value;
        }

    }


    
public string SortExpression
    
...{
        
get
        
...{
            
return ViewState["SortExpression"as string ?? string.Empty;
        }

        
set
        
...{
            ViewState[
"SortExpression"= value;
        }

    }



    
/**//// <summary>
    
/// 排序的表格的数库源,在执行DataBind()方法前,构造些类,
    
/// 构造之前用Session或页面的静态成员 保存此类,在表格的Sorting事件中重新读出,并调用SortDataBind()方法
    
/// SortInfo命名规则:si+页面名+控件名
    
/// </summary>
    
/// <param name="dt"></param>

    public SortInfo(DataTable dt)
    
...{
        ViewState[
"dt"= dt;
    }


    
private string GetSortDirection()
    
...{
        
switch (SortDirection)
        
...{
            
case "ASC":
                SortDirection 
= "DESC";
                
break;
            
case "DESC":
                SortDirection 
= "ASC";
                
break;
        }

        
return SortDirection;

    }


    
private DataView SortDataTable(System.Data.DataTable dt, bool IsPageIndexChanging)
    
...{
        
if (dt != null)
        
...{
            DataView dv 
= new DataView(dt);
            
if (SortExpression != string.Empty)
            
...{
                
if (IsPageIndexChanging)
                
...{
                    dv.Sort 
= string.Format("{0} {1}", SortExpression, SortDirection);
                }

                
else
                
...{
                    dv.Sort 
= string.Format("{0} {1}", SortExpression, GetSortDirection());
                }

            }

            
return dv;
        }

        
else
        
...{
            
return new DataView();
        }

    }


    
public void SortDataBind(GridView gv, int PageIndex, bool GetSort)
    
...{
        DataTable dt 
= (DataTable)ViewState["dt"];
        gv.PageIndex 
= PageIndex;
        gv.DataSource 
= SortDataTable(dt, GetSort);
        gv.DataBind();
    }



    
/**//// <summary>
    
/// 重新帮定超级链接列
    
/// </summary>
    
/// <param name="gv">表格</param>
    
/// <param name="ColumnIndex">列索引</param>
    
/// <param name="Address">目标地址,此地址除了值不包括其它都要包括.如SvcCtr_Detail.aspx?id=</param>
    
/// <param name="Target">打开方式</param>

    public void BindLinkButton(GridView gv, int ColumnIndex, string Address, string Target)
    
...{
        
for (int i = 0; i < gv.Rows.Count; i++)
        
...{
            gv.Rows[i].Cells[ColumnIndex].Text 
= "<a href=" + Address + gv.Rows[i].Cells[ColumnIndex].Text.Trim() +
                
" target=" + Target + ">" + gv.Rows[i].Cells[ColumnIndex].Text + "</a>";
        }

    }



    
/**//// <summary>
    
/// 重新帮定超级链接列,参数是由前缀+列内容组成的.
    
/// </summary>
    
/// <param name="gv"></param>
    
/// <param name="ColumnIndex">必须是一个数字列否则用报错</param>
    
/// <param name="Address"></param>
    
/// <param name="Prefix">前缀</param>
    
/// <param name="Target"></param>
    
/// <param name="FormatString">格式化列串的格式化串</param>

    public void BindLinkButton(GridView gv, int ColumnIndex, string Address, string Prefix, string Target, string FormatString)
    
...{
        
for (int i = 0; i < gv.Rows.Count; i++)
        
...{
            gv.Rows[i].Cells[ColumnIndex].Text 
= "<a href=" + Address + Prefix + Convert.ToInt32(gv.Rows[i].Cells[ColumnIndex].Text).ToString(FormatString) +
                
" target=" + Target + ">" + gv.Rows[i].Cells[ColumnIndex].Text + "</a>";
        }

    }




}
//End Class  SortGrid

调用方法:

设置GridView的属性:

 

       <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
            Height
="329px" Width="478px" OnPageIndexChanging="GridView1_PageIndexChanging" OnSorting="GridView1_Sorting">
        
</asp:GridView>

 

在页面的类中声明一个静态的SortInfo:

 

    private static SortInfo siForGv = null;

在邦定GridView数据源之后,执行DataBind()方法前保存DataTable。(这里很重要)

 


        GridView1.DataSource 
= ds.Tables[0];
        siForGv 
= new SortInfo(ds.Tables[0]); //这里很重要
        GridView1.DataBind();

重写 GridView1的PageIndexChanging和Sorting,当分页和排序时重新邦定数据

 

 

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    
...{
        
if (siForGv == null)
        
...{
            
return;
        }

        GridView SortGv 
= (GridView)sender;
        siForGv.SortExpression 
= e.SortExpression;
        
int page = SortGv.PageIndex;
        siForGv.SortDataBind(SortGv, page, 
false);

    }

    
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    
...{
        
if (siForGv == null)
        
...{
            
return;
        }

        GridView SortGv 
= (GridView)sender;
        
int page = e.NewPageIndex;
        siForGv.SortDataBind(SortGv, page, 
true );
    }

至此应该是可以排序的啦。

完整的代码如下:

 

 

repeater 控件实现排序

对于呈现数据库信息的页面表格,我们可以通过repeat、gridview、datalist这三者控件,三者各有优缺点: repeat控件:呈现速度最快、效率最高、功能最简单。 gridview控件...
  • jielizhao
  • jielizhao
  • 2015年01月07日 18:08
  • 715

asp.net中自定义类的应用

了解类的概念,参考下列图片:
  • yayun0516
  • yayun0516
  • 2014年11月21日 16:40
  • 837

Asp.Net中的控件(一)验证控件 和DropList选择控件

Asp.Net入门从熟悉控件开始,Web页面中的一些控件的设定,简化了我们的代码。和VB很相似,控件分为了内部控件、外部控件。与Form窗体所不同的是Web页有一些验证性的控件,不需要我们在界面给出判...
  • dsj15831653282
  • dsj15831653282
  • 2016年06月08日 17:24
  • 1029

ASP.NET-常用选择控件

1. ListBox 控件 (1)简介 ListBox控件用于显示一组列表项,用户可以选择一项或多项。如果列表项的总数超出可以显示的项数,则ListBox控件会自动添加滚动条。 (2)属性 I...
  • qq_34874791
  • qq_34874791
  • 2017年06月05日 09:34
  • 131

【C】模仿 qsort 的功能实现一个通用的冒泡排序

#define _CRT_SECURE_NO_WARNINGS 1 #include #include int cmp(const void*n1, const void*n2) ...
  • qq_37924645
  • qq_37924645
  • 2017年05月13日 20:41
  • 163

强大的SQLHelper类

在做机房收费系统的时候,曾经使用过Sqlhelper,当时对此内容理解不是很好,参照的是下篇的博客:   vb.net—SQLHelper类的使用   而做过之后,当再次回首往事的时候,发现这个S...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2014年09月20日 13:20
  • 2465

asp.net 利用NPOI导出Excel通用类

解决中文文件名保存Excel乱码问题,主要是判断火狐或者IE浏览器,然后做对应的判断处理,核心代码如下: System.Web.HttpContext.Current.Response.Content...
  • taomanman
  • taomanman
  • 2017年06月22日 17:26
  • 665

Java通用排序工具类

Java通用的排序工具类,支持数组、List、Map、Set排序,
  • elwy_cn
  • elwy_cn
  • 2014年10月28日 17:50
  • 1450

asp.net抓取通用类

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te...
  • shaxuli
  • shaxuli
  • 2015年01月07日 15:44
  • 221

强大的ASP.NET控件----用户控件对战自定义控件

用户控件,用户控件的属性 自定义控件,如何使用自定义和用户控件,如何制作自定义控件和用户控件...
  • u010073895
  • u010073895
  • 2014年11月08日 21:34
  • 2645
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个asp.net 的GridVew控件排序的通用类
举报原因:
原因补充:

(最多只允许输入30个字)