GridView多列排序及排序方向图标

网上找到的一个控件,有一点小问题,排序点击几次图标会消失,再点击一次才会出现。来源不可考证,如果作者看到请联系我,我再添加来源信息。

 

public   class  WebGridView : GridView
    {
        
/**/
        
///  
        
///  是否启用或者禁止多列排序
        
///  
        [
        Description(
" 是否启用多列排序功能 " ),
        Category(
" 排序 " ),
        DefaultValue(
" false " ),
        ]
        
public   bool  AllowMultiColumnSorting
        {
            
get
            {
                
object  o  =  ViewState[ " EnableMultiColumnSorting " ];
                
return  (o  !=   null   ?  ( bool )o :  false );
            }
            
set
            {
                AllowSorting 
=   true ;
                ViewState[
" EnableMultiColumnSorting " =  value;
            }
        }
        
/**/
        
///  
        
///  升序时显示图标
        
///  
        [
        Description(
" 升序时显示图标 " ),
        Category(
" 排序 " ),
        Editor(
" System.Web.UI.Design.UrlEditor " typeof (System.Drawing.Design.UITypeEditor)),
        DefaultValue(
"" ),

        ]
        
public   string  SortAscImageUrl
        {
            
get
            {
                
object  o  =  ViewState[ " SortImageAsc " ];
                
return  (o  !=   null   ?  o.ToString() :  "" );
            }
            
set
            {
                ViewState[
" SortImageAsc " =  value;
            }
        }
        
/**/
        
///  
        
///  降序时显示图标
        
///  
        [
         Description(
" 降序时显示图标 " ),
         Category(
" 排序 " ),
         Editor(
" System.Web.UI.Design.UrlEditor " typeof (System.Drawing.Design.UITypeEditor)),
         DefaultValue(
"" ),
         ]
        
public   string  SortDescImageUrl
        {
            
get
            {
                
object  o  =  ViewState[ " SortImageDesc " ];
                
return  (o  !=   null   ?  o.ToString() :  "" );
            }
            
set
            {
                ViewState[
" SortImageDesc " =  value;
            }
        }
        
protected   override   void  OnSorting(GridViewSortEventArgs e)
        {
            
if  (AllowMultiColumnSorting)
            {
                e.SortExpression 
=  GetSortExpression(e);
            }

            
base .OnSorting(e);
        }
        
protected   override   void  OnRowCreated(GridViewRowEventArgs e)
        {
            
if  (e.Row.RowType  ==  DataControlRowType.Header)
            {
                
if  (SortExpression  !=  String.Empty)
                {
                    DisplaySortOrderImages(SortExpression, e.Row);
                    
this .CreateRow( 0 0 , DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
                }
            }
            
base .OnRowCreated(e);
        }
        
/**/
        
///  
        
///   获取排序表达式
        
///  
         protected   string  GetSortExpression(GridViewSortEventArgs e)
        {
            
string [] sortColumns  =   null ;
            
string  sortAttribute  =  SortExpression;

            
if  (sortAttribute  !=  String.Empty)
            {
                sortColumns 
=  sortAttribute.Split( " , " .ToCharArray());
            }
            
if  (sortAttribute.IndexOf(e.SortExpression)  >   0   ||  sortAttribute.StartsWith(e.SortExpression))
            {
                sortAttribute 
=  ModifySortExpression(sortColumns, e.SortExpression);
            }
            
else
            {
                sortAttribute 
+=  String.Concat( " , " , e.SortExpression,  "  ASC  " );
            }
            
return  sortAttribute.TrimStart( " , " .ToCharArray()).TrimEnd( " , " .ToCharArray());

        }
        
/**/
        
///  
        
///   修改排序顺序
        
///  
         protected   string  ModifySortExpression( string [] sortColumns,  string  sortExpression)
        {
            
string  ascSortExpression  =  String.Concat(sortExpression,  "  ASC  " );
            
string  descSortExpression  =  String.Concat(sortExpression,  "  DESC  " );

            
for  ( int  i  =   0 ; i  <  sortColumns.Length; i ++ )
            {

                
if  (ascSortExpression.Equals(sortColumns[i]))
                {
                    sortColumns[i] 
=  descSortExpression;
                }

                
else   if  (descSortExpression.Equals(sortColumns[i]))
                {
                    Array.Clear(sortColumns, i, 
1 );
                }
            }

            
return  String.Join( " , " , sortColumns).Replace( " ,, " " , " ).TrimStart( " , " .ToCharArray());

        }
        
/**/
        
///  
        
///   获取当前的表达式对所选列进行排序
        
///  
         protected   void  SearchSortExpression( string [] sortColumns,  string  sortColumn,  out   string  sortOrder,  out   int  sortOrderNo)
        {
            sortOrder 
=   "" ;
            sortOrderNo 
=   - 1 ;
            
for  ( int  i  =   0 ; i  <  sortColumns.Length; i ++ )
            {
                
if  (sortColumns[i].StartsWith(sortColumn))
                {
                    sortOrderNo 
=  i  +   1 ;
                    
if  (AllowMultiColumnSorting)
                    {
                        sortOrder 
=  sortColumns[i].Substring(sortColumn.Length).Trim();
                    }
                    
else
                    {
                        sortOrder 
=  ((SortDirection  ==  SortDirection.Ascending)  ?   " ASC "  :  " DESC " );
                    }
                }
            }
        }
        
/**/
        
///  
        
///   绘制升序降序的图片
        
///  
         protected   void  DisplaySortOrderImages( string  sortExpression, GridViewRow dgItem)
        {
            
string [] sortColumns  =  sortExpression.Split( " , " .ToCharArray());

            
for  ( int  i  =   0 ; i  <  dgItem.Cells.Count; i ++ )
            {
                
if  (dgItem.Cells[i].Controls.Count  >   0   &&  dgItem.Cells[i].Controls[ 0 is  LinkButton)
                {
                    
string  sortOrder;
                    
int  sortOrderNo;
                    
string  column  =  ((LinkButton)dgItem.Cells[i].Controls[ 0 ]).CommandArgument;
                    SearchSortExpression(sortColumns, column, 
out  sortOrder,  out  sortOrderNo);
                    
if  (sortOrderNo  >   0 )
                    {
                        
string  sortImgLoc  =  (sortOrder.Equals( " ASC " ?  SortAscImageUrl : SortDescImageUrl);

                        
if  (sortImgLoc  !=  String.Empty)
                        {
                            Image imgSortDirection 
=   new  Image();
                            imgSortDirection.ImageUrl 
=  sortImgLoc;
                            dgItem.Cells[i].Controls.Add(imgSortDirection);

                        }
                        
else
                        {

                            
if  (AllowMultiColumnSorting)
                            {
                                Literal litSortSeq 
=   new  Literal();
                                litSortSeq.Text 
=  sortOrderNo.ToString();
                                dgItem.Cells[i].Controls.Add(litSortSeq);

                            }
                        }
                    }
                }
            }

        }
    }

 

转载于:https://www.cnblogs.com/SharpDeveloper/archive/2011/06/06/2073906.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值