当前位置:编程学习 > C#/ASP.NET >>

如何编写GridView的Sorting事件处理程序

问题如题
windows 2000 Professional + SQL2000 + Visual Studio 2005 + ASP.NET

我的GridView的数据源是由一个Button的Click事件调用一个代参数方法来绑定的,此方法的参数由用户通过页面上的DropDownlist控件选择。此方法返回一个DataSet,此DataSet绑定到GridView上,成为GridView的数据源。

在设计页面上,我将GridView的AllowSorting属性设置为True,由于GridView的数据源是动态绑定的,所以要编写Sorting事件处理代码。

我编写了如下两段代码,均不成功。

代码一

 protected void GridView_ReferedDataDetail_Sorting(object sender, GridViewSortEventArgs e)
    {
        if (DataTable_GridView_ReferedDataDetail != null)
        {
            DataView DataView_GridView_ReferedDataDetail = new DataView(DataTable_GridView_ReferedDataDetail);

            if (e.SortDirection == SortDirection.Ascending)
            {
                e.SortDirection = SortDirection.Descending;
                ViewState["sortDirection"] = e.SortDirection;
                DataView_GridView_ReferedDataDetail.Sort = e.SortExpression + "" + e.SortDirection;
            }
            else
            {
                e.SortDirection = SortDirection.Ascending;
                ViewState["sortDirection"] = e.SortDirection;
                DataView_GridView_ReferedDataDetail.Sort = e.SortExpression + "" + e.SortDirection;
            }

            GridView_ReferedDataDetail.DataSource = DataView_GridView_ReferedDataDetail;
            GridView_ReferedDataDetail.DataBind();
        }
    }


其中DataTable_GridView_ReferedDataDetail是在GridView的数据绑定事件中获得的数据源DateSet的Table[0],也即DataSet.Table[0]

代码一在运行时出现如下提示
错误:
   无法找到列 XXXXDescending。      此处XXXX是GridVieew的数据列名称
排错提示:
1、确保列表中的最大索引小于列表大小
2、确保数据列名称正确
3、确保索引不是负数
4、获取此异常的常规帮助


代码二

protected void GridView_ReferedDataDetail_Sorting(object sender, GridViewSortEventArgs e)
    {
        SortDirection direction;
        switch (e.SortDirection.ToString())
        {
            case "Ascending":
                direction = SortDirection.Ascending;
                break;
            case "Descending":
                direction = SortDirection.Descending;
                break;
            default:
                direction = SortDirection.Ascending;
                break;
        }

        GridView_ReferedDataDetail.Sort(e.SortExpression, direction);
    }


代码二在运行时出现如下提示
错误:
未处理的“System.StackOverflowException”类型的异常出现在 mscorlib.dll 中。
排错提示
1、确保您没有无限循环或无限递归
2、获取此异常的常规帮助

请教各位高手
1、这个Sorting事件处理代码要怎么写
2、GridView的Sorting事件处理机制到底是怎样的 --------------------编程问答-------------------- 好久没有使用GridView的排序功能了;其实你完全可以先对数据内存进行排序再绑定就好了阿,那就会简单很多; --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.sorting(VS.80).aspx
这个看看吧 --------------------编程问答-------------------- sorting都没用过。。 --------------------编程问答-------------------- 告诉我邮箱,给你发个我做的例子 --------------------编程问答-------------------- 不发了,看这个:
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ViewState["sortExpression"] = "id";
            ViewState["sort"] = " DESC";
            GridBind();
        }
    }

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        ViewState["sortExpression"] = e.SortExpression;
        if (ViewState["sort"].ToString() == " DESC")                     
        {
            ViewState["sort"] = " ASC";
            GridBind();
        }
        else
        {
            ViewState["sort"] = " DESC";
            GridBind();
        }
        
    }
    private void GridBind()
    {
        DataSet myset = DataProxy.GetDataSet();
        DataView myview = myset.Tables[0].DefaultView;
        myview.Sort = ViewState["sortExpression"].ToString() + ViewState["sort"].ToString();
        GridView1.DataSource = myview;
        GridView1.DataBind();    
    } --------------------编程问答--------------------
引用 2 楼 hy_lihuan 的回复:
http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.sorting(VS.80).aspx 
这个看看吧

这个没用,微软的资料是绑定的固定数据数据源,而我的是根据用户选择的参数动态绑定数据的 --------------------编程问答--------------------
引用 1 楼 hy_lihuan 的回复:
好久没有使用GridView的排序功能了;其实你完全可以先对数据内存进行排序再绑定就好了阿,那就会简单很多;


这个在绑定数据前,从数据库中Select数据的存储过程中已经作过了。
因为,不同用户对数据的排序要求不同,所以在存储过程中不可能一一设定,也没有必要。只能在用户界面上由用户来选定,所以需要编写Sorting事件 --------------------编程问答--------------------
引用 5 楼 sy375 的回复:
不发了,看这个: 
protected void Page_Load(object sender, EventArgs e) 
    { 
        if (!IsPostBack) 
        { 
            ViewState["sortExpression"] = "id"; 
            ViewState["sort"] = " DESC"; 
            GridBind(); 
        } 
    } 

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
    { 
        ViewState["sortExpression"] = e.SortExpressio…


您的这段代码和我的代码一很类似,区别就是保存了两个ViewState --------------------编程问答-------------------- 俺很少用这个GridView  一般都用Repeater --------------------编程问答-------------------- 看看以下的对你有没有帮助:
protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
        {
            BindGridView();
            GridViewSortExpression = e.SortExpression;

            gridView.DataSource = SortDataTable(gridView.DataSource as DataTable, false);
            gridView.DataBind();
        }
        private string GridViewSortExpression
        {
            get { return ViewState["SortExpression"] as string ?? string.Empty; }

            set { ViewState["SortExpression"] = value; }

        }
        private string GridViewSortDirection
        {
            get { return ViewState["SortDirection"] as string ?? "ASC"; }

            set { ViewState["SortDirection"] = value; }

        }

        private string GetSortDirection()
        {
            switch (GridViewSortDirection)
            {
                case "ASC":
                    GridViewSortDirection = "DESC";
                    break;

                case "DESC":
                    GridViewSortDirection = "ASC";
                    break;
            }
            return GridViewSortDirection;
        }
        protected DataView SortDataTable(DataTable dataTable, bool isPageIndexChanging)
        {
            if (dataTable != null)
            {
                DataView dataView = new DataView(dataTable);

                if (GridViewSortExpression != string.Empty)
                {

                    if (isPageIndexChanging)
                    {
                        dataView.Sort = string.Format("{0} {1}", GridViewSortExpression, GridViewSortDirection);
                    }

                    else
                    {
                        dataView.Sort = string.Format("{0} {1}", GridViewSortExpression, GetSortDirection());
                    }
                }
                return dataView;
            }
            else
            {
                return new DataView();
            }
        } --------------------编程问答-------------------- 哈哈哈,问题终于解决了。在解决问题的过程中收获不小。
调试成功后的代码:

 protected void GridView_ReferedDataDetail_Sorting(object sender, GridViewSortEventArgs e)
    {

        DataTable DataTable_GridView_ReferedDataDetail = (DataTable)ViewState["DataTable_GridView_ReferedDataDetail"];
        DataView DataViewRefereDataDetail = DataTable_GridView_ReferedDataDetail.DefaultView;

        if (ViewState["DataTable_GridView_ReferedDataDetail"] != null)
        {
            if (ViewState["GridView_ReferedDataDetail_SortDirection"].ToString() == "Asc")
            {
                ViewState["GridView_ReferedDataDetail_SortDirection"] = "Desc";
                string MySortDirection = "Desc";
                string MySortExpression = e.SortExpression + " " + MySortDirection;
                DataViewRefereDataDetail.Sort = MySortExpression;
            }
            else
            {
                ViewState["GridView_ReferedDataDetail_SortDirection"] = "Asc";
                string MySortDirection = "Asc";
                string MySortExpression = e.SortExpression + " " + MySortDirection;
                DataViewRefereDataDetail.Sort = MySortExpression;
                
            }
        }

        GridView_ReferedDataDetail.DataSource = DataViewRefereDataDetail;
        GridView_ReferedDataDetail.DataBind();

        }


其中红色部分是在GridView的数据绑定时,在ViewState中记录GridView的试图状态


体会:
1、在写程序或检查错误时一定要细心。比如我在方法一中就将 " "写成了"",将其中的空格丢弃了
2、差错时,Visual Studio给出的错误和排错提示很重要,一定要仔细看看。
3、对于GridView,如果其数据源不是数据源控件,而是在后台程序中自定义的数据源,在进行数据绑定的同时,应该在ViewState中记录GridView的试图状态(如果需要的话,比如用于Sorting事件),否则,在GridView的Sorting事件中再调用GridView的相关属性将是Null
4、GridView的有关属性可能都是针对数据源控件的,比如在
protected void GridView_ReferedDataDetail_Sorting(object sender, GridViewSortEventArgs e)
中e.SortDirection。比方如果我在GridView列表头中点击第一次Sorting事件,此时e.SortDirection默认值为SortDirection.Ascending,在后台程序中我处理第一次Sorting事件,将e.SortDirection赋值为SortDirection.Descending,然后,再第二次点击GridView列表头中相同的列表头,此时,按我思路e.SortDirection的值应该是SortDirection.Descending,然而实际上e.SortDirection依然是其默认值SortDirection.Ascending,也就是说在处理第一Sorting事件中对e.SortDirection的赋值根本没有被保留。 --------------------编程问答-------------------- 上面贴子中的C#错误的添加了字体控制Html代码,实际应该如下

哈哈哈,问题终于解决了。在解决问题的过程中收获不小。
调试成功后的代码:

 protected void GridView_ReferedDataDetail_Sorting(object sender, GridViewSortEventArgs e)
    {

        DataTable DataTable_GridView_ReferedDataDetail = (DataTable)ViewState["DataTable_GridView_ReferedDataDetail"];
        DataView DataViewRefereDataDetail = DataTable_GridView_ReferedDataDetail.DefaultView;

        if (ViewState["DataTable_GridView_ReferedDataDetail"]!= null)
        {
            if (ViewState["GridView_ReferedDataDetail_SortDirection"].ToString() == "Asc")
            {
                ViewState["GridView_ReferedDataDetail_SortDirection"] = "Desc";
                string MySortDirection = "Desc";
                string MySortExpression = e.SortExpression + " " + MySortDirection;
                DataViewRefereDataDetail.Sort = MySortExpression;
            }
            else
            {
                ViewState["GridView_ReferedDataDetail_SortDirection"] = "Asc";
                string MySortDirection = "Asc";
                string MySortExpression = e.SortExpression + " " + MySortDirection;
                DataViewRefereDataDetail.Sort = MySortExpression;
                
            }
        }

        GridView_ReferedDataDetail.DataSource = DataViewRefereDataDetail;
        GridView_ReferedDataDetail.DataBind();

        }


其中红色部分是在GridView的数据绑定时,在ViewState中记录GridView的试图状态


体会:
1、在写程序或检查错误时一定要细心。比如我在方法一中就将 " "写成了"",将其中的空格丢弃了
2、差错时,Visual Studio给出的错误和排错提示很重要,一定要仔细看看。
3、对于GridView,如果其数据源不是数据源控件,而是在后台程序中自定义的数据源,在进行数据绑定的同时,应该在ViewState中记录GridView的试图状态(如果需要的话,比如用于Sorting事件),否则,在GridView的Sorting事件中再调用GridView的相关属性将是Null
4、GridView的有关属性可能都是针对数据源控件的,比如在
protected void GridView_ReferedDataDetail_Sorting(object sender, GridViewSortEventArgs e)
中e.SortDirection。比方如果我在GridView列表头中点击第一次Sorting事件,此时e.SortDirection默认值为SortDirection.Ascending,在后台程序中我处理第一次Sorting事件,将e.SortDirection赋值为SortDirection.Descending,然后,再第二次点击GridView列表头中相同的列表头,此时,按我思路e.SortDirection的值应该是SortDirection.Descending,然而实际上e.SortDirection依然是其默认值SortDirection.Ascending,也就是说在处理第一Sorting事件中对e.SortDirection的赋值根本没有被保留。 --------------------编程问答-------------------- 在解决这个问题中浏览到的帮助最大的贴子:
http://social.microsoft.com/forums/zh-CN/295/thread/9d3e2371-45bd-49e6-b78e-633fc95422f6/ --------------------编程问答-------------------- up 
大家学习楼主,
问题解决了把答案贴处理!! --------------------编程问答-------------------- 5楼正解啊,为什么不给分 --------------------编程问答-------------------- 不错` --------------------编程问答-------------------- http://blog.csdn.net/xianfajushi/archive/2008/11/30/3413317.aspx --------------------编程问答-------------------- up 5楼 --------------------编程问答-------------------- 凑热闹........
--------------------编程问答-------------------- --------------------编程问答--------------------  从来都是排完序在绑定的. . .

 
  看来孟子老师  好像下班了呀. .. 
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,