Comment permettre le tri d'un gridview?

j'ai un GridView et j'ai activé le tri. Lors de l'exécution de l'application, je clique sur la première colonne à trier. Et j'obtiens cette erreur: "le GridView' gvOutlookMeldingen ' a déclenché un tri d'événements qui n'a pas été traité."

voici le gridview:

<asp:GridView ID="gvOutlookMeldingen" runat="server" AllowSorting="True" AutoGenerateColumns="False" AutoGenerateSelectButton="True" onselectedindexchanged="GridView_SelectedIndexChanged">
    <Columns>
        <asp:TemplateField HeaderText="Melder" ItemStyle-HorizontalAlign="Center" SortExpression="Melder">
            <HeaderStyle BorderColor="#1A3491" Width="130px"></HeaderStyle>
            <ItemStyle Height="20px" HorizontalAlign="Center"></ItemStyle>
            <ItemTemplate>
                <%# (string)Eval("Melder") %>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Onderwerp" HeaderText="Onderwerp" />
        <asp:TemplateField HeaderText="Omschrijving">
            <ItemTemplate>
                <div style="overflow:auto; width: 500px; height: 200px;">
                    <asp:Label ID="lblOmschrijving" runat="server" Text='<%# Bind("Omschrijving")%>'></asp:Label>
                </div>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Meldingsdatum" HeaderText="Meldingsdatum" />
        <asp:BoundField DataField="OutlookID" HeaderText="OutlookID" />
    </Columns>
</asp:GridView>

Toute aide est appréciée

20
demandé sur SamekaTV 2011-03-18 15:58:24

4 réponses

il Vous manque SortExpressiondans votre BoundField's comme mentionné dans les autres réponses.

vous utilisez aussi un TemplateField qui, en fonction de ce qui génère vos données, peut nécessiter un tri manuel au-delà de l'utilisation de SortExpression.

si c'est le cas, alors pour trier manuellement, une méthode est d'ajouter un OnSorting callback GridView,SortExpression's à vos champs et une méthode pour rappeler dans votre code-behind.

il en résulterait un balisage et un code (non testé):

<asp:GridView ID="gvOutlookMeldingen" runat="server" 
    AllowSorting="True" 
    OnSorting="gvOutlookMeldingen_Sorting"
    AutoGenerateColumns="False" 
    AutoGenerateSelectButton="True" 
    onselectedindexchanged="GridView_SelectedIndexChanged">
    <Columns>
        <asp:BoundField DataField="Melder" HeaderText="Melder" SortExpression="Melder" />
        <asp:BoundField DataField="Onderwerp" HeaderText="Onderwerp" SortExpression="Onderwerp" />
            <asp:TemplateField HeaderText="Omschrijving" SortExpression="Omschrijving">
                <ItemTemplate>
                    <div style="overflow:auto; width: 500px; height: 200px;">
                        <asp:Label ID="lblOmschrijving" runat="server" Text='<%# Bind("Omschrijving")%>'></asp:Label>
                    </div>
                </ItemTemplate>
            </asp:TemplateField>
        <asp:BoundField DataField="Meldingsdatum" HeaderText="Meldingsdatum" SortExpression="Meldingsdatum" />
        <asp:BoundField DataField="OutlookID" HeaderText="OutlookID" SortExpression="OutlookID" />
    </Columns>
</asp:GridView>

...et:

protected void gvOutlookMeldingen_Sorting(object sender, GridViewSortEventArgs e)
{
    switch (e.SortExpression)
    {
        case "Melder":
        if (e.SortDirection == SortDirection.Ascending)
        {
            gvOutlookMeldingen.DataSource = // Asc query for Melder field;
            gvOutlookMeldingen.DataBind();
        }
        else
        {
            gvOutlookMeldingen.DataSource = // Desc query for Melder field ;
            gvOutlookMeldingen.DataBind();
        }
        break;
        // case statements for your other fields.
    }
}
23
répondu Kynth 2014-03-06 13:31:02

Ce code peut aider (pour vous les gars googler ce vieux post):

protected void gvOutlookMeldingen_Sorting(object sender, GridViewSortEventArgs e)
{
    DataTable dt = (DataTable)Session["mySessionStoredTable"];
    dt.DefaultView.Sort = e.SortExpression // column name
        + " " + SortDir(e.SortExpression); // sort direction
    gv.DataSource = dt;
    gv.DataBind();
}

private string SortDir(string sColumn)
{
    string sDir = "asc"; // ascending by default
    string sPreviousColumnSorted = ViewState["SortColumn"] != null 
        ? ViewState["SortColumn"].ToString() 
        : "";

    if (sPreviousColumnSorted == sColumn) // same column clicked? revert sort direction
        sDir = ViewState["SortDir"].ToString() == "asc" 
            ? "desc"
            : "asc";
    else
        ViewState["SortColumn"] = sColumn; // store current column clicked

    ViewState["SortDir"] = sDir; // store current direction

    return sDir;
}
8
répondu Turbo 2016-10-25 08:33:59

Vous devez définir l' SortExpression l'attribut des colonnes que vous souhaitez trier. Et vous devez ajouter un gestionnaire d'événements au Sorting événement pour faire fonctionner le tri sur votre source de données.

Pour plus d'informations, voir cet article MSDN, ou cet exemple avec tri et paging.

5
répondu Prutswonder 2011-03-18 13:13:25

je suppose que la source de données de votre vue de grille est une DataTable donc je pense que vous devez ajouter

SortExpression="column name"

dans chaque asp: Boundfield que vous aimez pouvoir trier,

par exemple

<asp:BoundField DataField="Melder" SortExpression="Melder" HeaderText="Melder" />
3
répondu bAN 2011-03-18 13:08:07