从我读过的所有内容来看,向ListView控件添加分页似乎应该很简单,但它对我不起作用。将ListView和DataPager控件添加到表单并将它们连接在一起后,我的行为非常奇怪。 DataPager正确限制了ListView的页面大小,但单击分页按钮根本不会影响ListView。分页按钮似乎认为他们正在做他们的工作,因为当你转到最后一页等时,最后一个按钮被禁用,但ListView永远不会改变。此外,只需点击两次DataPager即可让它执行任何操作,即单击Last last不会执行任何操作,但再次单击它会导致DataPager做出反应,就好像现在选择了最后一页一样。
我唯一能想到的是我在运行时绑定DataSource(到LINQ对象),而不是使用LinqDataSource控件或任何东西。有没有人见过这种行为?难道我做错了什么?这是我正在使用的代码:
<asp:DataPager ID="HistoryDataPager" runat="server" PagedControlID="HistoryListView" PageSize="10">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="true" ShowLastPageButton="true" />
</Fields>
</asp:DataPager>
<asp:ListView ID="HistoryListView" runat="server">
...
</asp:ListView>
在代码隐藏中:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
HistoryListView.DataSource = From x in myContext.myTables ...
DataBind()
End If
End Sub
答案 0 :(得分:28)
我们需要在OnPreRender事件中再次对数据列表视图进行数据绑定。
protected override void OnPreRender(EventArgs e)
{
ListView1.DataBind();
base.OnPreRender(e);
}
- 更新
在使用asp.net ajax处理一些列表视图后,我看到了一个比上面的解决方案更有意义的解决方案。您通常会在页面加载方法或按钮单击事件处理程序上绑定Listview数据,当有回发时,数据绑定将如上所述在问题中丢失。因此,我们需要在列表视图的页面属性更改事件处理程序上再次进行数据绑定。
ListView_PagePropertiesChanged(object sender, EventArgs e)
{
ListView.DataSource=someDatasource;
ListView.DataBind()
}
答案 1 :(得分:4)
另一个解决方案,简单,只需从数据库中获取“QUERY-STRING”中的“ID”,现在将其设置为Pager Control属性为[QueryStringField =“ID”],如:
<asp:DataPager ID="DataPagerProducts" runat="server" QueryStringField="ID" PageSize="3">
<Fields>
<asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
<asp:NumericPagerField />
<asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
</Fields>
</asp:DataPager>
注意:如果不是,也请设置[ PagedControlID="ListView_Name" ]
。
答案 2 :(得分:1)
查看ListViewPagedDataSource。
private ListViewPagedDataSource GetProductsAsPagedDataSource(DataView dv)
{
// Limit the results through a PagedDataSource
ListViewPagedDataSource pagedData = new ListViewPagedDataSource();
pagedData.DataSource = dv;
pagedData.MaximumRows = dv.Table.Rows.Count;
pagedData.TotalRowCount = dpTop.PageSize;
if (Request.QueryString[dpTop.QueryStringField] != null)
pagedData.StartRowIndex = (Convert.ToInt32(Request.QueryString[dpTop.QueryStringField]) - 1) * dpTop.PageSize;
else
pagedData.StartRowIndex = 0;
return pagedData;
}
尽管如此,我在查看最后一页时遇到了问题。 DataPager跳回到第一页,但显示的数据是最后一页。
答案 3 :(得分:1)
将listview绑定在datapager的预呈现事件而非页面加载时。请参阅solution here
答案 4 :(得分:0)
此外,如果更改了ListView的数据源(例如,如果基于搜索参数显示数据),请不要忘记每次更新数据源时重置寻呼机。使用ListView,这不像其他一些数据绑定控件(例如GridView)那样简单:
private void ResetListViewPager()
{
DataPager pager = (DataPager)ListViewMembers.FindControl("DataPager1");
if (pager != null)
{
CommandEventArgs commandEventArgs = new CommandEventArgs(DataControlCommands.FirstPageCommandArgument, "");
// MAKE SURE THE INDEX IN THE NEXT LINE CORRESPONDS TO THE CORRECT FIELD IN YOUR PAGER
NextPreviousPagerField nextPreviousPagerField = pager.Fields[0] as NextPreviousPagerField;
if (nextPreviousPagerField != null)
{
nextPreviousPagerField.HandleEvent(commandEventArgs);
}
// THIS COMMENTED-OUT SECTION IS HOW IT WOULD BE DONE IF USING A NUMERIC PAGER RATHER THAN A NEXT/PREVIOUS PAGER
//commandEventArgs = new CommandEventArgs("0", "");
//NumericPagerField numericPagerField = pager.Fields[0] as NumericPagerField;
//if (numericPagerField != null)
//{
// numericPagerField.HandleEvent(commandEventArgs);
//}
}
}
答案 5 :(得分:0)
<asp:ListView ID="ListView1" runat="server" DataSourceID="sdsImages">
<ItemTemplate>
<div class="photo sample12">
<asp:Image ID="img_Galerie" runat="server" ImageUrl='<%# "~/imageHandler.ashx?ID=" + Eval("ImageID") %>' />
</div>
</ItemTemplate>
</asp:ListView>
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="3" QueryStringField="ImageID">
<Fields>
<asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
<asp:NumericPagerField />
<asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
</Fields>
</asp:DataPager>
<asp:SqlDataSource ID="sdsImages" runat="server"
ConnectionString="<%$ ConnectionStrings:DBCS %>"
SelectCommand="SELECT ImageID FROM Images ">
答案 6 :(得分:0)
试试这个:
protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
ListView1.DataSource = productList;
ListView1.DataBind();
DataPager1.DataBind();
}