问题如题
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事件处理机制到底是怎样的

解决方案 »

  1.   

    好久没有使用GridView的排序功能了;其实你完全可以先对数据内存进行排序再绑定就好了阿,那就会简单很多;
      

  2.   

    http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.sorting(VS.80).aspx
    这个看看吧
      

  3.   

    不发了,看这个:
    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();    
        }
      

  4.   


    这个在绑定数据前,从数据库中Select数据的存储过程中已经作过了。
    因为,不同用户对数据的排序要求不同,所以在存储过程中不可能一一设定,也没有必要。只能在用户界面上由用户来选定,所以需要编写Sorting事件
      

  5.   


    您的这段代码和我的代码一很类似,区别就是保存了两个ViewState
      

  6.   

    俺很少用这个GridView  一般都用Repeater
      

  7.   

    看看以下的对你有没有帮助:
    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();
                }
            }
      

  8.   

    哈哈哈,问题终于解决了。在解决问题的过程中收获不小。
    调试成功后的代码: 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的赋值根本没有被保留。
      

  9.   

    上面贴子中的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的赋值根本没有被保留。
      

  10.   

    在解决这个问题中浏览到的帮助最大的贴子:
    http://social.microsoft.com/forums/zh-CN/295/thread/9d3e2371-45bd-49e6-b78e-633fc95422f6/
      

  11.   

    http://blog.csdn.net/xianfajushi/archive/2008/11/30/3413317.aspx