Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net:DataPager控件始终落后于分页_C#_Asp.net_Listview_Datapager - Fatal编程技术网

C# ASP.Net:DataPager控件始终落后于分页

C# ASP.Net:DataPager控件始终落后于分页,c#,asp.net,listview,datapager,C#,Asp.net,Listview,Datapager,以下面的示例为例…一个带有ListView和DataPager的页面,用于分页ListView的数据: 代码隐藏: 资料来源: DataPager的问题在于它总是比绑定落后一步 例如,当页面加载时,它位于第1页。然后,当您单击第3页时,回发后它将停留在第1页。然后你点击第5页,在回发之后它会在第3页找到自己…然后你点击第6页,它会在第5页找到自己…等等 为什么分页没有按预期工作?解决方案 问题是由于页面加载事件上发生绑定 要使其按预期工作,绑定需要在DataPager的OnPreRender

以下面的示例为例…一个带有
ListView
DataPager
的页面,用于分页
ListView
的数据:

代码隐藏:

资料来源:


DataPager
的问题在于它总是比绑定落后一步

例如,当页面加载时,它位于第1页。然后,当您单击第3页时,回发后它将停留在第1页。然后你点击第5页,在回发之后它会在第3页找到自己…然后你点击第6页,它会在第5页找到自己…等等

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

解决方案 问题是由于
页面加载
事件上发生绑定

要使其按预期工作,绑定需要在
DataPager
OnPreRender
事件中进行,而不是在
页面加载中进行

资料来源:


我遇到了同样的问题,但每次在datapager prerender上绑定都不是我的选择。相反,只有在分页发生时,我才能够通过绑定完成大致相同的事情。此解决方案可以用作Andreas的预渲染解决方案的替代方案。以下几点对我很有用:

通过附加到ListView的PagePropertiesChanged事件,我能够纠正分页问题,而无需绑定数据分页器的每个预呈现

注意:大多数数据寻呼机属性都是在皮肤文件中设置的,这就是它们不在标记中的原因

标记:


代码隐藏:

受保护的无效页面加载(对象发送方,事件参数e){
MyList.PagePropertiesChanged+=新事件处理程序(MyList_PagePropertiesChanged);
}
/// 
///处理页面属性已更改的情况。重新绑定数据
/// 
/// 
/// 
私有void MyList_页面属性已更改(对象发送方,事件参数e){
MyList.DataSource=GetSomeList();
MyList.DataBind();
}

您缺少datapager上的OnPreRender事件

在页面加载中,您应该将代码放在 如果(!IsPostBack) { }


它会解决你的问题。

下面的作品非常适合我。

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">
Protected Sub Page_Load(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Load
Dim ds作为数据集
ds=SQLHELPER.ExecuteDataSet(CommandType.StoredProcess,“sp_位置”)
rs.EnableViewState=False
rs.DataSource=ds
rs.DataBind()
端接头
受保护的子rs_页面属性更改(ByVal sender作为对象,ByVal e作为页面属性更改事件参数)
'将当前页面开始索引、最大行数和重新绑定设置为false
Pager.SetPageProperties(例如StartRowIndex,例如MaximumRows,False)
'重新绑定列表视图
rs.DataBind()
端接头

或者,如果您正在构建一个只包含ListView的用户控件,您可以简单地将寻呼机事件处理程序指向
页面加载
方法,因为页面加载方法不运行任何其他操作:

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


您的方法是否也适用于另一个控件的回发事件,该事件会导致listview将自身呈现为默认绑定(null)??如果是这样,我将在我的项目中使用你的方法。我自己还没有测试过。据我所知,PagePropertiesChanged事件仅在页面更改时触发,而不必在每次回发时触发。如果另一个控件发回,您可能必须在该另一个控件的事件处理程序中重新绑定。你得试试看。我认为这是正确的答案。为什么我们应该在每个请求中获得一个源(来自数据库)?没有任何意义。只是为那些盲目追随这一点的可怜虫指出——这并不能解决问题。请看下面的正确答案。谢谢!这是ASP.net的另一个怪癖,并没有被详细记录。
<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();    
}
<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();
}
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">
<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
OnPreRender="Page_Load">