ASP.Net:DataPager控件总是以寻呼落后一步(ASP.Net : DataPager C

2019-06-25 23:36发布

看看下面的例子......有一个网页ListViewDataPager用于寻呼的数据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页......等等等等。

为什么没有按预期工作分页?

Answer 1:

该问题是由于在结合发生的历史Page_Load事件。

对于这种按预期工作,结合需要在发生DataPagerOnPreRender事件 ,而不是在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();    
}


Answer 2:

我碰到了同样的问题,但在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();
}


Answer 3:

这是因为丢失在DataPager的OnPreRender事件!



Answer 4:

继对我的作品完美。

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">


Answer 5:

另外,如果你正在建设一个用户控件只包含ListView的,你可以简单地指向寻呼机事件处理程序Page_Load方法,由于在Page_Load方法没有运行任何东西:

<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
OnPreRender="Page_Load">


Answer 6:

在页面加载,你应该把如果(!的IsPostBack)之间的代码{}

这将解决您的问题。



文章来源: ASP.Net : DataPager Control always a step behind with paging