手把手教你如何扩展GridView之自动排序篇

   看到这两天园子里面“强奸”GridView的兄弟们可真不少,自己也手痒,也凑凑热闹,写得好,大家鼓励鼓励,写的不好,大家多多指教。
   首先说说本文要实现的目的,大家都知道GridView支持排序,但是每次排序的时候,都需要给GridView添加OnSorting事件,这么繁琐而费力,作为世界上最最聪明的程序员的我们难道没有抱怨么?废话少说,不才想到了一种解决这个问题的方法,可以让大家一劳永逸。下面就让兄弟我臭摆一下,希望园子里面的高高手,大大牛们给给面子,捧捧场,别取消兄弟。
   首先创建一个GridViewEx的类,并继承GridView,然后添加如下委托

None.gif public   delegate   void  BindEventHandler();
在GridViewEx中添加如下代码: 
DataSet _ds;
        [Description(
" 自定义的DataSet类型数据源 " ),Category( " 扩展 " )]
        
public   virtual  DataSet DataSetSource
        {
            
get
            {
                
return  _ds;
            }
            
set
            {
                _ds 
=  value;
            }
        }
我们在使用GridViewEx的时候,就只需要设定DataSetSource属性,这个将限定本扩展组件只支持DataSet类型的数据源,其他类型数据源有兴趣的,大家可以进行扩展,象ArrayList,List<>这些都是可以的。
接下来的工作是为GridViewEx添加OnBind事件,如下:
  public   event  BindEventHandler Bind;
        
public   virtual   void  OnBind()
        {
            
if  (Bind  !=   null )
            {
                Bind();
                
if  (DataSetSource  !=   null )
                {
                    DataView dv 
=  DataSetSource.Tables[ 0 ].DefaultView;
                    dv.Sort 
=  SortExpressionStr;                  
                    
this .DataSource  =  dv;

                    
this .DataBind();                }
            }
        }
有了这个事件,我们就可以让GridView去类外部获取数据源,然后回到类本身来组织数据和进行绑定了。
接下来,需要声明两个方法
  [Description( " 排序表达式 " ),Category( " 扩展 " )]
        
protected   virtual   string  SortExpressionStr
        {
            
get
            {
                
if  (ViewState[ " SortExpression " ==   null )
                {
                    
return   null ;
                }
                
return  ViewState[ " SortExpression " ].ToString();
            }
            
set
            {
                ViewState[
" SortExpression " =  value;
            }
        }
        [Description(
" 排序方向 " ),Category( " 扩展 " )]
        
protected   virtual   string  SortDirectionStr
        {
            
get
            {
                
if  (ViewState[ " SortDirection " ==   null )
                {
                    
return   " DESC " ;
                }
                
if  (ViewState[ " SortDirection " ].ToString().ToLower()  !=   " asc "   &&  ViewState[ " SortDirection " ].ToString().ToLower()  !=   " desc " )
                {
                    
return   " DESC " ;
                }
                
return  ViewState[ " SortDirection " ].ToString();
            }
            
set
            {
                ViewState[
" SortDirection " =  value;
            }
        }

和下面的属性
  public   string  SortExpressionEx
        {
            
get
            {
                
if  (ViewState[ " SortExpressionEx " ==   null )
                {
                    
return   null ;
                }
                
return  ViewState[ " SortExpressionEx " ].ToString();
            }
            
set
            {
                ViewState[
" SortExpressionEx " =  value;
            }
        }

然后重写OnSorting事件如下:

  
protected   override   void  OnSorting(GridViewSortEventArgs e)
        {
            SortExpressionEx 
=  e.SortExpression;
            SortExpressionStr 
=  e.SortExpression  +   "   "   +  SortDirectionStr;
            OnBind();
            
if  (SortDirectionStr.ToLower()  ==   " asc " )
            {
                SortDirectionStr 
=   " DESC " ;
            }
            
else
            {
                SortDirectionStr 
=   " ASC " ;
            }
        }
并且增加如下的OnLoad事件
  protected   override   void  OnLoad(EventArgs e)
        {
            
if  ( ! Page.IsPostBack)
            {
                
try
                {
                    OnBind();
                }
                
catch
                {

                }
            }
            
base .OnLoad(e);
        }

经过上面这样简单的改造,您再次使用GridViewEx的时候,在前台页面使用的时候,您只要按照这样的格式就可以了:
<cc1:GridViewEx id="gridViewEx1" OnBind="BindData" runat="server" AllowSorting="True">
  <Columns>
    <asp:TemplateField HeaderText="序号" SortExpression="ID"><%#Eval(''ID")%></asp:TemplateField> 
 </Columns>
</cc1:GridViewEx>
 后台只需要添加这样的方法

 

None.gif public   void  BindData()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   DataSet ds 
= new DataSet();
InBlock.gif   ds 
= //获得DataSet;
InBlock.gif
   gridView1.DataSetSource = ds;
ExpandedBlockEnd.gif}

 在页面中的Page_Load方法中,也不用再写
if(!Page.IsPostBack)
{
        BindData();//绑定GridView的方法
}
注意,如果需要重新绑定GridView,只需要这样GridViewEx1.OnBind();即可。

转载于:https://www.cnblogs.com/hulu/archive/2007/06/10/778160.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值