2013-10-21 12 views
1

안녕하세요 및 미리 감사드립니다,Gridview Sorting Linq 함께 작동하지 않습니다

linq 함께 gridview 정렬하려면 시도하고 아무것도 일어나지 않습니다. 오류가 발생하지는 않지만 뷰에서 정렬이 일어나지 않습니다. 나는 또한 디버깅을 위해 방화 광을 사용하고있다.

ASP :

<asp:GridView ID="GridViewRangeSetup" runat="server" AllowSorting="True" OnSorting="Gridview_Sort" 
         PagerStyle-Mode="NumericPages" AutoGenerateColumns="false" Width="100%" CssClass="gridView" 
         OnPageIndexChanging="GridViewRangeSetup_PageIndexChanging" AllowPaging="True" 
         PageSize="20" DataKeyNames="RangeId" OnRowCommand="GridViewRangeSetup_RowCommand" 
         OnRowEditing="GridViewRangeSetup_RowEditing" OnRowCancelingEdit="GridViewRangeSetup_CancelEditRow" 
         OnRowUpdating="GridViewRangeSetup_UpdateRow" OnRowDataBound="GridViewRangeSetup_RowDataBound"> 
         <RowStyle CssClass="rowStyle"></RowStyle> 
         <HeaderStyle CssClass="headerBar" ForeColor="#ffffff"></HeaderStyle> 
         <AlternatingRowStyle CssClass="altRow" /> 
         <Columns> 
          <asp:TemplateField HeaderText="Edit" HeaderStyle-Width="5%" HeaderStyle-ForeColor="#f2f2f2" 
           HeaderStyle-Font-Bold="false" HeaderStyle-Font-Size="Small"> 
           <ItemTemplate> 
            <asp:ImageButton ID="imgEdit" runat="server" ImageUrl="~/images/icon_edit.png" CausesValidation="false" 
             CommandArgument='<%#Eval("RangeId") %>' CommandName="Edit" /> 
           </ItemTemplate> 
           <EditItemTemplate> 
            <asp:ImageButton ID="imgUpdate" runat="server" ImageUrl="~/images/icon_update.png" 
             CausesValidation="false" CommandArgument='<%#Eval("RangeId") %>' CommandName="Update" /> 
            <asp:ImageButton ID="ImageCancel" runat="server" ImageUrl="~/images/icon_cancel.png" 
             CausesValidation="false" CommandArgument='<%#Eval("RangeId") %>' CommandName="Cancel" /> 
           </EditItemTemplate> 
           <HeaderStyle Font-Bold="False" Font-Size="Small" ForeColor="#F2F2F2" Width="5%" /> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Delete" HeaderStyle-Width="3%" HeaderStyle-ForeColor="#f2f2f2" 
           HeaderStyle-Font-Bold="false" HeaderStyle-Font-Size="Small"> 
           <ItemTemplate> 
            <asp:ImageButton ID="imgDelete" runat="server" CausesValidation="false" OnClientClick="return DeleleAlert();" 
             CommandArgument='<%#Eval("RangeId") %>' CommandName="Remove" ImageUrl="~/images/icon_delete.png" /> 
           </ItemTemplate> 
           <HeaderStyle Font-Bold="False" Font-Size="Small" ForeColor="#F2F2F2" Width="3%" /> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Description" SortExpression="Description"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtDescription" runat="server" CssClass="textbox" Text='<%# Eval("Description") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblDescription" runat="server" Text='<%# Eval("Description") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Country" SortExpression="Country.CountryName"> 
           <EditItemTemplate> 
            <asp:DropDownList ID="ddlCountry" runat="server" CssClass="dropdown" AutoPostBack="True" 
             AppendDataBoundItems="true" DataTextField="CountryName" DataValueField="CountryId"> 
            </asp:DropDownList> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblCountry" runat="server" Text='<%# Bind("CountryName") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="State/Province" SortExpression="GeographicRegion.RegionName"> 
           <EditItemTemplate> 
            <asp:DropDownList ID="ddlRegion" runat="server" CssClass="dropdown" AutoPostBack="True" 
             AppendDataBoundItems="true" DataTextField="RegionName" DataValueField="GeographicRegionId"> 
            </asp:DropDownList> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblRegion" runat="server" Text='<%# Bind("RegionName") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Base/Facility" SortExpression="Base.BaseName"> 
           <EditItemTemplate> 
            <asp:DropDownList ID="ddlFacility" runat="server" CssClass="dropdown" AutoPostBack="True" 
             AppendDataBoundItems="true" DataTextField="BaseName" DataValueField="BaseId"> 
            </asp:DropDownList> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblFacility" runat="server" Text='<%# Bind("BaseName") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Map Name" SortExpression="RangeMap.MapName"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtMapName" runat="server" CssClass="textbox" Text='<%# Eval("MapName") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblMapName" runat="server" Text='<%# Eval("MapName") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Map"> 
           <HeaderStyle HorizontalAlign="center" /> 
           <ItemTemplate> 
            <asp:HyperLink ID="HyperLink_Map1" runat="server" NavigateUrl='<%# DataBinder.Eval(Container.DataItem,"MapPath") %>' 
             Text=""> 
             <asp:Image ID="Image1" runat="server" ImageUrl='<%# DataBinder.Eval(Container.DataItem,"MapPath") %>' 
              Width="50px" Height="50px" /> 
            </asp:HyperLink> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Low Latitude" SortExpression="RangeMap.LowLat"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtLowLat" runat="server" CssClass="textbox" Text='<%# Eval("LowLat") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblLowLat" runat="server" Text='<%# Eval("LowLat") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Low Longitude" SortExpression="RangeMap.LowLong"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtLowLong" runat="server" CssClass="textbox" Text='<%# Eval("LowLong") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblLowLong" runat="server" Text='<%# Eval("LowLong") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="High Latitude" SortExpression="RangeMap.HighLat"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtHighLat" runat="server" CssClass="textbox" Text='<%# Eval("HighLat") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblHighLat" runat="server" Text='<%# Eval("HighLat") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="High Longitude" SortExpression="RangeMap.HighLong"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtHighLong" runat="server" CssClass="textbox" Text='<%# Eval("HighLong") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblHighLong" runat="server" Text='<%# Eval("HighLong") %>'></asp:Label> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Status"> 
           <ItemTemplate> 
            <asp:Button ID="RangeSetup_Status" CssClass="page-btn blue" CausesValidation="false" 
             CommandArgument='<%#Eval("RangeId") %> ' runat="server" Text="Status" OnClick="btnRangeStatus_Click"> 
            </asp:Button> 
           </ItemTemplate> 
          </asp:TemplateField> 
         </Columns> 
        </asp:GridView> 

C 번호

보호 공극 Gridview_Sort (객체 송신자 GridViewSortEventArgs E)는 문자열의 파라미터에 의해 코드 주문하도록 허용되지 않은 것처럼 {

//Label2.Text = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 
    WISSModel.WISSEntities context = new WISSModel.WISSEntities(); 


    String column = e.SortExpression; 

    IQueryable<dynamic> sortedGridview = ConvertSortDirectionToSql(e.SortDirection) == "ASC" ? 
               (from r in context.Ranges.AsEnumerable() 
               where r.isDeleted == false 
               orderby typeof(WISSModel.Range).GetProperty(column).GetValue(r, null) ascending 
               select new 
               { 
                r.RangeId, 
                r.Description, 
                r.Country.CountryName, 
                r.GeographicRegion.RegionName, 
                r.Base.BaseName, 
                r.RangeMap.MapName, 
                r.RangeMap.MapPath, 
                r.RangeMap.LowLat, 
                r.RangeMap.LowLong, 
                r.RangeMap.HighLat, 
                r.RangeMap.HighLong 
               }).AsQueryable<dynamic>() : 
                (from r in context.Ranges.AsEnumerable() 
                where r.isDeleted == false 
                orderby typeof(WISSModel.Range).GetProperty(column).GetValue(r, null) descending 
                select new 
                { 
                 r.RangeId, 
                 r.Description, 
                 r.Country.CountryName, 
                 r.GeographicRegion.RegionName, 
                 r.Base.BaseName, 
                 r.RangeMap.MapName, 
                 r.RangeMap.MapPath, 
                 r.RangeMap.LowLat, 
                 r.RangeMap.LowLong, 
                 r.RangeMap.HighLat, 
                 r.RangeMap.HighLong 
                }).AsQueryable<dynamic>(); 

    //var sortedGridview = context.Ranges.Where("it.isDeleted == false").OrderBy(column); 

    GridViewRangeSetup.DataSource = sortedGridview.ToList(); 

    //var test = sortedGridview.ToList(); 

    //System.Diagnostics.Debugger.Break(); 

    GridViewRangeSetup.DataBind(); 

} 

답변

0

찾을 다른 솔루션 :

null 값 허용하도록 DataSetLinqOperators 클래스를 사용하고 약간 수정 : 나는 '

protected void Gridview_Sort(object sender, GridViewSortEventArgs e) 
    { 


     WISSModel.WISSEntities context = new WISSModel.WISSEntities(); 

     var sortedGridview = (from r in context.Ranges 
           where r.isDeleted == false 
           select new 
           { 
            r.RangeId, 
            r.Description, 
            r.Country.CountryName, 
            r.GeographicRegion.RegionName, 
            r.Base.BaseName, 
            r.RangeMap.MapName, 
            r.RangeMap.MapPath, 
            r.RangeMap.LowLat, 
            r.RangeMap.LowLong, 
            r.RangeMap.HighLat, 
            r.RangeMap.HighLong 
           }).ToList(); 

     DataTable sortedTable = sortedGridview.CopyToDataTable(); 

     sortedTable.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 

     GridViewRangeSetup.DataSource = sortedTable; 

     GridViewRangeSetup.DataBind(); 

    } 

    private string ConvertSortDirectionToSql(SortDirection sortDirection) 
    { 
     string newSortDirection = String.Empty; 

     int sort = (int)ViewState["Sort"]; 
     switch (sort) 
     { 
      case 0: 
       newSortDirection = "ASC"; 
       ViewState["Sort"] = 1; 
       break; 

      case 1: 
       newSortDirection = "DESC"; 
       ViewState["Sort"] = 0; 
       break; 
     } 

     return newSortDirection; 
    } 
+0

@ 개발자 @ 도움 주셔서 감사합니다. – Neo84

0

이 보인다 동적 T-SQL과 같습니다. 당신은 그것이 작동되도록하려면이 하나 행해져 Yout LINQ 쿼리를 교체해야합니다 :

String column = e.SortExpression; 
IQueryable<dynamic> sortedGridview = ConvertSortDirectionToSql(e.SortDirection) == "ASC" ? 
              (from r in context.Ranges 
              where r.isDeleted == false            
              orderby typeof(Range).GetProperty(column).GetValue(r,null) ascending 
              select new 
              { 
               r.RangeId, 
               Description = r.Description, 
               CountryName = r.Country.CountryName, 
               RegionName = r.GeographicRegion.RegionName, 
               BaseName = r.Base.BaseName, 
               r.RangeMap.MapName, 
               r.RangeMap.MapPath, 
               r.RangeMap.LowLat, 
               r.RangeMap.LowLong, 
               r.RangeMap.HighLat, 
               r.RangeMap.HighLong 
              }).AsQueryable<dynamic>() : 
               (from r in context.Ranges 
               where r.isDeleted == false             
               orderby typeof(Range).GetProperty(column).GetValue(r, null) descending 
               select new 
               { 
               r.RangeId, 
               Description = r.Description, 
               CountryName = r.Country.CountryName, 
               RegionName = r.GeographicRegion.RegionName, 
               BaseName = r.Base.BaseName, 
               r.RangeMap.MapName, 
               r.RangeMap.MapPath, 
               r.RangeMap.LowLat, 
               r.RangeMap.LowLong, 
               r.RangeMap.HighLat, 
               r.RangeMap.HighLong 
               }).AsQueryable<dynamic>(); 
+0

을 이 오류가 발생하는 경우 : ** Sys.WebForms.PageRequestManagerServerErrorException : Sys.WebForms.PageRequestManagerServerErrorException : LINQ to Entities 메서드 'System.Object GetValue (System.Object, System.Object [])'메서드를 인식하지 못합니다.이 메서드는 상점 표현으로 번역 될 수 있습니다. ** – Neo84

+0

쿼리 전에 새 변수를 넣으십시오. var col = typeof (Range) .GetProperty (column) .GetValue (r, null) 쿼리에서 col을 사용하십시오. – IDeveloper

+0

이제는이 오류를 해결하는 방법을 모르겠습니다. ** Sys.WebForms.PageRequestManagerServerErrorException : Sys.WebForms.PageRequestManagerServerErrorException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. ** – Neo84