Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GridView排序只工作一次_C#_Asp.net_Sorting_Gridview_Gridview Sorting - Fatal编程技术网

C# GridView排序只工作一次

C# GridView排序只工作一次,c#,asp.net,sorting,gridview,gridview-sorting,C#,Asp.net,Sorting,Gridview,Gridview Sorting,我有一个网格,它只按升序排序一次。然后什么也没发生 aspx文件的代码: <asp:GridView ID="gdvSignatureLines" runat="server" CssClass="Grid1" AutoGenerateColumns="False" SkinID="PagedGridView" AllowPaging="True" AllowSorting="True" DataKeyNames="Id"

我有一个网格,它只按升序排序一次。然后什么也没发生

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();
        }
    }
受保护的无效gdvSignatureLines\u排序(对象发送器,GridViewSortEventArgs e)
{
lblHeading.Text=“签名行代表”+报告名;
ReportOptionsBO ReportOptionsBO=新的ReportOptionsBO();
List listSignature=reportOptionsBO.GetReportSignatureLineByReportId(reportId);
if(listSignature!=null)
{
var param=Expression.Parameter(typeof(ReportSignatureLine),e.SortExpression);
var sortExpression=Expression.Lambda
(Expression.Convert(Expression.Property(param,e.SortExpression),typeof(object)),param);
if(e.SortDirection==SortDirection.Ascending)
{
gdvSignatureLines.DataSource=listSignature.AsQueryable().OrderBy(sortExpression.ToList();
}
其他的
{
gdvSignatureLines.DataSource=listSignature.AsQueryable().OrderByDescending(sortExpression.ToList();
}
gdvSignatureLines.DataBind();
}
}

由于它没有数据源,这可能有助于:


由于您要在代码隐藏中设置数据源,因此您必须编写一些代码才能进行排序

首先,将排序事件添加到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();
   }
}
使用System.Linq.Expressions;
int reportID=123456;
受保护的无效gdvSignatureLines\u排序(对象发送器、GridViewSortEventArgs e)
{
ReportOptionsBO ReportOptionsBO=新的ReportOptionsBO();
List ReportOptionsBOList=reportOptionsBO.GetReportSignatureLineByReportId(报告ID);
如果(ReportOptionsBOList!=null)
{
var param=表达式参数(typeof(T),e.SortExpression);
var-sortExpression=Expression.Lambda(Expression.Convert(Expression.Property(param,e.sortExpression),typeof(object)),param);
如果(视图状态[“排序方向”]=“描述”)
{
视图状态[“排序方向”]=“ASC”;
gdvSignatureLines.DataSource=ReportOptionsBOList.AsQueryable().OrderBy(sortExpression);
}
其他的
{
视图状态[“排序方向”]=“描述”;
gdvSignatureLines.DataSource=ReportOptionsBOList.AsQueryable().OrderByDescending(sortExpression);
}
gdvSignatureLines.DataBind();
}
}

由于要在代码隐藏中绑定数据源,因此排序表达式不会以声明方式更新。您需要在代码隐藏中处理不断变化的排序表达式

以下是您如何做到这一点:

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();
   }
}
使用System.Linq.Expressions;
int reportID=123456;
受保护的无效gdvSignatureLines\u排序(对象发送器、GridViewSortEventArgs e)
{
ReportOptionsBO ReportOptionsBO=新的ReportOptionsBO();
List ReportOptionsBOList=reportOptionsBO.GetReportSignatureLineByReportId(报告ID);
如果(ReportOptionsBOList!=null)
{
var param=表达式参数(typeof(T),e.SortExpression);
var-sortExpression=Expression.Lambda(Expression.Convert(Expression.Property(param,e.sortExpression),typeof(object)),param);
如果(视图状态[“排序方向”]=“描述”)
{
视图状态[“排序方向”]=“ASC”;
gdvSignatureLines.DataSource=ReportOptionsBOList.AsQueryable().OrderBy(sortExpression);
}
其他的
{
视图状态[“排序方向”]=“描述”;
gdvSignatureLines.DataSource=ReportOptionsBOList.AsQueryable().OrderByDescending(sortExpression);
}
gdvSignatureLines.DataBind();
}
}

为什么不想处理事件排序?因为我不知道如何处理这些事件,因为我使用的是列表,而不是数据表。请看代码。this.gdvSignatureLines.DataSource=reportOptionsBO.GetReportSignatureLineByReportId(reportId);这是.gdvSignatureLines.DataBind();对于gridview和排序您用于绑定gridview的数据结构类型来说,这并不重要。排序代码将与列表一起使用。我会用你可以在项目中使用的确切代码更新我的答案。我不明白为什么该博客的链接是相关的。如果你有我的问题的解决方案,请一定让我知道!我不能使用这个,因为他使用的是Datatable,而我不是。原理是一样的,你在后面绑定代码,所以你应该处理排序事件。谢谢Alison,我很快会使用这个代码,然后我会让你知道。再次感谢!出现了一个异常:数据源不支持服务器端数据分页。嘿,Alison,现在唯一的问题是,排序只是第一次执行。下次不会了。您能再次提供帮助吗?如果您在代码中添加断点,您能点击它们吗?是的,我发现的问题是,sortexpression总是包含升序。因此,似乎第一次是排序,而不是下一次。事实上,它总是按升序排序。