tri et pagination avec gridview asp.net

j'essaie d'obtenir un gridview pour trier et page manuellement sans succès.

le problème est que lorsqu'un utilisateur clique sur la colonne qu'il veut trier, il trie cette page, mais ne trie pas la source de données (dataview) derrière gridview. Donc quand ils progressent vers une autre page, leur espèce est perdue. Je cherche une sorte de source de données derrière gridview. Voici ce que j'ai jusqu'à présent:

protected void GridView_OnSort(object sender, GridViewSortEventArgs e)
    {
        String sortExpression = e.SortExpression;

        if (GridViewSortDirection == SortDirection.Ascending)
        {
            DataView myDataView = new DataView(mybll.GetItemsOrdered());
            myDataView.Sort = sortExpression + " DESC";
            GridView.DataSource = myDataView;
            GridView.DataBind();
        }
        else
        {
            DataView myDataView = new DataView(mybll.GetItemsOrdered());
            myDataView.Sort = sortExpression + " ASC";
            GridView.DataSource = myDataView;
            GridView.DataBind();
        }
    }

Toute aide serait appréciée. Grâce.

29
demandé sur dangerisgo 2009-03-31 23:11:58

5 réponses

enregistrez votre ordre de tri dans un ViewState.

private const string ASCENDING = " ASC";
private const string DESCENDING = " DESC";

public SortDirection GridViewSortDirection
{
    get
    {
        if (ViewState["sortDirection"] == null)
            ViewState["sortDirection"] = SortDirection.Ascending;

        return (SortDirection) ViewState["sortDirection"];                
    }
    set { ViewState["sortDirection"] = value; } 
}

protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
{
    string sortExpression = e.SortExpression;

    if (GridViewSortDirection == SortDirection.Ascending)
    {
        GridViewSortDirection = SortDirection.Descending;
        SortGridView(sortExpression, DESCENDING);
    }
    else
    {
        GridViewSortDirection = SortDirection.Ascending;
        SortGridView(sortExpression, ASCENDING); 
    }   

}

private void SortGridView(string sortExpression,string direction)
{
    //  You can cache the DataTable for improving performance
    DataTable dt = GetData().Tables[0]; 

    DataView dv = new DataView(dt); 
    dv.Sort = sortExpression + direction;         

    GridView1.DataSource = dv;
    GridView1.DataBind();         
}

pourquoi ne voulez-vous pas utiliser les fonctionnalités de tri existantes? Vous pouvez toujours personnaliser.

tri des données dans un contrôle de serveur web GridView at MSDN

Voici un exemple de personnalisation:

http://www.netomatix.com/development/GridViewSorting.aspx

53
répondu Konstantin Tarkus 2009-03-31 19:19:29
<asp:GridView 
    ID="GridView1" runat="server" AutoGenerateColumns="false" AllowSorting="True" onsorting="GridView1_Sorting" EnableViewState="true"> 
    <Columns>
        <asp:BoundField DataField="bookid" HeaderText="BOOK ID"SortExpression="bookid"  />
        <asp:BoundField DataField="bookname" HeaderText="BOOK NAME" />
        <asp:BoundField DataField="writer" HeaderText="WRITER" />
        <asp:BoundField DataField="totalbook" HeaderText="TOTALBOOK" SortExpression="totalbook"  />
        <asp:BoundField DataField="availablebook" HeaderText="AVAILABLE BOOK" />
    </Columns>
</asp:GridView>

Code derrière:

protected void Page_Load(object sender, EventArgs e) {
        if (!IsPostBack) {
            string query = "SELECT * FROM book";
            DataTable DT = new DataTable();
            SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
            DA.Fill(DT);

            GridView1.DataSource = DT;
            GridView1.DataBind();
        }
    }

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) {

        string query = "SELECT * FROM book";
        DataTable DT = new DataTable();
        SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
        DA.Fill(DT);

        GridView1.DataSource = DT;
        GridView1.DataBind();

        if (DT != null) {
            DataView dataView = new DataView(DT);
            dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);

            GridView1.DataSource = dataView;
            GridView1.DataBind();
        }
    }

    private string GridViewSortDirection {
        get { return ViewState["SortDirection"] as string ?? "DESC"; }
        set { ViewState["SortDirection"] = value; }
    }

    private string ConvertSortDirectionToSql(SortDirection sortDirection) {
        switch (GridViewSortDirection) {
            case "ASC":
                GridViewSortDirection = "DESC";
                break;

            case "DESC":
                GridViewSortDirection = "ASC";
                break;
        }

        return GridViewSortDirection;
    }
}
5
répondu AVIK GHOSH 2013-08-05 00:08:22

j'ai trouvé un moyen beaucoup plus facile, qui vous permet de toujours utiliser le construit dans le tri/paging de la gridview standard...

créer 2 étiquettes. mettez-les à visible = false. J'ai appelé le mien lblSort1 et lblSortDirection1

puis Coder 2 événements simples... le tri de page, qui écrit sur le texte des étiquettes invisibles, et le changement d'index de page, qui les utilise...

Private Sub gridview_Sorting(sender As Object, e As GridViewSortEventArgs) Handles gridview.Sorting
lblSort1.Text = e.SortExpression
lblSortDirection1.Text = e.SortDirection
End Sub

Private Sub gridview_PageIndexChanging(sender As Object, e As GridViewPageEventArgs) Handles gridview.PageIndexChanging
    gridview.Sort(lblSort1.Text, CInt(lblSortDirection1.Text))
End Sub

c'est un peu moins précis que d'utiliser des variables globales, mais j'ai trouvé avec surtout que les var mondiales ne sont pas fiables...

0
répondu Jon 2013-10-22 18:52:22

façon plus simple...:

    Dim dt As DataTable = DirectCast(GridView1.DataSource, DataTable)
    Dim dv As New DataView(dt)

    If GridView1.Attributes("dir") = SortDirection.Ascending Then
        dv.Sort = e.SortExpression & " DESC" 
        GridView1.Attributes("dir") = SortDirection.Descending

    Else
        GridView1.Attributes("dir") = SortDirection.Ascending
        dv.Sort = e.SortExpression & " ASC"

    End If

    GridView1.DataSource = dv
    GridView1.DataBind()
0
répondu Ranjeet 2016-03-14 00:49:52

la réponse de Tarkus fonctionne bien. Toutefois, je suggère de remplacer VIEWSTATE par SESSION.

la VIEWSTATE de la page courante ne fonctionne que pendant que la page courante est postée de nouveau à elle-même et est partie une fois que l'utilisateur est redirigé loin à une autre page. SESSION maintient l'ordre de tri sur plus que juste le post-back de la page courante. Elle persiste pendant toute la durée de la session. Cela signifie que l'utilisateur peut naviguer sur d'autres pages, et quand il revient à la donnée page, l'ordre de tri qu'il a utilisé pour la dernière fois reste toujours. C'est généralement plus pratique.

il existe aussi d'autres méthodes, telles que les profils d'utilisateurs persistants.

je recommande cet article pour une très bonne explication de ViewState et comment il fonctionne avec le cycle de vie d'une page web: https://msdn.microsoft.com/en-us/library/ms972976.aspx

pour comprendre la différence entre VIEWSTATE, SESSION et d'autres façons de persisting variables, je recommande ceci article:https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx

0
répondu Jeff Matthews 2016-05-02 03:42:50