Сортировка GridView: SortDirection всегда по возрастанию - PullRequest
66 голосов
/ 30 октября 2008

У меня есть сетка, и мне нужно отсортировать ее элементы, когда пользователь нажимает на заголовок.
Его источником данных является объект List.

aspx определяется следующим образом:

<asp:GridView ID="grdHeader" AllowSorting="true" AllowPaging="false" 
    AutoGenerateColumns="false" Width="780" runat="server"  OnSorting="grdHeader_OnSorting" EnableViewState="true">
    <Columns>
        <asp:BoundField DataField="Entitycode" HeaderText="Entity" SortExpression="Entitycode" />
        <asp:BoundField DataField="Statusname" HeaderText="Status" SortExpression="Statusname" />
        <asp:BoundField DataField="Username" HeaderText="User" SortExpression="Username" />
    </Columns>
</asp:GridView>

Код определяется следующим образом:
Первая загрузка:

protected void btnSearch_Click(object sender, EventArgs e)
{
    List<V_ReportPeriodStatusEntity> items = GetPeriodStatusesForScreenSelection();
    this.grdHeader.DataSource = items;
    this.grdHeader.DataBind();
}

когда пользователь нажимает на заголовки:

protected void grdHeader_OnSorting(object sender, GridViewSortEventArgs e)
{
    List<V_ReportPeriodStatusEntity> items = GetPeriodStatusesForScreenSelection();
    items.Sort(new Helpers.GenericComparer<V_ReportPeriodStatusEntity>(e.SortExpression, e.SortDirection));
    grdHeader.DataSource = items;
    grdHeader.DataBind();
}

Моя проблема в том, что e.SortDirection всегда имеет значение Ascending.
У меня есть веб-страница с похожим кодом, и он работает хорошо, e.SortDirection чередуется между Ascending и Descending.

Что я сделал не так?

Ответы [ 25 ]

0 голосов
/ 10 марта 2017

Написал это, у меня работает:

 protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        if (ViewState["sortExpression"] == null || ViewState["sortExpression"].ToString() != e.SortExpression.ToString())
            MyDataTable.DefaultView.Sort = e.SortExpression + " ASC";
        else
        {
            if (ViewState["SortDirection"].ToString() == "Ascending")
                MyDataTable.DefaultView.Sort = e.SortExpression = e.SortExpression + " DESC";
            else
                MyDataTable.DefaultView.Sort = e.SortExpression + " ASC";
        }

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

        ViewState["sortExpression"] = e.SortExpression;
        ViewState["SortDirection"] = e.SortDirection;
    }
0 голосов
/ 19 января 2017

В vb.net, но очень просто!

Protected Sub grTicketHistory_Sorting(sender As Object, e As GridViewSortEventArgs) Handles grTicketHistory.Sorting

    Dim dt As DataTable = Session("historytable")
    If Session("SortDirection" & e.SortExpression) = "ASC" Then
        Session("SortDirection" & e.SortExpression) = "DESC"
    Else
        Session("SortDirection" & e.SortExpression) = "ASC"
    End If
    dt.DefaultView.Sort = e.SortExpression & " " & Session("SortDirection" & e.SortExpression)
    grTicketHistory.DataSource = dt
    grTicketHistory.DataBind()

End Sub
0 голосов
/ 06 ноября 2009

У меня была ужасная проблема с этим, поэтому я наконец-то прибегнул к использованию LINQ для упорядочивания DataTable перед назначением его представлению:

Dim lquery = From s In listToMap
             Select s
             Order By s.ACCT_Active Descending, s.ACCT_Name

В частности, я действительно нашел методы DataView.Sort и DataGrid.Sort ненадежными при сортировке логического поля.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 14 августа 2014

Возможно, это кому-нибудь поможет. Не уверен, что это потому, что сейчас 2014 или я не понимаю проблему, которую пытается решить этот пост, но это очень просто с помощью slickgrid следующим образом:

Похоже, проблема заключается в том, как «запомнить» текущую настройку сортировки, поэтому в Asp.Net есть предложения, содержащие это значение для вас. Однако slickGrid может сказать вам, каков текущий порядок сортировки:

Чтобы переключить сортировку asc desc, вы можете использовать grid.getSortColumns (), чтобы узнать, какова сортировка столбцов в настоящее время. Это то, что я сделал, но я сортирую только по 1 столбцу за раз, поэтому я могу смело делать это: 'if (grid.getSortColumns () [0] .sortAsc)'

... так что мой код работает следующим образом:

    // Make sure you have sortable: true on the relevant column names or 
    // nothing happens as I found!!
    var columns = [
    { name: "FileName", id: "FileName", field: "FileName", width: 95, selectable: true, sortable: true },
    { name: "Type", id: "DocumentType", field: "DocumentType", minWidth: 105, width: 120, maxWidth: 120, selectable: true, sortable: true },
    { name: "ScanDate", id: "ScanDate", field: "ScanDate", width: 90, selectable: true, sortable: true }, ];

.. загрузите ваши данные как обычно, затем выполните сортировку:

   // Clicking on a column header fires this event. Here we toggle the sort direction
    grid.onHeaderClick.subscribe(function(e, args) {
        var columnID = args.column.id;

        if (grid.getSortColumns()[0].sortAsc) {
            grid.setSortColumn(args.column.id, true);
        }
        else {
            grid.setSortColumn(args.column.id, false);
        }
    });

    // The actual sort function is like this 
        grid.onSort.subscribe(function (e, args) {
            sortdir = args.sortAsc ? 1 : -1;
            sortcol = args.sortCol.field;

            //alert('in sort');

            // using native sort with comparer
            // preferred method but can be very slow in IE with huge datasets
            dataView.sort(comparer, args.sortAsc);
            grid.invalidateAllRows();
            grid.render();
        });

// Default comparer is enough for what I'm doing here ..
function comparer(a, b) {
    var x = a[sortcol], y = b[sortcol];
    return (x == y ? 0 : (x > y ? 1 : -1));
}

Наконец, убедитесь, что на вашем сайте есть папка с изображениями SlickGrid, и вы получите стрелки asc / desc, появляющиеся в столбце при его выборе. Если они отсутствуют, текст будет выделен курсивом, но стрелки не появятся.

0 голосов
/ 14 декабря 2011
void dg_SortCommand(object source, DataGridSortCommandEventArgs e)
{
    DataGrid dg = (DataGrid) source;
    string sortField = dg.Attributes["sortField"];
    List < SubreportSummary > data = (List < SubreportSummary > ) dg.DataSource;
    string field = e.SortExpression.Split(' ')[0];
    string sort = "ASC";
    if (sortField != null)
    {
        sort = sortField.Split(' ')[0] == field ? (sortField.Split(' ')[1] == "DESC" ? "ASC" : "DESC") : "ASC";
    }
    dg.Attributes["sortField"] = field + " " + sort;
    data.Sort(new GenericComparer < SubreportSummary > (field, sort, null));
    dg.DataSource = data;
    dg.DataBind();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...