关于DataGrid排序的问题 我原来以为是这样排序的!假如你帮定了列1,列2,点一下列1就正排,再点一下就反排同理,列2的也是这样可是刚下了MSDN的例子,效果确是只能正排或者反排,代码也是构造SQL语句来实现的我想问的是,如果按我的那种需求做,需要怎么做???谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要将你当前排序的字段和排序的规则(倒序、正序)记录在ViewState里面,当用户在点击排序字段时根据该ViewState里面的值来重新组织查询语句即可。 datagrid默认只能单向排序的 要点第二下下反向 就必须把上次的排序量存在VIEWSTATE里http://dev.csdn.net/develop/article/26/26817.shtm 谢谢楼上的,可是我不知道ViewState是什么意思啊? 我的代码是按照MSDN的方法写的,如下 private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 if (!Page.IsPostBack) BindData("id"); } private void BindData(string orderBy) { string SQLConnectionString="data source=192.168.1.110;uid=sa;pwd=sql;database=sc8760;"; SqlConnection sqlConn=new SqlConnection(SQLConnectionString); try { sqlConn.Open(); string cmdText="SELECT TOP 100 id,orderid,userid FROM DK_ORDERS Order by "+orderBy; SqlCommand sqlCmd=new SqlCommand(cmdText,sqlConn); SqlDataReader reader=sqlCmd.ExecuteReader(); DataGrid1.DataSource=reader; DataGrid1.DataBind(); sqlConn.Close(); } catch(Exception ex) { Response.Write("数据库连接失败!错误:<br>"+ex.Message); } } #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.DataGrid1.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.DataSort); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DataSort(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e) { BindData(e.SortExpression); }那么我该怎么修改!! 在页面初始化的时候设置一个ViewStata["Sort"]="";private void private void DataSort(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e) { if (ViewState["Sort"].ToString()==e.SortExpression) ViewState["Sort"]=e.SortExpression + " desc"; else ViewState["Sort"]=e.SortExpression ; BindData(); } //sort 事件private void DataGrid1_SortCommand(object source, DataGridSortCommandEventArgs e) { string sort=string.Empty; if(ViewState["SortExpression"].ToString()==e.SortExpression.ToString()) { if(ViewState["sort"].ToString()=="asc") {sort="desc";} else{sort="asc";} } else { if(ViewState["sort"].ToString()=="asc") {sort="desc";} else {sort="asc";} } ViewState["sort"]=sort; ViewState["SortExpression"]=e.SortExpression; DataView dv=new DataView(ds.Tables[0],null,e.SortExpression,DataViewRowState.CurrentRows); DataGrid1.DataSource=dv; DataGrid1.DataBind(); }//load 中设置private void Page_Load(object sender, System.EventArgs e) { if(!Page.IsPostBack) { ViewState["SortExpression"]=""; ViewState["sort"]="desc"; } }private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { string sortExpression = (string)ViewState["SortExpression"]; for (int i=0; i < DataGrid1.Columns.Count; i++) { if (i == 0) continue; if (DataGrid1.Columns[i].SortExpression == sortExpression) { TableCell tableCell = e.Item.Cells[i]; Label label = new Label(); label.Font.Name = "webdings"; if(ViewState["sort"].ToString()=="asc") { label.Text="6"; } else { label.Text="5"; } //label.Text = (sortAscending) ? " 6" : " 5";//add arrow label.Width =20; tableCell.Controls.Add(label); } } } 楼上的,我这样写的,不对,请用注释的方式帮我改改好么private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 if(!Page.IsPostBack) { ViewState["SortExpression"]="pub_id"; ViewState["sort"]="DESC"; } BindGrid(); } private void BindGrid() { // 获取数据 DataSet ds = new DataSet(); ds.ReadXml(Server.MapPath("TestData.xml")); //其中一列为pub_id DataView dv = new DataView(ds.Tables[0]); DataGrid1.DataSource=dv; DataGrid1.DataBind(); } #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.DataGrid1.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.DataGrid1_SortCommand); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DataGrid1_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e) { string Sort=string.Empty; if(ViewState["SortExpression"].ToString()==e.SortExpression.ToString()) { if(ViewState["Sort"].ToString()=="ASC") { Sort="DESC"; } else { Sort="ASC"; } } else { if(ViewState["Sort"].ToString()=="ASC") { Sort="DESC"; } else { Sort="ASC"; } } ViewState["Sort"]=Sort; ViewState["SortExpression"]=e.SortExpression; } 在綁定前Datatable.DefaultView.Sort = IIf(Datatable.DefaultView.Sort= e.SortExpression, e.SortExpression& " desc", e.SortExpression) DataGrid1_SortCommand这个方法里面需要重新绑定结果集到DataGrid。在你的代码里面好像没有看到绑定代码或者调用绑定方法。 我在方法DataGrid1_SortCommand里又调用了BindGrid()方法了,可是还是没起作用我Response.Write(ViewState["Sort"].ToString());然后运行程序第一次运行当然显示DESC,结果我点了一次以后还是显示DESC,再点的话才会交替显示帮我改改程序吧,一个小问题折腾了我一天了!!!! 过滤 怎么获取GridView中某一行某列的值 问:纯WEB、无压缩,能否实现多文件下载?online 哪位前辈能否说说连接SQL Server方法? 关于ViewState的疑问???? 数据不正确,在线等解决方案 菜鸟问题,50分求助 有谁用过schemanamecollection吗?我想在AD(active directory)增加一种自定义的架构 .net写的组件,asp可以调用吗?如何调用? 痛苦,我已经好几天进不了CSDN了,到底是怎么回事~~??!! DsoFramer是不是不可以用于asp.net中? 微软到底想干什么?逗人玩吗?
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!Page.IsPostBack)
BindData("id"); }
private void BindData(string orderBy)
{
string SQLConnectionString="data source=192.168.1.110;uid=sa;pwd=sql;database=sc8760;";
SqlConnection sqlConn=new SqlConnection(SQLConnectionString);
try
{
sqlConn.Open();
string cmdText="SELECT TOP 100 id,orderid,userid FROM DK_ORDERS Order by "+orderBy;
SqlCommand sqlCmd=new SqlCommand(cmdText,sqlConn);
SqlDataReader reader=sqlCmd.ExecuteReader();
DataGrid1.DataSource=reader;
DataGrid1.DataBind();
sqlConn.Close();
}
catch(Exception ex)
{
Response.Write("数据库连接失败!错误:<br>"+ex.Message);
}
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.DataGrid1.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.DataSort);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void DataSort(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
BindData(e.SortExpression);
}
那么我该怎么修改!!
{
if (ViewState["Sort"].ToString()==e.SortExpression)
ViewState["Sort"]=e.SortExpression + " desc";
else
ViewState["Sort"]=e.SortExpression ;
BindData();
}
private void DataGrid1_SortCommand(object source, DataGridSortCommandEventArgs e)
{
string sort=string.Empty;
if(ViewState["SortExpression"].ToString()==e.SortExpression.ToString())
{
if(ViewState["sort"].ToString()=="asc")
{sort="desc";}
else{sort="asc";}
}
else
{
if(ViewState["sort"].ToString()=="asc")
{sort="desc";}
else
{sort="asc";}
}
ViewState["sort"]=sort;
ViewState["SortExpression"]=e.SortExpression;
DataView dv=new DataView(ds.Tables[0],null,e.SortExpression,DataViewRowState.CurrentRows);
DataGrid1.DataSource=dv;
DataGrid1.DataBind();
}
//load 中设置
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
ViewState["SortExpression"]="";
ViewState["sort"]="desc";
}
}private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
string sortExpression = (string)ViewState["SortExpression"];
for (int i=0; i < DataGrid1.Columns.Count; i++)
{
if (i == 0) continue;
if (DataGrid1.Columns[i].SortExpression == sortExpression)
{
TableCell tableCell = e.Item.Cells[i];
Label label = new Label();
label.Font.Name = "webdings";
if(ViewState["sort"].ToString()=="asc")
{
label.Text="6";
}
else
{
label.Text="5";
}
//label.Text = (sortAscending) ? " 6" : " 5";//add arrow
label.Width =20;
tableCell.Controls.Add(label);
}
}
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面 if(!Page.IsPostBack)
{
ViewState["SortExpression"]="pub_id";
ViewState["sort"]="DESC";
}
BindGrid();
}
private void BindGrid()
{ // 获取数据
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("TestData.xml")); //其中一列为pub_id
DataView dv = new DataView(ds.Tables[0]); DataGrid1.DataSource=dv;
DataGrid1.DataBind();
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.DataGrid1.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.DataGrid1_SortCommand);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void DataGrid1_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
string Sort=string.Empty;
if(ViewState["SortExpression"].ToString()==e.SortExpression.ToString())
{
if(ViewState["Sort"].ToString()=="ASC")
{
Sort="DESC";
}
else
{
Sort="ASC";
}
}
else
{
if(ViewState["Sort"].ToString()=="ASC")
{
Sort="DESC";
}
else
{
Sort="ASC";
}
}
ViewState["Sort"]=Sort;
ViewState["SortExpression"]=e.SortExpression;
}
Datatable.DefaultView.Sort = IIf(Datatable.DefaultView.Sort= e.SortExpression, e.SortExpression& " desc", e.SortExpression)
BindGrid()方法了,可是还是没起作用
我Response.Write(ViewState["Sort"].ToString());然后运行程序
第一次运行当然显示DESC,结果我点了一次以后还是显示DESC,再点的话才会交替显示
帮我改改程序吧,一个小问题折腾了我一天了!!!!