Как разрешить сортировку вида сетки? - PullRequest
20 голосов
/ 18 марта 2011

У меня есть сетка и включена сортировка.При запуске приложения я нажимаю на первый столбец для сортировки.И я получаю эту ошибку: «Сортировка события« GvOutlookMeldingen »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>

Любая помощь приветствуется

Ответы [ 4 ]

23 голосов
/ 18 марта 2011

Вам не хватает SortExpression в ваших BoundField, как указано в других ответах.

Вы также используете TemplateField, который, в зависимости от того, что генерирует ваши данные, можеттребуется ручная сортировка за пределами использования SortExpression.

Если это так, то для сортировки вручную одним из методов является добавление обратного вызова OnSorting к GridView, SortExpression.поля и метод обратного вызова в вашем коде.

Это приведет к разметке и коду, подобному (непроверенному):

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

... и:

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.
    }
}
9 голосов
/ 03 февраля 2014

Этот код может помочь (ребята, гуглите этот старый пост):

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;
}
5 голосов
/ 18 марта 2011

Вам необходимо установить атрибут SortExpression столбцов, по которым вы хотите отсортировать. И вам нужно добавить обработчик событий к событию Sorting, чтобы сортировка работала на вашем источнике данных.

Дополнительные сведения см. В этой статье MSDN или в этом примере с сортировкой и подкачкой .

3 голосов
/ 18 марта 2011

Я предполагаю, что источником данных вашего вида сетки является DataTable, поэтому я думаю, что вы должны добавить

SortExpression="column name"

в каждом asp: Boundfield, который вы хотели бы иметь возможность сортировать,

например

<asp:BoundField DataField="Melder" SortExpression="Melder" HeaderText="Melder" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...