2008-10-24 110 views
19

從我讀過的所有內容來看,似乎將分頁添加到ListView控件應該很簡單,但它不適用於我。在將ListView和DataPager控件添加到表單並將它們連接在一起後,我出現了非常奇怪的行爲。 DataPager正確地限制了ListView的頁面大小,但單擊分頁按鈕根本不影響ListView。分頁按鈕似乎認爲他們在做他們的工作,因爲最後一個按鈕被禁用,當你去到最後一頁等,但ListView從不改變。此外,DataPager需要兩次點擊才能使其執行任何操作,即單擊Last一次不執行任何操作,但第二次單擊它會導致DataPager作出反應,就好像現在選擇了最後一頁一樣。ListView與DataPager無法正常工作

我能想到的唯一的事情是我在運行時綁定數據源(到一個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 

回答

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跳回到第一頁,但顯示的數據是最後一頁。

28

我們需要在OnPreRender事件中再次數據綁定列表視圖。

protected override void OnPreRender(EventArgs e) 
     { 
      ListView1.DataBind(); 
      base.OnPreRender(e); 
     } 

--update

與asp.net ajax的幾個列表視圖的工作後,我看到了一個解決方案,使比上面一個更有意義。您通常會在頁面加載方法或按鈕單擊事件處理程序上綁定Listview,並且在回發時,數據綁定將如上所述在問題中丟失。所以,我們需要將數據綁定到頁面屬性已更改的列表視圖的事件處理程序。

ListView_PagePropertiesChanged(object sender, EventArgs e) 
{ 
ListView.DataSource=someDatasource; 
ListView.DataBind() 
} 
+1

你不需要再次進行數據綁定它*。但是,是的,你可以通過預渲染中的數據綁定來解決這個問題。 – 2009-02-20 20:29:43

+1

這是我從ASP.net見過的最愚蠢的事情(儘管我確信情況更糟)。但是,謝謝你找到它。我從來沒有想過會有pre_render錯誤。 – Dexter 2012-03-28 18:02:15

+0

@Syam當我使用預渲染覆蓋listView數據源出來是空的(點擊下一個按鈕),然後沒有記錄顯示...任何猜測? – tariq 2013-03-05 09:36:19

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); 
     //} 
    } 
} 
4

再來解決方案,其操作簡單,只需從數據庫中獲取的「查詢字符串」,「ID」,現在它設置爲導航控件屬性爲[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" ]

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

0

試試這個:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) 
{ 
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false); 
    ListView1.DataSource = productList; 
    ListView1.DataBind(); 
    DataPager1.DataBind(); 
} 
相關問題