天天看点

扩展GridView控件(2) - 复合排序和排序状态提示

GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。

<a href="http://webabcd.blog.51cto.com/1787395/345429" target="_blank">[索引页]</a>

<a href="http://down.51cto.com/data/101204" target="_blank">[源码下载]</a>

扩展GridView控件(2) - 复合排序和排序状态提示

/*正式版的实现 开始*/

介绍

扩展GridView控件:

对多个字段进行复合排序;升序、降序的排序状态提示

使用方法(设置SmartSorting复合属性):

AllowSortTip - 是否启用排序提示

AllowMultiSorting - 是否启用复合排序

SortAscImageUrl - 升序提示图片的URL(不设置则使用默认图片)

SortDescImageUrl - 降序提示图片的URL(不设置则使用默认图片)

SortAscText - 升序提示文本

SortDescText - 降序提示文本

关键代码

using System; 

using System.Collections.Generic; 

using System.Text; 

using System.Web.UI.WebControls; 

using System.Web.UI; 

namespace YYControls.SmartGridViewFunction 

        /// &lt;summary&gt; 

        /// 扩展功能:复合排序和排序状态提示 

        /// &lt;/summary&gt; 

        public class SmartSortingFunction : ExtendFunction 

        { 

                /// &lt;summary&gt; 

                /// 构造函数 

                /// &lt;/summary&gt; 

                public SmartSortingFunction() 

                        : base() 

                { 

                } 

                /// &lt;param name="sgv"&gt;SmartGridView对象&lt;/param&gt; 

                public SmartSortingFunction(SmartGridView sgv) 

                        : base(sgv) 

                /// 扩展功能的实现 

                protected override void Execute() 

                        // 开启SmartGridView的排序功能 

                        // this._sgv.AllowSorting = true; 

                        this._sgv.Sorting += new System.Web.UI.WebControls.GridViewSortEventHandler(_sgv_Sorting); 

                        this._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell); 

                /// SmartGridView的RowDataBoundCell事件 

                /// &lt;param name="sender"&gt;&lt;/param&gt; 

                /// &lt;param name="gvtc"&gt;&lt;/param&gt; 

                void _sgv_RowDataBoundCell(object sender, GridViewTableCell gvtc) 

                        if (!String.IsNullOrEmpty(this._sgv.SortExpression)    

                                &amp;&amp; this._sgv.SmartSorting.AllowSortTip 

                                &amp;&amp; gvtc.RowType == DataControlRowType.Header) 

                        { 

                                // 显示排序状态提示 

                                DisplaySortTip(this._sgv.SortExpression, gvtc.TableCell); 

                        } 

                /// Sorting事件 

                /// &lt;param name="e"&gt;&lt;/param&gt; 

                void _sgv_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e) 

                        // 如果允许复合排序的话,则设置复合排序表达式 

                        if (this._sgv.SmartSorting.AllowMultiSorting) 

                                e.SortExpression = GetSortExpression(e); 

                /// 获得复合排序表达式 

                /// &lt;returns&gt;&lt;/returns&gt; 

                protected string GetSortExpression(GridViewSortEventArgs e) 

                        string[] sortColumns = null; 

                        string sortAttribute = this._sgv.SortExpression; 

                        if (!String.IsNullOrEmpty(sortAttribute)) 

                                sortColumns = sortAttribute.Split(','); 

                        // 如果原排序表达式有当前排序字段 

                        if (sortAttribute.IndexOf(e.SortExpression) != -1) 

                                // 更新排序表达式 

                                sortAttribute = ModifySortExpression(sortColumns, e.SortExpression); 

                        else 

                                // 为原排序表达式添加新的排序规则(升序) 

                                sortAttribute += String.Concat(",", e.SortExpression, " ASC"); 

                        return sortAttribute.Trim(','); 

                /// 更新排序表达式 

                /// &lt;param name="sortColumns"&gt;各个字段的排序表达式数组&lt;/param&gt; 

                /// &lt;param name="sortExpression"&gt;当前需要排序的字段(该字段在sortColumns数组中)&lt;/param&gt; 

                protected string ModifySortExpression(string[] sortColumns, string sortExpression) 

                        // 当前需要排序的字段的升序表达式 

                        string ascSortExpression = String.Concat(sortExpression, " ASC"); 

                        // 当前需要排序的字段的降序表达式 

                        string descSortExpression = String.Concat(sortExpression, " DESC"); 

                        for (int i = 0; i &lt; sortColumns.Length; i++) 

                                // 各个字段的排序表达式数组中,有当前需要排序的字段的升序表达式 

                                if (ascSortExpression.Equals(sortColumns[i])) 

                                { 

                                        // 当前排序字段由升序变为降序 

                                        sortColumns[i] = descSortExpression; 

                                        break; 

                                } 

                                // 各个字段的排序表达式数组中,有当前需要排序的字段的降序表达式 

                                else if (descSortExpression.Equals(sortColumns[i])) 

                                        // 从各个字段的排序表达式数组中,删除当前需要排序的字段 

                                        Array.Clear(sortColumns, i, 1); 

                        return String.Join(",", sortColumns).Replace(",,", ",").Trim(','); 

                /// 显示排序状态提示 

                /// &lt;param name="sortExpression"&gt;排序表达式&lt;/param&gt; 

                /// &lt;param name="tc"&gt;Header的TableCell&lt;/param&gt; 

                protected void DisplaySortTip(string sortExpression, TableCell tc) 

                        string[] sortColumns = sortExpression.Split(','); 

                        if (tc.Controls.Count &gt; 0 &amp;&amp; tc.Controls[0] is LinkButton) 

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

                                int sortOrderIndex = Array.FindIndex(sortColumns, delegate(string s) { return s.IndexOf(columnName) != -1; }); 

                                // 如果排序表达式中有当前列 

                                if (sortOrderIndex != -1) 

                                        // 当前列应该是升序还是降序(区分两种情况:复合排序和非复合排序) 

                                        SortDirection sortDirection = SortDirection.Ascending; 

                                        if (this._sgv.SmartSorting.AllowMultiSorting &amp;&amp; sortColumns[sortOrderIndex].IndexOf("DESC") != -1) 

                                        { 

                                                sortDirection = SortDirection.Descending; 

                                        } 

                                        else if (!this._sgv.SmartSorting.AllowMultiSorting &amp;&amp; this._sgv.SortDirection == SortDirection.Descending) 

                                        // 排序状态提示(图片地址) 

                                        string sortImageUrl = null; 

                                        // 排序状态提示(文本) 

                                        string sortText = null; 

                                        if (sortDirection == SortDirection.Ascending) 

                                                sortText = this._sgv.SmartSorting.SortAscText; 

                                                sortImageUrl = this._sgv.SmartSorting.SortAscImageUrl; 

                                                if (String.IsNullOrEmpty(sortImageUrl)) 

                                                { 

                                                        sortImageUrl =    

                                                                this._sgv.Page.ClientScript.GetWebResourceUrl 

                                                                ( 

                                                                        this.GetType(), 

                                                                        "YYControls.SmartGridView.Resources.Asc.gif" 

                                                                ); 

                                                } 

                                        else 

                                                sortText = this._sgv.SmartSorting.SortDescText; 

                                                sortImageUrl = this._sgv.SmartSorting.SortDescImageUrl; 

                                                                        "YYControls.SmartGridView.Resources.Desc.gif" 

                                        // 添加排序状态提示图片 

                                        Image imgSortDirection = new Image(); 

                                        imgSortDirection.ImageUrl = sortImageUrl; 

                                        tc.Controls.Add(imgSortDirection); 

                                        // 添加排序状态提示文本 

                                        tc.Controls.Add(new LiteralControl(sortText)); 

                                        if (this._sgv.SmartSorting.AllowMultiSorting) 

                                                // 添加排序状态提示序号 

                                                tc.Controls.Add(new LiteralControl((sortOrderIndex + 1).ToString())); 

不用资源文件,又没有设置排序状态提示时的逻辑(已经注释掉了)#region 不用资源文件,又没有设置排序状态提示时的逻辑(已经注释掉了) 

                                        //// 添加排序状态提示图标 

                                        //Label lblSortDirection = new Label(); 

                                        //// 被注释的代码使用的是webdings,但是FF不支持,所以放弃了 

                                        //// lblSortDirection.Font.Name = "webdings"; 

                                        //// lblSortDirection.EnableTheming = false; 

                                        //if (sortDirection == SortDirection.Ascending) 

                                        //{ 

                                        //        // lblSortDirection.Text = "5"; 

                                        //        lblSortDirection.Text = "▲"; 

                                        //} 

                                        //else 

                                        //        // lblSortDirection.Text = "6"; 

                                        //        lblSortDirection.Text = "▼"; 

                                        //tc.Controls.Add(lblSortDirection); 

                                        //if (this._sgv.SmartSorting.AllowMultiSorting) 

                                        //        // 添加排序状态提示序号 

                                        //        tc.Controls.Add(new LiteralControl((sortOrderIndex + 1).ToString())); 

                                        #endregion 

                                } // if (sortOrderIndex != -1) 

                        } // if (tc.Controls.Count &gt; 0 &amp;&amp; tc.Controls[0] is LinkButton) 

        } 

}

/*正式版的实现 结束*/

<a href="http://webabcd.blog.51cto.com/1787395/345445" target="_blank">未完待续&gt;&gt;</a>

     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/345446,如需转载请自行联系原作者

继续阅读