2014-01-08 2 views
0

데이터 소스로 objectdatasource가있는 GridView에서 정렬 할 수 있도록 자습서를 진행 중입니다. http://www.devtoolshed.com/content/gridview-objectdatasource-linq-paging-and-sortingGridView를 ObjectDataSource로 정렬 오류 메시지

그것은 꽤 곧장 앞으로 보인다, 그러나 나는이 코드를 실행하면,

public List<tbl_Batch> SelectAllList(string sSortType, int iBeginRowIndex, int iMaximumRows) 
    { 

     using (TestEntities dbContext = new TestEntities()) 
     { 

      var query = from q in dbContext.tbl_Batch 
         select q;  // sort  
      query = SelectAllSort(query, sSortType);  // filter the list if needed  
      query = SelectAllQuery(query);  // paginate  
      query = query.Skip(iBeginRowIndex).Take(iMaximumRows);  // execute the query and convert to list  
      return query.ToList(); 

     } 
    } 

는 마지막 줄 반환 query.ToList에 도달

(); 오류 메시지가 표시됩니다. 음수가 아닌 값이 있어야합니다. 매개 변수 이름 : limit 이 오류의 원인을 알 수 없으며 어디에서나이 정보를 찾을 수 없습니다.

내 GridView에 대한 코드는 누구나 내가 잘못하고있는 것을 말해 줄 수 있습니까?

<asp:GridView ID="GridView1" runat="server" DataKeyNames="intBatchID" 
     AllowPaging="True" OnDataBound="GridView1_DataBound" OnRowDataBound="GridView1_RowDataBound" 
    AllowSorting="True" AutoGenerateColumns="False" SkinID="NOCTS" EnableSortingAndPagingCallbacks="True" 
     BorderStyle="Solid" HeaderStyle-BackColor="#990033" Width="1000px" 
     DataSourceID="ObjectDataSource1" OnSorting="GridView1_Sorting"> 
    <HeaderStyle ForeColor="White"></HeaderStyle> 
    <Columns>  
     <asp:HyperLinkField DataNavigateUrlFields="intBatchID" HeaderText="Batch ID" DataNavigateUrlFormatString="TestPage1.aspx?intBatchID={0}" DataTextField="intBatchID" />  
     <asp:BoundField DataField="vcharName" HeaderText="Name" ReadOnly="True" 
      SortExpression="vcharName" /> 
     <asp:BoundField DataField="dtmScheduled" HeaderText="Date Scheduled" 
      ReadOnly="True" SortExpression="dtmScheduled" /> 
     <asp:BoundField DataField="intBatchPriorityLevel" 
      HeaderText="Priority Level" ReadOnly="True" 
      SortExpression="intBatchPriorityLevel" /> 
    </Columns> 
    <PagerSettings Mode="NumericFirstLast" Position="TopAndBottom" PageButtonCount="4" PreviousPageText="Previous" NextPageText="Next" FirstPageText="First" LastPageText="Last" /> 
    <PagerStyle HorizontalAlign="Center" />   
</asp:GridView> 
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    SelectMethod="SelectAllList" TypeName="NOCTSWebApplication.App_Code.Class3" 
    OnSelected="ObjectDataSource1_Selected" EnablePaging="True" 
    MaximumRowsParameterName="iMaximumRows" OldValuesParameterFormatString="original_{0}" 
    StartRowIndexParameterName="iBeginRowIndex" SortParameterName="sSortType"> 
    <SelectParameters> 
     <asp:Parameter Name="sSortType" Type="String" /> 
     <asp:Parameter Name="iBeginRowIndex" Type="Int32" /> 
     <asp:Parameter Name="iMaximumRows" Type="Int32" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

더 이상 내 코드가 필요하면 알려주십시오. 당신의 셋업에서 누락 적어도 일부 요소가 있습니다

private IQueryable<tbl_Batch> SelectAllQuery(IQueryable<tbl_Batch> query) 
    {  
     return query; 
    } 

    private IQueryable<tbl_Batch> SelectAllSort(IQueryable<tbl_Batch> query, string sSortType) 
     { 
      using (TestEntities dbContext = new TestEntities()) 
       { 
         bool bIsSortDescending = false;  
        if (!String.IsNullOrEmpty(sSortType))  
        { 
          string[] sValues = sSortType.Split(' ');   
           if (sValues.Length > 1)   
           {    
            if (sValues[1].ToUpper() == "DESC")    
            {     
             bIsSortDescending = true;    
            }   
           }  
        }  
        if (!String.IsNullOrEmpty(sSortType))  
        { 
          query = dbContext.tbl_Batch.OrderBy(sSortType);  
        }  
        else  
        {  // use a default sort here   
        if (bIsSortDescending)   
        {    
         query = query.OrderByDescending(q => q.intBatchID);   
        }   
        else   
        {    
        query = query.OrderBy(q => q.vcharName);   
        }  
       }  
        return query; 
     } 
    } 

    public int SelectCount() 
    { 
     using (TestEntities dbContext = new TestEntities()) 
     { 

      var query = from q in dbContext.tbl_Batch 
         select q; 
      query = SelectAllQuery(query);  // execute the query and return the count  
      return query.Count(); 
     } 
    } 
+0

'SelectAllQuery' - 무엇 이죠? 또한 페이징 한계 (iMaximumRows) 값을 확인하십시오. –

+0

@WiktorZychla iMaxiumumRows의 값은 -1입니다. SelectAllQuery를 볼 수 있도록 나머지 코드를 추가했습니다. 당신의 도움을 주셔서 감사합니다. – hollyquinn

+0

결과 집합에서 -1 행을 가져올 수 없습니다. 이것이 예외를받는 이유입니다. –

답변

0

: 여기 내 코드의 나머지 부분입니다.

먼저 ObjectDataSource에서 SelectParameters을 제거하십시오. 그런 다음 표에 PageSize을 설정해야합니다. 마지막으로 SelectCountMethod = "SelectCount"ObjectDataSource에 추가하십시오. 이 속성이 적절한 결과를 얻기 위해 필요한 것에 간결한 예를 들어, 내 학생들을 위해 년 전에 만든 예제 중 하나를 참조해야하는 경우

는 :이 두 페이지가 있습니다

http://www.ii.uni.wroc.pl/~wzychla/ra2829/example3a.zip

Default.aspx는 방법을 보여줍니다 ObjectDataSourceGridViewDetailsView을 페어링하는 반면 Default2.aspxObjectDataSourceListView을 페어링하는 방법을 보여줍니다.

+0

예제가 어떻게 작동하는지 완전히 이해하지 못합니까? 저는 시각적 모델로 작업하는 데 익숙해졌으며, 어떻게 작업을 정렬하고 있는지 이해하지 못합니까? 당신이 제안한대로 selectcountmethod를 추가하여 프로젝트에서 페이징을했습니다. 현재 작동하지 않는 유일한 작업은 정렬입니다. 오류 메시지가 나타납니다. ObjectContext 인스턴스가 삭제되었으며 연결이 필요한 작업에 더 이상 사용할 수 없습니다. SelectAllSort 메서드로 돌아갈 때. 이게 무슨 일이 일어날 지 아십니까? – hollyquinn

+0

정렬 방법이 잘못되었습니다. 기존 데이터베이스에서 작동해야하는 반면에 또 다른 DB 컨텍스트를 만듭니다. 공식적으로 :'query = bbContext.tbl_Batch.OrderBy (sSortType); 대신'query = query.OrderBy (sSortType)'가 있어야합니다. 이 기능은 동적 linq (http://dynamiclinq.codeplex.com/)가 포함 된 경우에만 작동합니다. –