为了回答@adam0101 的更多回复,我认为他的意思是“...结果我的自定义数据源返回记录计数为零。” ,是您可能需要将数据源“重新附加”到 gridview。 ASP.net 自动知道您正在检索记录-'n',其中'n' 是下一页的第一行。此解决方案更适用于您不想让 asp.net 在您的 gridview 中自动处理数据的情况,可能是因为想要在另一个事件之后加载数据(例如,加载数据按钮) ,而不是在页面第一次加载时。但正如亚当在下面提到的,真正的原因是他“......创建了一个继承 ObjectDataSource 的数据源子类,但它实现不正确。”。对不起我的假设亚当。谢谢
但是,我认为我的解决方案的其余部分适用于那些坚持使用手动派生数据源的人。
即
按照上述设置您的 GridView,并注意 - 没有 DataSource 属性!这是我的例子:
<asp:GridView ID="gvStudents" DataKeyNames="StudentID" runat="server"
ShowFooter="True" AutoGenerateColumns="False" Width="100%" AllowSorting="True" AllowPaging="true" PageSize="10" OnPageIndexChanging="gvStudents_PageIndexChanging">
接下来创建一个私有方法或例程,您可以在需要强制gridview 进入新页面时调用它们。
private void BindGridViewServer(GridView gv1)
{
gv1.DataSource = sdsStudents; //re-attach the datasource
gv1.DataBind(); //get a page of data AllowPaging must be true
}
接下来,创建OnPageIndexChanging 方法:
protected void gvStudents_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView myGV = (GridView)sender;
myGV.PageIndex = e.NewPageIndex;
BindGridViewServer(myGV);
}
为了完成这个答案,这是我的代码,我可以在需要时加载数据 - 而不是在触发 PostPack 时,这是默认设置...
protected void btnSEARCH(object sender, EventArgs e)
{
//some code
//bind the gridview to the datasource here and then bind!
gvStudents.DataSource = sdsStudents;
gvStudents.DataBind();
//more code etc
}