看看下面的例子......有一个网页ListView
和DataPager
用于寻呼的数据ListView
:
后面的代码:
protected void Page_Load(object sender, EventArgs e)
{
MyList.DataSource = GetSomeList();
MyList.DataBind();
}
资源:
<asp:ListView ID="MyList" runat="server">
<% //LayoutTemplate and ItemTemplate removed for the example %>
</asp:ListView>
<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10">
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
与这个问题DataPager
是,它始终是一个一步身后的结合。
例如,当页面加载它是在页码1。然后当你点击第3页,它回发后保持第1页。 然后单击第5页上,并回传后,它发现自己3页...之后,你点击第6页,它发现自己5页......等等等等。
为什么没有按预期工作分页?
解
该问题是由于在结合发生的历史Page_Load
事件。
对于这种按预期工作,结合需要在发生DataPager
的OnPreRender
事件 ,而不是在Page_Load
。
资源:
<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
OnPreRender="ListPager_PreRender">
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
后面的代码:
protected void Page_Load(object sender, EventArgs e)
{
//Binding code moved from Page_Load
//to the ListView's PreRender event
}
protected void ListPager_PreRender(object sender, EventArgs e)
{
MyList.DataSource = GetSomeList();
MyList.DataBind();
}
我碰到了同样的问题,但在DataPager的预渲染结合每次不是我的选择。 取而代之的是,我能够通过寻呼发生时只有结合来完成同样的事情。 该解决方案可以用来作为替代由Andreas预渲染溶液。 以下为我工作:
通过附加到ListView的PagePropertiesChanged事件,我能纠正分页问题,而无需对数据寻呼机的每一个预渲染结合。
说明:该数据寻呼机属性是在皮肤文件,这就是为什么他们不在标记设置。
标记:
<asp:DataPager ID="ListPager" runat="server" PagedControlID="MyList" />
<asp:ListView ID="MyList" runat="server">
<% //LayoutTemplate and ItemTemplate removed for the example %>
</asp:ListView>
后面的代码:
protected void Page_Load(object sender, EventArgs e) {
MyList.PagePropertiesChanged += new EventHandler(MyList_PagePropertiesChanged);
}
/// <summary>
/// Handles the situation where the page properties have changed. Rebind the data
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyList_PagePropertiesChanged(object sender, EventArgs e) {
MyList.DataSource = GetSomeList();
MyList.DataBind();
}
这是因为丢失在DataPager的OnPreRender事件!
继对我的作品完美。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ds As DataSet
ds = SQLHELPER.ExecuteDataSet(CommandType.StoredProcedure, "sp_Locations")
rs.EnableViewState = False
rs.DataSource = ds
rs.DataBind()
End Sub
Protected Sub rs_PagePropertiesChanging(ByVal sender As Object, ByVal e As PagePropertiesChangingEventArgs)
'set current page startindex, max rows and rebind to false
Pager.SetPageProperties(e.StartRowIndex, e.MaximumRows, False)
'rebind List View
rs.DataBind()
End Sub
<asp:ListView ID="rs" runat="server" onpagepropertieschanging="rs_PagePropertiesChanging">
另外,如果你正在建设一个用户控件只包含ListView的,你可以简单地指向寻呼机事件处理程序Page_Load
方法,由于在Page_Load方法没有运行任何东西:
<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
OnPreRender="Page_Load">
在页面加载,你应该把如果(!的IsPostBack)之间的代码{}
这将解决您的问题。