2009-08-08 5 views
4

J'essaie de trier les fonctionnalités en mode Grille, mais cela ne fonctionne pas.Peut-être une aide du corps?Le tri dans gridview ne fonctionne pas

code:

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

Ici dt arrive null.why? pls aide merci.

EDIT:

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"> 

EDIT (Code total)

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

Répondre

6

CODE:

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(); 
} 
+1

Pourriez-vous fournir quelques explications au problème et à votre code s'il vous plaît? Votre code peut sembler évident à certains mais ne pourrait pas être comme pour moi en ce moment. –

0

Parce que vous configurez un DataSet comme DataSource puis coulée à DataTable avec l'opérateur as. L'opérateur 'as' dans C# est un cast provisoire - s'il est impossible de lancer (les types ne sont pas compatibles) au lieu de lancer une exception car la commande directe l'opérateur 'as' définit la référence à null.

Si vous avez seulement un datatable dans votre ensemble de données, vous pouvez alors obtenir le premier élément comme celui-ci:

ds.Tables[0]; 

... ou utilisez le nom de la table:

ds.Tables["myTable"]; 

dans votre cas vous pouvez essayer ...

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

Espérons que ça aide!

EDIT:

en ce qui concerne votre problème de tri (une fois que vous obtenez le datatable):

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

Vous pouvez faire cela parce que dt est une référence au même objet exact qui est déjà défini comme DataSource pour votre grille. Cela devrait faire l'affaire - sinon il y a autre chose qui me manque (comme si on triait la mauvaise table, ce qui signifie que vous avez plus d'une table dans le DataSet).

EDIT:

avait un oeil à votre code. Je ne sais pas exactement quand GetValues ​​sera renvoyé mais je soupçonne que cela cause votre problème (je pense que cela pourrait l'emporter sur votre tri ou smt dans ce sens).

Si vous commentez FillDataSource de getValues ​​et de modifier votre PageLoad pour ce faire:

void Page_Load(Object sender, EventArgs e) 
    { 

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

    } 

alors dans votre méthode de tri, vous extrayez la DataSource comme ceci:

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

vous pouvez également récupérer les DataSet de la session dans votre méthode de gestionnaire de pagination.

Vous devriez également remarquer une amélioration des performances puisque vous récupérez une seule fois le contenu de la base de données.

Faites le tour!

+0

Alors, comment surmonter et exécuter le code toute suggestion? – Wondering

+0

Essayé et changé le code en DataSet ds = FillDataSet(); DataTable dt = ds.Tables [0]; if (dt! = Null) {......} Maintenant, dv.Sort a la valeur "Id ASc" [nom d'un col] .. mais toujours le tri ne fonctionne pas :-( – Wondering

+0

pour le tri cela fonctionnera. myDataTable.DefaultView.Sort = "myColumnOfChoice DESC", vous devez trier la vue par défaut de votre datatable – JohnIdol

0

Dans 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(); 
    } 
} 

Dans Testing.aspx

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