2.7 表头双向排序

排序也是一个重要的功能,我们希望单击数据表的表头标题能排序,并且再次单击能排回来,单击“属性”菜单,设置行为AllowSorting的值为True即可,如图2-18所示。

图2-18 设置排序属性

这样并没有完成,不然就会报错:GridView“GridView1”激发了未处理的事件“Sorting”。

同分页的道理一样,双击Sorting,系统为我们添加了如下代码:

        protectedvoid GridView1_Sorting(object sender, GridViewSortEventArgs e)
        {
        }

相比分页,排序的代码就要复杂的多,其实排序的原理就是利用DataView的Sort属性,类似于拼凑SQL语句,页面的开始在ViewState中存储主键和排序,默认是“升序”,ViewState["OrderDire"]="ASC";,由于单击标题我们希望能“排”回来,所以要在分页事件中添加ViewState["OrderDire"]="Desc";,全部代码如下所示。

        SqlConnection sqlcon;
        string strCon=ConfigurationManager.ConnectionStrings[ "SQLCONN" ].ToString();
        protectedvoid Page_Load(object sender, EventArgs e)
              {
        if (!IsPostBack)
                    {
                        ViewState["SortOrder"]="员工编号";
                      ViewState["OrderDire"]="ASC";
                      bind();
                    }
              }
        //绑定
        publicvoid bind()
              {
        string sqlstr="select top 20 员工编号,身份证号码,姓名,性别,地址  from 章立民工
    作室";
                    sqlcon=newSqlConnection(strCon);
        SqlDataAdapter myda=newSqlDataAdapter(sqlstr, sqlcon);
        DataSet myds=newDataSet();
                    sqlcon.Open();
                    myda.Fill(myds, "table");
        DataView view=myds.Tables[0].DefaultView;
        string  sort = (string)ViewState["SortOrder"]  +  "  "  +  (string)ViewState
    ["OrderDire"];
                    view.Sort=sort;
                    GridView1.DataSource=view;
                    GridView1.DataBind();
                    sqlcon.Close();
              }
        protectedvoid GridView1_Sorting(object sender, GridViewSortEventArgs e)
              {
        string sPage=e.SortExpression;
        if (ViewState["SortOrder"].ToString() == sPage)
                    {
        if (ViewState["OrderDire"].ToString() == "Desc")
                          ViewState["OrderDire"]="ASC";
        else
                          ViewState["OrderDire"]="Desc";
                    }
        else
                    {
                      ViewState["SortOrder"]=e.SortExpression;
                    }
                    bind();
              }

排序效果如图2-19所示。

图2-19 排序效果

同时单击其他列也可以排序,如图2-20所示。

图2-20 单击“员工编号”排序