网上找到的一个控件,有一点小问题,排序点击几次图标会消失,再点击一次才会出现。来源不可考证,如果作者看到请联系我,我再添加来源信息。
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);
}
}
}
}
}
}
}
{
/**/
///
/// 是否启用或者禁止多列排序
///
[
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);
}
}
}
}
}
}
}