您的位置:首页 > 其它

自定义控件(HolyrongGridView)-扩展GridView控件(3):自定义排序

2009-03-20 17:18 369 查看
1.自定义控件(HolyrongGridView)-扩展GridView控件(1):基础知识
2.自定义控件(HolyrongGridView)-扩展GridView控件(2):自定义分页
3.自定义控件(HolyrongGridView)-扩展GridView控件(3):自定义排序
1.主要功能:

只要设置两个属性:AllowSorting和AllowHolyrongSorting为true就系统就会自动进行字段的排序。当然,如果不是自动产生的列,还要为需要排序的字段设置排序属性。



2.属性说明:

#region AllowHolyrongSorting
private bool _allowHolyrongSorting = true;

[Category("Holyrong Extend"),
Description("是否允许HolyrongSorting模式排序。当设置为true时,HolyrongGridView自动进行排序功能的实现,而不需要用户进行后台编码。但必须保证数据源为DataSet,DataTable或DataView。"),
NotifyParentProperty(true)]
public virtual bool AllowHolyrongSorting
{
get { return _allowHolyrongSorting; }
set { _allowHolyrongSorting = value; }
}
#endregion

#region AllowSortingTip
private bool _allowSortingTip = true;

[Category("Holyrong Extend"),
Description("是否显示排序提示图片或文本。"),
NotifyParentProperty(true)]
public virtual bool AllowSortingTip
{
get { return _allowSortingTip; }
set { _allowSortingTip = value; }
}
#endregion

#region AscImgUrl
private string _ascImgUrl;

[Category("Holyrong Extend"),
Description("升序排序显示的图标链接。"),
Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
NotifyParentProperty(true)
]
public virtual string AscImgUrl
{
get { return _ascImgUrl; }
set { _ascImgUrl = value; }
}
#endregion

#region AscText
private string _ascText;
[Category("Holyrong Extend"),
Description("升序排序显示的文本,有图标时只显示图标不该显示文本。"),
NotifyParentProperty(true)]
public virtual string AscText
{
get { return _ascText; }
set { _ascText = value; }
}
#endregion

#region DescImgUrl
private string _descImgUrl;
[Category("Holyrong Extend"),
Description("降序排序显示的图标链接。"),
Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
NotifyParentProperty(true)]
public virtual string DescImgUrl
{
get { return _descImgUrl; }
set { _descImgUrl = value; }
}
#endregion

#region DescText
private string _descText;
[Category("Holyrong Extend"),
Description("降序排序显示的文本,有图标时只显示图标不该显示文本。"),
NotifyParentProperty(true)]
public virtual string DescText
{
get { return _descText; }
set { _descText = value; }
}
#endregion

#region ToString
public override string ToString()
{
return "";
}
#endregion


3.主要功能代码:

public class HolyrongSortingFunction:ExtendFunctions
{
public HolyrongSortingFunction() : base() { }

public HolyrongSortingFunction(HolyrongGridView hgv) : base(hgv) { }

protected override void Execute()
{
if (this._hgv.HolyrongSorting.AllowHolyrongSorting)
{
this._hgv.Sorting += new System.Web.UI.WebControls.GridViewSortEventHandler(_hgv_Sorting);

if (this._hgv.HolyrongSorting.AllowSortingTip)
{
this._hgv.RowDataBound += new GridViewRowEventHandler(_hgv_RowDataBound);
}
}
}

void _hgv_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
{
e.SortExpression = GetSortExpression(e);
this._hgv.SetViewState(e.SortExpression);//将当前排序表达式存储在ViewState中。

SortDataSource(e.SortExpression); //将数据源按新排序规则重新排序
}

void _hgv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
foreach (TableCell tc in e.Row.Cells)
{
if (tc.Controls.Count ==1 && tc.Controls[0] is LinkButton) //该列允许排序(有排序字段)。
{
DisplaySortTips(tc);  //设置和显示排序提示图标或文本
}
}
}
}

#region DisplaySortTips(设置和显示排序提示图标或文本)
/// <summary>
/// 设置和显示排序提示图标或文本
/// </summary>
/// <param name="tc">要排序的列标题单元格</param>
private void DisplaySortTips(TableCell tc)
{
string sortExpression = this._hgv.ViewStateSortExpression;
string sortColumn = null;
string[] sortColumns = sortExpression.Split(',');

sortColumn = ((LinkButton)tc.Controls[0]).CommandArgument;

int sortColumnIndex = Array.FindIndex(sortColumns,delegate(string s){return s.IndexOf(sortColumn)==0;});

if (sortColumnIndex >= 0) //如果排序表达式中有当前列
{
string sortText = null;
string sortImgUrl = null;
SortDirection sortDirection = SortDirection.Ascending;

if (sortColumns[sortColumnIndex].IndexOf("DESC") >= 0)
{
sortDirection = SortDirection.Descending;
}

if (sortDirection == SortDirection.Ascending) //升序
{
sortText = this._hgv.HolyrongSorting.AscText;
sortImgUrl = this._hgv.HolyrongSorting.AscImgUrl;

if (String.IsNullOrEmpty(sortText) && String.IsNullOrEmpty(sortImgUrl))//如果用户没有制定排序提示文本和提示图标,则用系统默认图标
{
sortImgUrl = this._hgv.Page.ClientScript.GetWebResourceUrl(this.GetType(), "HolyrongControls.HolyrongGridView.Resource.Asc.gif");
}
}
else
{
sortText = this._hgv.HolyrongSorting.DescText;
sortImgUrl = this._hgv.HolyrongSorting.DescImgUrl;

if (String.IsNullOrEmpty(sortText) && String.IsNullOrEmpty(sortImgUrl))//如果用户没有制定排序提示文本和提示图标,则用系统默认图标
{
sortImgUrl = this._hgv.Page.ClientScript.GetWebResourceUrl(this.GetType(), "HolyrongControls.HolyrongGridView.Resource.Desc.gif");
}
}

if (!String.IsNullOrEmpty(sortImgUrl))
{
Image img = new Image();
img.ImageUrl = sortImgUrl;
tc.Controls.Add(img);
}
else if (!String.IsNullOrEmpty(sortText)) //只有当用户没有指定图标路径时才有可能显示排序提示文本。
{
tc.Controls.Add(new LiteralControl(sortText));
}

tc.Controls.Add(new LiteralControl((sortColumnIndex + 1).ToString()));//排序列的排序序号
}
}
#endregion

#region SortDataSource(将数据源按新排序规则重新排序)
/// <summary>
/// 将数据源按新排序规则重新排序
/// </summary>
/// <param name="sortExpression">新的排序规则</param>
private void SortDataSource(string sortExpression)
{
DataView dv = GridViewFunctions.GetGridViewDataSource(this._hgv);
dv.Sort = sortExpression;

this._hgv.DataBind();
}
#endregion

#region GetSortExpression(获取HolyrongGridView的排序表达式)
/// <summary>
/// 获取HolyrongGridView的排序表达式
/// </summary>
/// <param name="e">GridViewSortEventArgs</param>
/// <returns></returns>
private string GetSortExpression(System.Web.UI.WebControls.GridViewSortEventArgs e)
{
string newSortExpression = this._hgv.ViewStateSortExpression; //用来存储HolyrongGridView新的排序表达式

if (newSortExpression.IndexOf(e.SortExpression) >= 0)
{
ModifySortExpression(ref newSortExpression,e.SortExpression); //如果原复合排序表达式中存在
}
else
{
newSortExpression += String.Concat(",", e.SortExpression, " ASC");
}

return newSortExpression.Trim(',');
}

/// <summary>
/// 修改原排序表达式
/// </summary>
/// <param name="newSortExpression">原排序表达式</param>
/// <param name="currSortExpression">当前的排序列</param>
private void ModifySortExpression(ref string newSortExpression,string currSortExpression)
{
string ascSortExpression = String.Concat(currSortExpression, " ASC");   //当前需要排序的字段的升序排序表达式
string descSortExpression = String.Concat(currSortExpression, " DESC"); //当前需要排序的字段的降序排序表达式

if (newSortExpression.IndexOf(ascSortExpression) >= 0)  //如果是升序排列,则改为降序。
{
newSortExpression = newSortExpression.Replace(ascSortExpression, descSortExpression);
}
else if (newSortExpression.IndexOf(descSortExpression) >= 0)
{
newSortExpression = newSortExpression.Replace(descSortExpression, "").Replace(",,",",");
}
}
#endregion
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐