2014-01-08 29 views
0

我正在学习一个教程,以在GridView中启用排序,该GridView具有objectdatasource作为数据源。 http://www.devtoolshed.com/content/gridview-objectdatasource-linq-paging-and-sorting使用ObjectDataSource对GridView进行排序错误消息

看来非常简单的,但是当我运行的代码,

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.aspx显示如何将ObjectDataSourceListView配对。

+0

我不完全了解您的示例如何工作?我习惯于使用视觉模型,我不明白你是如何在你的工作中进行分类的。按照您的建议,通过添加selectcount方法,我可以在我的项目中进行分页工作。现在唯一不行的就是排序。我收到错误消息:他的ObjectContext实例已被处置,不能再用于需要连接的操作。当它返回到SelectAllSort方法。你知道可能会导致这种情况吗? – hollyquinn

+0

你的排序方法是错误的,它会创建另一个数据库上下文,而它应该在现有的上运行。形式上:而不是'query = bbContext.tbl_Batch.OrderBy(sSortType);'你应该有'query = query.OrderBy(sSortType)'。这只适用于包含动态linq(http://dynamiclinq.codeplex.com/) –

相关问题