2010-03-22 4 views
1

Je veux trier mes lignes Gridview par une colonne modèle qui n'est liée à aucun champ de base de données. Ce modèle coulmn a juste une étiquette dont le texte est défini dans le code en fonction d'une valeur dans une colonne différente qui est databound. Je suis donc bloqué sur la façon de définir son sortExpression puisque ce n'est pas lié à une colonne.comment trier les lignes Gridview par une colonne Modèle non liée

Répondre

0

Votre comportement souhaité est possible. Voici ce que vous devez faire:

1) Abonnez-vous à l'événement de tri de GridView.
2) Ajoutez un SortExpression à votre colonne de création, comme "MyOwnSortExpression". 2) Dans eventhandler, vous avez accès à SortExpression via EventArgs. e.SortExpression 3) Créez une méthode qui exécute DataBinding sur GridView. Cette méthode a 2 paramètres. Le premier est le nom de la colonne qui doit être triée, et le second est le Sortdirection. (serait bien de basculer la direction de tri après avoir cliqué deux fois sur la même colonne) 4) Ajouter un commutateur de code qui effectue un tri manuel uniquement sur la colonne souhaitée.

Exemple:

protected void gv_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    if(e.SortExpression == MyOwnSortExpression) 
    { 
    UpdateDataBinding(e.SortExpression, e.SortDirection); 
    e.Cancel = true; 
    return; 
    } 
} 

protected void UpdateDataBinding(String sortexpression, SortDirection direction) 
{ 
    switch(sortExpression) 
    { 
    case "MyOwnSortExpression": 
     var myData = GetYouSpecificDataFromDB(); 
     if(direction == SortDirection.Ascending) 
     { 
     var = var.OrderBy(x => string.format("jkalsd{0}", x.TheSpecifiedDBColumn)) // or any desired linq expression); 
     } 
     else 
     { 
     var = var.OrderByDescending(x => string.format("jkalsd{0}", x.TheSpecifiedDBColumn)) // or any desired linq expression); 
     } 
     this.gv.DataSource = var.ToList(); 
     this.gv.DataBind(); 
     break; 
    } 
} 

Vous pouvez ajouter la mise en cache pour la SortDirection et la colonne de tri pour activer un mécanisme de basculement.

Votre solution peut varier en fonction du type de vous faire databinding sont (LINQ to Sql, ObjectDataSource, ...)

Ce lien http://blogs.sftsrc.com/stuart/archive/2009/02/19/130.aspx fournit également une belle classe. Fonctionne mieux si vous pouvez créer un Wrapperclass, contenant toutes les valeurs qui vont être affichées. La solution que j'ai suggérée n'a pas besoin d'une classe wrapper, mais elle manque de flexibilité.

Questions connexes