问题如题
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事件处理机制到底是怎样的
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事件处理机制到底是怎样的
解决方案 »
- AJAX 调用问题。(进着有分!)
- 求一个jQery AJAX的问题
- ASP.NET的treeview如何在节点右边显示添加 更新 删除 按钮呢?
- ASP.NET无刷新上传
- ASP.NET页中,有两个提交按钮和验证的问题
- 将网站管理员的密码等放到Web.config文件中==不安全???
- 查了好多书也得不到解决的两个菜鸟问题
- windows server 2008 r2 发布网站后不能用IP+端口号访问,只能用loachost+端口号,求解答!!!!!
- 菜鸟问题:vs.net动态帮助没有了怎么掉出来
- 我用asp.net制作网页用什麽工具作美工好呢?比如:asp.net+photoshop万事俱备???对吗???
- 水晶报表 公式的问题!
- 如何在本地IIS配置多个端口。
这个看看吧
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
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的赋值根本没有被保留。
调试成功后的代码: 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/