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


    今天需要用到在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();
        }



    其它參考:
    http://www.cnblogs.com/jackyrong/archive/2006/05/26/409788.html
    http://stlh.blogspot.com/2008/02/gridview-sort.html
  • 相关阅读:
    最小生成树之 Prim 算法
    Linux通过ps命令找到进程并kill当前进程
    M6G2C Cortex®A7工控核心板SIMCOM4G模块移植流程
    Spring事件监听机制源码解析
    Pytorch损失函数总结
    目标检测任务理解与总结
    [炼丹术]EfficientDet训练模型学习总结
    [炼丹术]DeepLabv3+训练模型学习总结
    可视化经典模型的对比实验总结
    基于COCO数据集验证的目标检测算法天梯排行榜
  • 原文地址:https://www.cnblogs.com/goody9807/p/1257458.html
Copyright © 2020-2023  润新知