在使用Datagrid,Gridview时我们大多数时候是自动生成列的.我们可能需要像操作excel一样让某列自动排序,如下图,我们需要点击公差,出差等自动排序,再次点击同一列时按现反方向排序,如图:

以上使用是gridview,首先我们需要设置gridview的AllowSorting为True,再设定OnSorting事件即可,我这里是OnSorting="gvResults_Sorting",
以下是gvResults_Sorting代码,可通用.
Code
protected void gvResults_Sorting(object sender, GridViewSortEventArgs e)
{
//排序表达式
string sortExpression = "";
if (ViewState["sortExpression"] != null)
{//读取已存在排序表达式
sortExpression = ViewState["sortExpression"].ToString();
if (sortExpression == e.SortExpression + " Desc")
{//上次排序表达式为当前列名用为降序时,则按升序排序
sortExpression = e.SortExpression + " Asc";
}
else
{//与上次排序不是同一列名,或上次为升序排序,则改为降序
sortExpression = e.SortExpression + " Desc";
}
}
else
{//第一次默认为降序排列
sortExpression = e.SortExpression + " Desc";
}
//保存排序表达式至viewstate中
ViewState["sortExpression"] = sortExpression;
bindResults(sortExpression);//用新的表达式重新绑定gridview
}
private void bindResults(string sortExpression)
{
hidBegin.Value = txtBeginDate.Value.Trim();
hidEnd.Value = txtEndDate.Value.Trim();
hidName.Value = txtName.Text.Trim();
hidDept.Value = txtDeptNo.Value;
m_hr_StaffTimeSheet sheet = new m_hr_StaffTimeSheet();
//获取dataset
DataSet ds = sheet.GetResultByDeptnoNameDate(txtDeptNo.Value, txtName.Text.Trim(), txtBeginDate.Value, txtEndDate.Value);
//转换为dataview
DataView dv = ds.Tables[0].DefaultView;
if (sortExpression != null && sortExpression != "")
{//排序表达式不为空,则将dataview按sortExpression排序
dv.Sort = sortExpression;
}
else
{
ViewState["sortExpression"] = null;
}
gvResults.DataSource = dv;//绑定已排序dataview
gvResults.DataBind();
}
以上代码是通用的.只需将自己读取出来的dataset赋于ds即可.其他不用改动.
转载请注明来自http://www.cnblogs.com/xiaobier,谢谢!