Почему сортировка GridView по нескольким столбцам применяет порядок только к последнему члену? - PullRequest
1 голос
/ 30 марта 2010

Я провел большую часть своего дня, борясь с GridView.Sort ().

Ничто из того, что я сделал, не могло заставить меня вести себя так, как я ожидал. Только когда коллега сказал мне, что в выражении вы можете указать порядок сортировки для каждого термина (кроме последнего, очевидно).

Какова цель предоставления направления сортировки, если оно применяется только к последнему члену в выражении, содержащем несколько терминов? Например:

GridView.Sort("Foo,Bar", SortDirection.Descending);

Термин «Foo» в этом выражении всегда будет сортироваться в порядке возрастания, в то время как термин «Bar» имеет порядок сортировки, определяемый параметром SortDirection функции Sort (). Тем не менее:

GridView.Sort("Foo DESC,Bar" SortDirection.Ascending);

Термин «Foo» теперь будет сортироваться по убыванию, а «Bar» - по возрастанию. Я наткнулся на это поведение после подсказки от моего коллеги, когда я попробовал это:

GridView.Sort("Foo DESC, Bar DESC", SortDirection.Descending);

Было сгенерировано исключение с жалобой на невозможность найти столбец "Bar DESC"; это привело меня к мысли, что такие выражения на самом деле недопустимы. Однако мне было любопытно, почему не было выдано исключение для «Foo DESC» (поскольку оно было указано первым), поэтому я попробовал следующее:

GridView.Sort("Foo DESC, Bar", SortDirection.Descending);

И наконец увидел желаемое поведение.

Похоже, что мне придется строить строку выражения вручную, поскольку порядок сортировки, который мне нужен, будет зависеть от пользовательского ввода для термина "Foo", но останется неизменным для термина "Bar". Во всех поисках я не нашел ссылки на это поведение. Теперь, когда я понимаю, как это работает, имеет смысл, что первый член всегда возрастает, если не указано иное. Но почему бы не покончить со вторым параметром в Sort () и просто оставить порядок (asc / desc) в выражении?

Ответы [ 2 ]

1 голос
/ 30 марта 2010

В основном, если направление сортировки убывающее, оно добавляет DESC к концу, так как возрастание никогда не сделает этого, вы можете просто построить выражение сортировки, установить его в порядке возрастания, и оно будет эффективно использовать только ваш первый аргумент,как это:

GridView.Sort("Foo DESC, Bar DESC", SortDirection.Ascending);

Я думаю, большинство случаев сортировки GridView находятся в одном столбце (и переключаются asc / desc), это единственная причина, о которой я могу думатьпочему команда .Net оставила сортировку таким образом.

Я согласен, что .Sort(string sortExpression) также должен быть там.

0 голосов
/ 16 июля 2013

В зависимости от вашего источника, вы можете добавить вычисляемый столбец полей для сортировки вместе взятых. Например: добавьте вычисляемый столбец SortOrder, который равен Foo + Bar (при условии, что строки символов). Затем выполните сортировку для нужного столбца.

GridView.Sort("SortOrder", SortDirection.Ascending);

Это решение подходит для тех, кто не хочет добавлять обработчик событий GridView.Sorting для столбца или столбцов, содержащих несколько полей.

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

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        if (e.SortExpression == "Foo ASC, Bar ASC")
            e.SortExpression = "Foo DESC, Bar DESC";
        else if (e.SortExpression == "Foo DESC, Bar DESC")
            e.SortExpression = "Foo ASC, Bar ASC";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...