2009-05-15 17 views
2

J'ai un gridview (en fait un SPgridview)gridview Triés sélectionne la mauvaise ligne

Et je fait la columnname afin que les utilisateurs en lien hypertexte peut trier les lignes en utilisant les données. Et ça marche bien.

Le problème se produit lorsque les utilisateurs essaient de sélectionner une ligne après avoir trié les données. Je peux voir que le gridview "oublie" comment les lignes ont été triées et sélectionne la ligne qui était à l'index cliqué avant qu'il ne soit trié ..

Comment résoudre ce problème? J'ai essayé de trier à nouveau la ligne après que l'utilisateur ait sélectionné une ligne, mais cela ne semble pas fonctionner. Et le gridview devrait-il se souvenir du fait qu'il a juste été trié?

Merci à l'avance :)

Répondre

2

Assurez-vous que vous n'êtes pas reconsolidation la grille après une publication.

if(!IsPostBack) 
{ 
    gridView.DataSource = yourDataSource; 
    gridView.DataBind(); 
} 
+0

Ah désolé, peut-être il vaut la peine de mentionner que le spgridview est placé à l'intérieur d'un webpart sharepoint. Je dois donc créer les contrôles après chaque publication. :/ – Moulde

1

Vous saisissez la ligne sélectionnée par son index de ligne ou par l'identifiant unique des données que vous souhaitez modifier? Si vous obtenez par index de ligne, il peut être «oublier» puisque vous recréerez la grille sur OnPostBack. Essayez de parcourir les données et sélectionnez-le en fonction de son identifiant unique, et non de son index de ligne.

+0

Im obtenir la cléData selected, et je me connecte à un autre webpart en utilisant cette clé, et cela fonctionne, mais c'est comme le gridview sur ma sélection avec son propre ou quelque chose. Parce que je cours sur les lignes et que je place celui qui correspond à la clé de données à sélectionner, mais après la publication, il réinitialise le tri et la ligne est sélectionnée par index à la place. – Moulde

0

Je l'ai fonctionné. (un peu)

Dans l'événement de tri j'ai sauvé le sortexpression (le nom de la colonne utilisée pour trier) et la direction de tri ascendant ou descendant.

Ensuite, je crée la source de données pour le gridview et la base de données, et après la liaison de données, j'utilise la commande gridview.sort pour trier les valeurs que j'ai enregistrées dans viewstate.

Cela fonctionne bien, un seul problème. Lors du tri je l'ai fait changer de direction après avoir appuyé sur la même colonne plus d'une fois. Maintenant, il pense que je continue d'appuyer sur le titre de la colonne, de sorte qu'il ne cesse d'inverser le tri.

Mais je l'ai fait tempérer que le tri dans une direction. Et maintenant je joue avec l'objet expéditeur dans l'événement de tri, je pense que si je pouvais obtenir des informations sur ce qui causait l'événement, je pourrais le dire pour changer de direction uniquement en fonction de l'expéditeur.

Merci :)

2

Lorsque vous gérez l'événement tri défini une variable de session fixé à la direction de tri et de l'utiliser lorsque vous REBIND votre source de données.

protected void gridview_Sorting() 
{ 
    // BIND DATA Function 
    BindData(); 

    DataTable dt = gridview.DataSource as DataTable; 

    if (dt != null) 
    { 
     //Sort the data. 
     dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression); 

     Session["sort"] = dt.DefaultView.Sort; 
     gridview.DataSource = dt; 
     gridview.DataBind(); 
    } 
} 





// bind data function// 

private void BindData() 
{ 

    DataTable dt = GetDataTable(); 

    if (Session["sort"] != null) 
    { 
     //Sort the data. 
     dt.DefaultView.Sort = Session["sort"].ToString(); 
    } 

    gridview.DataSource = dt; 
    gridview.DataBind(); 
} 
1

J'avais créé un certain nombre de GridViews triables, mais aucun avec l'interaction de commande de ligne avant aujourd'hui, quand je suis tombé sur ce problème. Le mien est un "simple" GridView, pas SPgridview. J'ai trouvé ceci fonctionne:

  1. Dans bindData(), si nous n'avons pas créé de DataTable et l'avons placé dans l'objet Session, faites-le.Sinon, nous allons utiliser l'existant, CLASSÉS DataTable:
if (Session["dtbl"] == null) { 
    Session["dtbl"] = method_to_fetch_datatable(); 
} 
gv.DataSource = Session["dtbl"] as DataTable; 
gv.DataBind(); 
  1. Dans le traitement de l'GridView de commandes ligne qui INSERT, UPDATE ou DELETE données sous-jacentes, rafraîchissent l'objet de la session, le maintien de la sorte, s'il y a une:
Session["dtbl"] = method_to_fetch_datatable(); 
if (ViewState["SortExpression"] != null) { 
    DataTable dt = Session["dtbl"] as DataTable; 
    dt.DefaultView.Sort = ViewState["SortExpression"] as string; 
} 
bindData();