Создание сортировки GridView при ручном присвоении источника данных

1

У меня есть gridview, что я хотел бы сортировать. Когда я определяю его так:

<asp:GridView ID="GridView1" runat="server" CssClass="gridview" DataSourceID="GridDataSource" AutoGenerateColumns="False" AllowSorting="True" >

Сортировка работает отлично. то есть. когда я нажимаю на заголовок столбца, сетка сортируется по этому столбцу.

Но когда я определяю это так:

<asp:GridView ID="GridView1" runat="server" CssClass="gridview"  AutoGenerateColumns="False" AllowSorting="True" >

и в коде:

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

Используя последний метод, сортировка не работает. Заголовки столбцов - это ссылки, но сетка не упорядочивает себя.

Я устанавливаю DataSource после загрузки страницы, чтобы пользователь мог выбирать из некоторых фильтров (выпадающих списков), чтобы ограничить возвращаемые записи.

Может ли кто-нибудь сказать мне, как установить источник данных в codebehind и получить функцию сортировки? Альтернативно, хороший способ остановить сетку от привязки данных при начальной загрузке страницы.

  • 2
    Вы можете найти свой ответ в этом посте
Теги:
gridview

1 ответ

1
Лучший ответ

Чтобы получить автоматическую сортировку по , вам понадобится несколько вещей.

Во-первых, вам нужно будет установить AllowSorting="True" в теге gridview, который вы сделали.

Во-вторых, вам нужно правильно настроить свои Fields. Поскольку у вас есть AutoGenerateColumns=false вам нужно вручную указать SortExpression:

<asp:BoundFiled DataFiled="Name" HeaderText="Name" SortExpression="Name" />

В-третьих, вам нужно убедиться, что ваш источник данных поддерживает сортировку. Если данные привязаны непосредственно к DataSet, вы должны получить поддержку из коробки. Однако, если вы привязываетесь к или , вам необходимо убедиться, что ваш SelectMethod поддерживает сортировку.

Например, для вам необходимо установить SortParameterName, а затем убедиться, что тот же параметр присутствует в коллекции SelectParameters:

 <asp:ObjectDataSource ID="GridDataSource" runat="server"
    SelectMethod="ExampleSelect"
    TypeName="SO"        
    SortParameterName="sortExpression">       
    <SelectParameters>
        <asp:Parameter Name="sortExpression" Type="String" />
    </SelectParameters>
 </asp:ObjectDataSource>

Тогда SelectMethod будет отвечать за реализацию сортировки:

 namesapce SO{
     public class ExampleSelect{
         public object[] ExampleSelect(string sortExpression)
         {
            var allItems = GetAllItems();

            bool sortDesc = 
                 //if sort descending, sortExpression will be suffixed with " DESC"
                 (sortExpression.Split(' ').Count() > 1);

            if (sortExpression.StartsWith("Name"))
            {
                if (sortDesc)
                    return allItems.OrderByDescending(x => x.Name);
                else
                    return allItems.OrderBy(x => x.Name);
            }
            else
            {
               return allItems;
            }
         }
     }
 }

Советы

  • Для более сексуального способа создания динамических выражений выражения linq см. Этот ответ SO: qaru.site/questions/13139/...
  • Скотт Митчелл имеет фантастический учебник, полностью изучающий привязку данных с сортировкой и разбиением на страницы, доступными в MSDN: http://msdn.microsoft.com/en-us/library/bb404876.aspx

Связывание данных в code_behind

Я рекомендую привязку данных декларативно в разметке с использованием одного из элементов управления источниками данных. Он избавляется от разного кода в коде позади и позволяет фреймворку иметь дело с тем, когда привязывается к databind, поэтому вам не нужно if (!IsPostBack) утверждения if (!IsPostBack).

  • 0
    Я пробовал это, но функция источника данных не вызывается, когда я щелкаю, чтобы упорядочить сетку - так что «sortExpression» ничего не делает. Я уверен, что вы правы во всем, что вы сказали, но я определенно что-то упускаю.
  • 0
    Можете ли вы обновить вопрос с помощью метода select и объявления источника данных вашего объекта
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню