Asp.Net GridView點擊標題排序方法

在看代碼之前需要說明一點:
      GridView本身有一个Sort()函数:public virtual void Sort ( string sortExpression,    SortDirection sortDirection)使用上相当方便。但在实际使用中,常用的是点击每一列的标题来排序,点击标题会触发:protected void GridView_Sorting(object sender, GridViewSortEventArgs e)事件。从GridViewSortEventArgs中可以拿到SortDirection和SortExpression。但是GridView.Sort()本身也会触发GridView_Sorting(),如果在GridView_Sorting()中调用GridView.Sort()会无限的循环,直到堆栈溢出。這里使用DataView.Sort属性来排序,(Sort方法會觸發 Sorting 事件),再重新綁定到GridView上。

代碼如下:

1、在源碼中給GridView中加入AllowSorting屬性
     // 1、在源碼的GridView中加入AllowSorting="true"    
     < asp:GridView ID = " gvData "  runat = " server "   AllowSorting = " true " >
    
</ asp:GridView >

2、    ClbComunication.clsComunication類中定義了一個屬性,用於暫存從數據庫得到的資料:
    注:定義此屬性是因為頁面顯示后,剛才得的資料表(mdatatable)的資料會被清空。所以將得到的資料暫存於類中,便於調用。

         ///   <summary>
        
///  存放資料DataView屬性的變量
        
///   </summary>
         private   static  DataView dvValue  =   new  DataView();
        
///   <summary>
        
///  存放資料DataView屬性
        
///   </summary>
         public   static  DataView dv
        {
            
get  {  return  dvValue; }
            
set  { dvValue  =  value; }
        }

3、將資料放入類的DataView屬性中保存

         // 得到資料(BOFactory.bofactory.GetOracleDataTable(mSQL_Selection)為從數據庫得到資料)
        DataTable mdatatable  =  BOFactory.bofactory.GetOracleDataTable(mSQL_Selection);
        
// 將需要排序的資料放入DataView中(主要用到此句)
        ClbComunication.clsComunication.dv  =   new  DataView(mdatatable);
        
// 資料與界面上的GridView綁定
        gvData.DataBind();

4、訂閱GridView的Sorting事件

     // GridView的Sorting事件
    gvData.Sorting  +=   new  GridViewSortEventHandler(gvData_Sorting);

5、編輯GridView的Sorting事件方法,其中用到的GridViewSortDirection屬性的定義如"6"所示

     ///   <summary>
    
///  GridView的Sorting事件方法
    
///   </summary>
    
///   <param name="sender"></param>
    
///   <param name="e"></param>
     void  gvData_Sorting( object  sender, GridViewSortEventArgs e)
    {
        
string  sortExpression  =  e.SortExpression.ToUpper();
        
if  (GridViewSortDirection  == SortDirection.Ascending)
        {
            GridViewSortDirection 
=  SortDirection.Descending;
            
// 排序並重新綁定
            bindData(sortExpression,  " DESC " );
        }
        
else   if  (GridViewSortDirection  ==  SortDirection.Descending)
        {
            GridViewSortDirection 
=  SortDirection.Ascending;
            
// 排序並重新綁定
            bindData(sortExpression,  " ASC " );
        }
    }

6、定義排序方向屬性,此属性用viewstate保存每次排序的方向:

     ///   <summary>
    
///  排序方向屬性
    
///   </summary>
     public  SortDirection GridViewSortDirection
    {
        
get
        {
            
if  (ViewState[ " sortDirection " ==   null )
                ViewState[
" sortDirection " =  SortDirection.Ascending;
            
return  (SortDirection)ViewState[ " sortDirection " ];
        }
        
set
        {
            ViewState[
" sortDirection " =  value;
        }
    }

7、排序並綁定數據

     ///   <summary>
    
///  排序並綁定數據
    
///   </summary>
    
///   <param name="sortExpression"></param>
    
///   <param name="sortDirection"></param>
     protected   void  bindData( string  sortExpression,  string  sortDirection)
    {
        ClbComunication.clsComunication.dv.Sort 
=  sortExpression;
        
if  (sortDirection  !=  String.Empty)
        {
            ClbComunication.clsComunication.dv.Sort 
=  sortExpression + "   "   +  sortDirection;
        }
        gvData.DataSource 
=  ClbComunication.clsComunication.dv;
        gvData.DataBind();
    }

你可能感兴趣的:(object,String,null,asp.net,sorting)