【问题标题】:Sorting in gridview is not working在gridview中排序不起作用
【发布时间】:2009-08-08 11:17:13
【问题描述】:

我正在尝试网格视图中的排序功能,但它不起作用。有人可以帮忙吗?

代码:

  private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
    string newSortDirection = String.Empty;

    switch (sortDirection)
    {
        case SortDirection.Ascending:
            newSortDirection = "ASC";
            break;

        case SortDirection.Descending:
            newSortDirection = "DESC";
            break;
    }

    return newSortDirection;
}
protected DataSet FillDataSet()
{
    string source = "Database=GridTest;Server=Localhost;Trusted_Connection=yes";
    con = new SqlConnection(source);
    cmd = new SqlCommand("proc_mygrid", con);
    ds = new DataSet();
    da = new SqlDataAdapter(cmd);
    da.Fill(ds);
    GridView1.DataSource = ds;
    GridView1.DataBind();

    return ds;


}
 protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    DataTable dt = GridView1.DataSource as DataTable;
    if (dt != null)
    {
        DataView dv = new DataView(dt);
        dv.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
        GridView1.DataSource = dv;
        GridView1.DataBind();
   }

dt 来了 null。为什么?请帮忙谢谢。

编辑:

enter code here  <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" 
    GridLines="None" AllowPaging="true" AllowSorting="true" PageSize="12" 
    onpageindexchanging="GridView1_PageIndexChanging" 
    onsorting="GridView1_Sorting">

编辑(总代码)

public partial class _Default : System.Web.UI.Page 
{
    SqlConnection con;
    SqlCommand cmd;
    DataSet ds;
    SqlDataAdapter da;
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    private string ConvertSortDirectionToSql(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;

        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;

            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }

        return newSortDirection;
    }
    protected DataSet FillDataSet()
    {
        string source = "Database=GridTest;Server=Localhost;Trusted_Connection=yes";
        con = new SqlConnection(source);
        cmd = new SqlCommand("proc_mygrid", con);
        ds = new DataSet();
        da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        GridView1.DataSource = ds;
        GridView1.DataBind();

        return ds;


    }
    protected void GetValues(object sender, EventArgs e)
    {
        FillDataSet();
    }

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
       int newPagenumber = e.NewPageIndex;
       GridView1.PageIndex = newPagenumber;
       GridView1.DataSource = FillDataSet();
       GridView1.DataBind();

    }


    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {

        DataSet ds = FillDataSet();
        DataTable dt = ds.Tables[0];
        if (dt != null)
        {
            dt.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

【问题讨论】:

    标签: c# asp.net sorting gridview ado.net


    【解决方案1】:

    代码:

    private string GetSortDirection(string column)
    {
           string sortDirection = "DESC";
           string sortExpression = ViewState["SortExpression"] as string;
    
           if (sortExpression != null)
           {    
                if (sortExpression == column)
                {
                    string lastDirection = ViewState["SortDirection"] as string;
                    if ((lastDirection != null) && (lastDirection == "DESC"))
                    {
                        sortDirection = "ASC";
                    }
                }
           }
    
           ViewState["SortDirection"] = sortDirection;
           ViewState["SortExpression"] = column;
    
           return sortDirection;
    }
    
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
       DataTable dt = ((DataSet)Session["myDataSet"]).Tables[0];
       dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
       GridView1.DataSource = dt;
       GridView1.DataBind();
    }
    

    【讨论】:

    • 您能否对问题和您的代码提供一些解释?您的代码对某些人来说可能很明显,但目前对我来说可能并不像。
    【解决方案2】:

    因为您将DataSet 设置为DataSource,然后使用运算符as 将其转换为DataTable

    C# 中的 'as' 运算符是一种试探性的强制转换 - 如果无法强制转换(类型不兼容)而不是作为直接强制转换抛出异常,则 'as' 运算符会将引用设置为 null。

    如果您的数据集中只有一个数据表,那么您可以像这样获取第一个元素:

    ds.Tables[0];
    

    ...或者使用表名:

    ds.Tables["myTable"];
    

    你可以试试……

    DataTable dt = GridView1.DataSource.Tables[0] as DataTable;
    

    希望对你有帮助!

    编辑

    关于你的排序问题(一旦你得到数据表):

    if (dt != null) 
    { 
       dt.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 
       GridView1.DataBind(); 
    }
    

    您可以这样做,因为 dt 是对已为您的网格设置为 DataSource 的完全相同的对象的引用。它应该可以解决问题 - 如果没有 smt,否则我会丢失(例如我们正在对错误的表进行排序,这意味着您在 DataSet 中有多个表)。

    编辑:

    查看了您的代码。我不确切知道 GetValues 何时被解雇,但我怀疑它会导致您的问题(我认为它可能会覆盖您的排序或沿着这些线进行 smt)。

    如果您从 getValues 中注释掉 FillDataSource 并修改您的 PageLoad 以执行此操作:

      void Page_Load(Object sender, EventArgs e)
      { 
    
         // Load data only once, when the page is first loaded.
         if (!IsPostBack)
         { 
            Session["myDataSet"] = FillDataSet();
         }
    
      }
    

    然后在您的排序方法中,您可以像这样检索 DataSource:

    DataTable dt = ((DataSet)Session["myDataSet"]).Tables[0];
    

    您还可以在分页处理程序方法中从会话中检索数据集。

    您还应该注意到性能的改进,因为您只从数据库中检索了一次内容。

    试一试!

    【讨论】:

    • 尝试将代码更改为 DataSet ds = FillDataSet();数据表 dt = ds.Tables[0]; if (dt != null) {......} 现在 dv.Sort 的值为 "Id ASc"[Id name of a col]..但排序仍然不起作用:-(
    • 对于排序这将起作用:myDataTable.DefaultView.Sort = "myColumnOfChoice DESC";您需要对数据表的默认视图进行排序。
    • 去吧:dt.DefaultView.Sort = "ID ASC";
    • 不工作..更新代码:DataSet ds = FillDataSet();数据表 dt = ds.Tables[0]; if (dt != null) { DataView dv = new DataView(dt); dt.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); //dv.Sort = e.SortExpression +" "+ ConvertSortDirectionToSql(e.SortDirection); GridView1.DataSource = dv; GridView1.DataBind(); } 有什么线索吗?
    • 是的,而不是创建一个新的 DataView (dv) 只是去: dt.DefaultView.Sort = "ID ASC";就像我之前的评论一样,然后只需调用 GridView1.DataBind();
    【解决方案3】:

    在 Testing.aspx.cs 中

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        if (dataset != null)
        {
            datatable = dataset.Tables[0];
            DataView dataView = new DataView(datatable);
            dataView.Sort = e.SortExpression;
            GridView1.DataSource = dataView;
            GridView1.DataBind();
        }
    }
    

    在Testing.aspx中

    <asp:GridView ID="GridView1" runat="server" 
                  AllowSorting="True" OnSorting="GridView1_Sorting">
    

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多