Сортировка GridView работает только один раз

У меня есть сетка, и она сортируется только один раз в порядке возрастания. Тогда ничего не происходит.

Код файла aspx:

<asp:GridView ID="gdvSignatureLines" runat="server" CssClass="Grid1" AutoGenerateColumns="False"
                        SkinID="PagedGridView" AllowPaging="True" AllowSorting="True" DataKeyNames="Id" 
                        onrowcommand="gdvSignatureLines_RowCommand" 
                        onrowdeleting="gdvSignatureLines_RowDeleting" 
                        onrowediting="gdvSignatureLines_RowEditing" 
                        onsorting="gdvSignatureLines_Sorting" 
                        onpageindexchanging="gdvSignatureLines_PageIndexChanging">
                        <PagerStyle CssClass="gridPager" HorizontalAlign="Right" />
                        <Columns>
                            <ucc:commandfieldcontrol headertext="Actions" showdeletebutton="true" buttontype="Image"
                                deleteimageurl="~/App_Themes/Default/images/delete.png" showeditbutton="true"
                                editimageurl="~/App_Themes/Default/images/edit.png" deleteconfirmationtext="Are you sure you want to delete?">
                                    <ItemStyle HorizontalAlign="Center" Width="60px" />
                             </ucc:commandfieldcontrol>
                            <asp:BoundField DataField="SortOrder" HeaderText="Line" SortExpression="SortOrder" />
                            <asp:TemplateField HeaderText="Type" SortExpression="glTypeId">
                                <ItemTemplate>
                                    <asp:Label ID="lblglTypeId" runat="server" Text='<%# Eval("GeneralLookup.LookupItem") %>'></asp:Label>
                                </ItemTemplate>  
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Label" SortExpression="glLabelId">
                                <ItemTemplate>
                                    <asp:Label ID="lblglLabelId" runat="server" Text='<%# Eval("GeneralLookup1.LookupItem") %>'></asp:Label>
                                </ItemTemplate>  
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Caption" SortExpression="glCaptionId">
                                <ItemTemplate>
                                    <asp:Label ID="lblglCaptionId" runat="server" Text='<%# Eval("GeneralLookup2.LookupItem") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                        <EmptyDataTemplate>
                            <div class="divEmptyListingGrid">
                                --- No Signature Line Exists ---
                            </div>
                        </EmptyDataTemplate>
                    </asp:GridView>

Код файла cs:

protected void gdvSignatureLines_Sorting(object sender, GridViewSortEventArgs e)
    {
        lblHeading.Text = "Signature Line for " + reportName;
        ReportOptionsBO reportOptionsBO = new ReportOptionsBO();
        List<ReportSignatureLine> listSignature = reportOptionsBO.GetReportSignatureLineByReportId(reportId);
        if (listSignature != null)
        {
            var param = Expression.Parameter(typeof(ReportSignatureLine), e.SortExpression);
            var sortExpression = Expression.Lambda<Func<ReportSignatureLine, object>>
                (Expression.Convert(Expression.Property(param, e.SortExpression), typeof(object)), param);

            if (e.SortDirection == SortDirection.Ascending)
            {
                gdvSignatureLines.DataSource = listSignature.AsQueryable<ReportSignatureLine>().OrderBy(sortExpression).ToList();
            }
            else
            {
                gdvSignatureLines.DataSource = listSignature.AsQueryable<ReportSignatureLine>().OrderByDescending(sortExpression).ToList();
            }
            gdvSignatureLines.DataBind();
        }
    }

person asma    schedule 22.03.2011    source источник
comment
Почему вы не хотите обрабатывать событие sort?   -  person NakedBrunch    schedule 21.03.2011
comment
потому что я не знаю, как обрабатывать эти события, поскольку я использую список, а не таблицу данных. Пожалуйста, смотрите код. this.gdvSignatureLines.DataSource = reportOptionsBO.GetReportSignatureLineByReportId(reportId); this.gdvSignatureLines.DataBind();   -  person asma    schedule 21.03.2011
comment
На самом деле не имеет значения для gridview и сортировки, какой тип структуры данных вы используете для привязки gridview. Код сортировки будет работать со списком. Я обновлю свой ответ точным кодом, который вы можете использовать в своем проекте.   -  person NakedBrunch    schedule 21.03.2011
comment
Я не понимаю, почему ссылка на этот блог актуальна   -  person Steven Ryssaert    schedule 22.03.2011
comment
Если у вас есть решение моей проблемы, пожалуйста, дайте мне знать!   -  person asma    schedule 22.03.2011
comment
Этот вопрос является дубликатом для stackoverflow.com/questions/5377777 / Если вы продолжите там, я уверен, что люди вам помогут.   -  person Steven Ryssaert    schedule 22.03.2011
comment
да, это опубликовано мной, но никто не отвечает там, потому что я думаю, что они не могут легко видеть комментарии, и они читают только проблему. Не комментарии. Я почти решил задачу. Осталось только одно, о чем я упомянул здесь в новом посте.   -  person asma    schedule 22.03.2011
comment
@asma: Добро пожаловать в StackOverflow, ознакомьтесь с часто задаваемыми вопросами. Я также предлагаю вам прочитать эту запись в блоге, чтобы узнать, как лучше задавать вопросы. Задавать один и тот же вопрос здесь недопустимо. Если вы хотите привлечь больше внимания к своему вопросу, вы можете назначить вознаграждение за него через два дня. Вы также можете отредактировать свой вопрос, чтобы добавить дополнительную информацию, которая может облегчить понимание вашего вопроса и ответ на него.   -  person    schedule 22.03.2011


Ответы (3)


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

Сначала добавьте событие Sorting в разметку GridView.

<asp:GridView ID="gdvSignatureLines" runat="server" CssClass="Grid1" AutoGenerateColumns="False" SkinID="PagedGridView" AllowPaging="True" AllowSorting="True" DataKeyNames="Id" 
   onrowcommand="gdvSignatureLines_RowCommand" 
   onrowdeleting="gdvSignatureLines_RowDeleting" 
   onrowediting="gdvSignatureLines_RowEditing"
   OnSorting="gdvSignatureLines_Sorting"
>

В коде программной части привяжите событие сортировки. Следующий код использует LINQ для сортировки данных и повторной привязки GridView.

using System.Linq.Expressions;

int reportID = 123456;

protected void gdvSignatureLines_Sorting(object sender, GridViewSortEventArgs e)
{
   ReportOptionsBO reportOptionsBO = new ReportOptionsBO();
   List<T> ReportOptionsBOList =  reportOptionsBO.GetReportSignatureLineByReportId(reportId);

   if (ReportOptionsBOList != null)
   {
      var param = Expression.Parameter(typeof(T), e.SortExpression);
      var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(param, e.SortExpression), typeof(object)), param);

      if (ViewState["SortDirection"] == "DESC")
      {
         ViewState["SortDirection"] = "ASC";
         gdvSignatureLines.DataSource = ReportOptionsBOList.AsQueryable<T>().OrderBy(sortExpression);
      }
      else
      {
         ViewState["SortDirection"] = "DESC";
         gdvSignatureLines.DataSource = ReportOptionsBOList.AsQueryable<T>().OrderByDescending(sortExpression);
      }

      gdvSignatureLines.DataBind();
   }
}
person NakedBrunch    schedule 21.03.2011
comment
Спасибо, Элисон, я скоро воспользуюсь этим кодом и дам вам знать. Еще раз спасибо ! - person asma; 22.03.2011
comment
Возникает исключение: источник данных не поддерживает подкачку данных на стороне сервера. - person asma; 22.03.2011
comment
Эй, Элисон, единственная оставшаяся проблема в том, что сортировка выполняется только в первый раз. Не в следующий раз. Можете ли вы помочь еще раз, пожалуйста? - person asma; 22.03.2011
comment
Если вы добавите точки останова в свой код, сможете ли вы их поразить? - person NakedBrunch; 22.03.2011
comment
Да, проблема, которую я обнаружил, заключается в том, что выражение сортировки всегда содержит возрастание. Так что кажется, что это первый раз, а не в следующий раз. На самом деле он всегда сортируется в порядке возрастания. - person asma; 22.03.2011
comment
Поскольку источник данных задается в коде позади, выражение сортировки не обновляется декларативно. Нам нужно учитывать изменение направления сортировки, сохраняя направление сортировки в ViewState. Я обновил свой ответ, и это должно привести вас туда. Не стесняйтесь голосовать за мой ответ, если считаете, что он вам поможет. - person NakedBrunch; 22.03.2011
comment
Вы так полезны Элисон !! Большое спасибо. Это определенно помогло бы мне. Большое спасибо... :) - person asma; 22.03.2011
comment
Фантастический. Я знаю это чувство. Добро пожаловать в StackOverflow. Это отличный ресурс. Я также добавил ответ на ваш другой/похожий вопрос о сортировке сетки. - person NakedBrunch; 22.03.2011

так как это без источника данных, это может помочь:

http://forums.asp.net/p/956540/1177923.aspx

person Robert    schedule 21.03.2011
comment
Я не могу использовать это, так как он использует Datatable, а я нет. - person asma; 21.03.2011
comment
принцип тот же, вы привязываетесь к коду, поэтому вы должны обрабатывать событие сортировки - person Robert; 21.03.2011

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

Вот как это сделать:

using System.Linq.Expressions;

int reportID = 123456;

protected void gdvSignatureLines_Sorting(object sender, GridViewSortEventArgs e)
{
   ReportOptionsBO reportOptionsBO = new ReportOptionsBO();
   List<T> ReportOptionsBOList =  reportOptionsBO.GetReportSignatureLineByReportId(reportId);

   if (ReportOptionsBOList != null)
   {
      var param = Expression.Parameter(typeof(T), e.SortExpression);
      var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(param, e.SortExpression), typeof(object)), param);

      if (ViewState["SortDirection"] == "DESC")
      {
         ViewState["SortDirection"] = "ASC";
         gdvSignatureLines.DataSource = ReportOptionsBOList.AsQueryable<T>().OrderBy(sortExpression);
      }
      else
      {
         ViewState["SortDirection"] = "DESC";
         gdvSignatureLines.DataSource = ReportOptionsBOList.AsQueryable<T>().OrderByDescending(sortExpression);
      }

      gdvSignatureLines.DataBind();
   }
}
person NakedBrunch    schedule 22.03.2011