我原来以为是这样排序的!
假如你帮定了列1,列2,点一下列1就正排,再点一下就反排
同理,列2的也是这样可是刚下了MSDN的例子,效果确是只能正排或者反排,代码也是构造SQL语句来实现的我想问的是,如果按我的那种需求做,需要怎么做???谢谢!

解决方案 »

  1.   

    需要将你当前排序的字段和排序的规则(倒序、正序)记录在ViewState里面,当用户在点击排序字段时根据该ViewState里面的值来重新组织查询语句即可。
      

  2.   

    datagrid默认只能单向排序的  要点第二下下反向  就必须把上次的排序量存在VIEWSTATE里http://dev.csdn.net/develop/article/26/26817.shtm
      

  3.   

    谢谢楼上的,可是我不知道ViewState是什么意思啊?
      

  4.   

    我的代码是按照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);
    }
    那么我该怎么修改!!
      

  5.   

    在页面初始化的时候设置一个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();
    }
      

  6.   

    //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);
        }
       }
      }
      

  7.   

    楼上的,我这样写的,不对,请用注释的方式帮我改改好么
    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;
    }
      

  8.   

    在綁定前
    Datatable.DefaultView.Sort = IIf(Datatable.DefaultView.Sort= e.SortExpression, e.SortExpression& " desc", e.SortExpression)
      

  9.   

    DataGrid1_SortCommand这个方法里面需要重新绑定结果集到DataGrid。在你的代码里面好像没有看到绑定代码或者调用绑定方法。
      

  10.   

    我在方法DataGrid1_SortCommand里又调用了
    BindGrid()方法了,可是还是没起作用
    我Response.Write(ViewState["Sort"].ToString());然后运行程序
    第一次运行当然显示DESC,结果我点了一次以后还是显示DESC,再点的话才会交替显示
    帮我改改程序吧,一个小问题折腾了我一天了!!!!