如何编写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();
} --------------------编程问答--------------------
这个没用,微软的资料是绑定的固定数据数据源,而我的是根据用户选择的参数动态绑定数据的 --------------------编程问答--------------------
这个在绑定数据前,从数据库中Select数据的存储过程中已经作过了。
因为,不同用户对数据的排序要求不同,所以在存储过程中不可能一一设定,也没有必要。只能在用户界面上由用户来选定,所以需要编写Sorting事件 --------------------编程问答--------------------
您的这段代码和我的代码一很类似,区别就是保存了两个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