Иерархическая (с несколькими столбцами) сортировка для .net GridView? - PullRequest
1 голос
/ 15 сентября 2009

Есть ли простой ".Net" способ сделать иерархическую сортировку

Таблица ...

A|B|C
-----
1|2|5
2|8|4
2|4|3
3|7|2
4|4|1

кликнув на A, вы получите B ..

A|B|C
-----
1|2|5
2|4|3
2|8|4
3|7|2
4|4|1

Изменение заключается в том, что я сортирую (B) в контексте (A) и т. Д.

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

Ответы [ 3 ]

2 голосов
/ 16 сентября 2009

Если вы спрашиваете о том, чтобы сделать это в сочетании с подкачкой, не существует простого и масштабируемого решения. На самом деле, это своего рода святой Грааль веб-разработки бизнес-приложений. См., Например, вопрос StackOverflow Динамическая сортировка в хранимых процедурах SQL , касающийся того же. В конце концов, если бы у нас была динамическая сортировка на наших серверах баз данных, нам пришлось бы только кодировать механизм управления выбором сортировки пользователя.

У вас есть только три варианта сортировки по нескольким столбцам:

  • Сделайте это в клиенте, позволяя контейнеру данных выполнять тяжелую работу (когда вы используете контейнер данных, в который встроена эта функциональность, например System.Data.DataView).

  • Напишите свой собственный алгоритм и самостоятельно сортируйте данные перед привязкой.

  • Сделайте это на сервере базы данных с помощью одного из решений, описанных в ссылке выше.

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

2 голосов
/ 26 апреля 2012

Чтобы заставить ASP.NET GridView правильно сортировать, когда несколько столбцов перечислены в спецификации сортировки BoundField, вам необходимо привязать событие OnSorting сетки к этой функции:

protected void gridViewSorting(object sender, GridViewSortEventArgs e)
{
    //
    // This odd function permits GridView objects to sort on multiple columns
    // Without this function, a GridView object does not sort correctly when multiple
    // columns are named in its sort specification.
    //

    if (!(sender is GridView))
    {
        return;
    }
    if (!e.SortExpression.Contains(','))
    {
        return;
    }

    GridView gv = sender as GridView;

    //
    // Find the column that is to become the basis of the sort
    //
    foreach (DataControlField dc in gv.Columns)
    {
        String fieldSortExprClean = dc.SortExpression.Replace(" DESC", "");
        fieldSortExprClean = fieldSortExprClean.Replace(" ASC", "");

        String eventSortExprClean = e.SortExpression.Replace(" DESC", "");
        eventSortExprClean = eventSortExprClean.Replace(" ASC", "");

        if (fieldSortExprClean == eventSortExprClean)
        {
            if (e.SortDirection == SortDirection.Ascending)
            {
                dc.SortExpression = fieldSortExprClean.Replace(",", " ASC,");
                e.SortExpression = fieldSortExprClean.Replace(",", " ASC,");
            }
            else
            {
                dc.SortExpression = fieldSortExprClean.Replace(",", " DESC,");
                e.SortExpression = fieldSortExprClean.Replace(",", " DESC,");
            }
        }
    }
}
0 голосов
/ 16 сентября 2009

ASPX страница

<asp:GridView id="MyGridView" runat="server" AllowSorting="true" OnSorting="MyGridView_OnSorting">
    <asp:BoundField DataField="ColumnA" SortExpression="A" />
    <asp:BoundField DataField="ColumnB" SortExpression="B" />
    <asp:BoundField DataField="ColumnC" SortExpression="C" />
</asp:GridView>

Код позади

protected void MyGridView_OnSorting(object sender, GridViewSortEventArgs e)
{
    List<MyEntity> data = MyBLL.GetDataSource();

    data.Sort(delegate(MyEntity x, MyEntity y) {
        switch(e.SortExpression)
        {
            case "ColumnA":
               return String.Compare(x.ColumnA, y.ColumnA);
               break;
            case "ColumnB":
               return String.Compare(x.ColumnB, y.ColumnB);
               break;
            case "ColumnC":
               return String.Compare(x.ColumnC, y.ColumnC);
               break;
        }
    }
    );

    MyGridView.DataSource = data;
    MyGridView.DataBind();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...