2010-03-17 75 views
0

我有一個GridView,它使用UpdatePanel內部的自定義分頁(這樣gridview的分頁和排序不會導致回發)。排序工作正常,但分頁不。 PageIndexChanging事件永遠不會被調用。UpdatePanel中GridView的自定義分頁不會觸發PageIndexChanging事件

這是ASPX代碼:

<asp:UpdatePanel runat="server" ID="upSearchResults" ChildrenAsTriggers="true" UpdateMode="Always"> 
     <ContentTemplate> 
      <asp:GridView ID="gvSearchResults" runat="server" AllowSorting="true" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" OnDataBound="gvSearchResults_DataBound" 
       OnRowDataBound ="gvSearchResults_RowDataBound" OnSorting="gvSearchResults_Sorting" OnPageIndexChanging="gvSearchResults_PageIndexChanging" Width="100%" EnableSortingAndPagingCallbacks="false"> 
      <Columns> 
       <asp:TemplateField HeaderText="Select" HeaderStyle-HorizontalAlign="Center"> 
       <ItemTemplate> 
        <asp:HyperLink ID="lnkAdd" runat="server">Add</asp:HyperLink> 
        <asp:HiddenField ID="hfPersonId" runat="server" Value='<%# Eval("Id") %>'/> 
       </ItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField HeaderText="First Name" DataField="FirstName" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" SortExpression="FirstName" /> 
       <asp:BoundField HeaderText="Last Name" DataField="LastName" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" SortExpression="LastName" /> 
       <asp:TemplateField HeaderText="Phone Number" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" > 
       <ItemTemplate> 
        <asp:Label ID="lblPhone" runat="server" Text="" /> 
       </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
      <PagerTemplate> 
       <table width="100%" class="pager"> 
       <tr> 
        <td> 
        </td> 
       </tr> 
       </table> 
      </PagerTemplate>  
      </asp:GridView> 
      <div class="btnContainer"> 
       <div class="btn btn-height_small btn-style_dominant"> 
        <asp:LinkButton ID="lbtNewRecord" runat="server" OnClick="lbtNewRecord_Click"><span>Create New Record</span></asp:LinkButton> 
       </div> 
       <div class="btn btn-height_small btn-style_subtle"> 
        <a onclick="openParticipantModal();"><span>Cancel</span></a> 
       </div> 
      </div> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="gvSearchResults" EventName="PageIndexChanging" /> 
      <asp:AsyncPostBackTrigger ControlID="gvSearchResults" EventName="Sorting" /> 
     </Triggers> 
     </asp:UpdatePanel> 

在後面的代碼,我有被稱爲在GridView上OnDataBound事件SetPaging方法:如果我不

private void SetPaging(GridView gv) 
{ 
    GridViewRow row = gv.BottomPagerRow; 

    var place = row.Cells[0]; 

    var first = new LinkButton(); 
    first.CommandName = "Page"; 
    first.CommandArgument = "First"; 
    first.Text = "First"; 
    first.ToolTip = "First Page"; 

    if (place != null) place.Controls.Add(first); 

    var lbl = new Label(); 
    lbl.Text = " "; 
    if (place != null) place.Controls.Add(lbl); 

    var prev = new LinkButton(); 
    prev.CommandName = "Page"; 
    prev.CommandArgument = "Prev"; 
    prev.Text = "Prev"; 
    prev.ToolTip = "Previous Page"; 

    if (place != null) place.Controls.Add(prev); 

    var lbl2 = new Label(); 
    lbl2.Text = " "; 
    if (place != null) place.Controls.Add(lbl2); 

    for (int i = 1; i <= gv.PageCount; i++) 
    { 
    var btn = new LinkButton(); 
    btn.CommandName = "Page"; 
    btn.CommandArgument = i.ToString(); 

    if (i == gv.PageIndex + 1) 
    { 
     btn.BackColor = Color.Gray; 
    } 

    btn.Text = i.ToString(); 
    btn.ToolTip = "Page " + i.ToString(); 

    if (place != null) place.Controls.Add(btn); 

    var lbl3 = new Label(); 
    lbl3.Text = " "; 
    if (place != null) place.Controls.Add(lbl3); 
    } 

    var next = new LinkButton(); 
    next.CommandName = "Page"; 
    next.CommandArgument = "Next"; 
    next.Text = "Next"; 
    next.ToolTip = "Next Page"; 

    if (place != null) place.Controls.Add(next); 

    var lbl4 = new Label(); 
    lbl4.Text = " "; 
    if (place != null) place.Controls.Add(lbl4); 

    var last = new LinkButton(); 
    last.CommandName = "Page"; 
    last.CommandArgument = "Last"; 
    last.Text = "Last"; 
    last.ToolTip = "Last Page"; 

    if (place != null) place.Controls.Add(last); 

    var lbl5 = new Label(); 
    lbl5.Text = " "; 
    if (place != null) place.Controls.Add(lbl5); 
} 

尋呼工程使用自定義分頁,但我真的需要使用自定義分頁。我無法弄清楚爲什麼當我使用自定義分頁時,PageIndexChanging事件沒有被觸發。

感謝,

傑夫

回答

0

嗯....我不是太熟悉,自定義分頁,可是......當一個事件不火了數據綁定控件它通常是兩件事情之一:

1)您在不正確的時間重新綁定數據。 2)回發頁面上的控件圖層不一樣。

由於您正在動態創建此控件,因此我將在此處使用#2。事實上,您可能會遇到這兩個問題的組合,因爲您正在OnDataBound事件中創建控件。這意味着這個控件創建的唯一時間是當你調用DataBind時,你不應該回發,直到你已經處理了事件。所以你在這裏給自己編了一個Catch-22。

是不是可以通過標記添加自定義尋呼機?這將解決你的問題,因爲那樣你就不會依賴這個動態創建的控件。您的其他選項是將動態控件創建移動到Init事件。

+0

我寧願動態創建尋呼機,因爲頁面上有多個GridViews。我嘗試將調用SetPaging(GridView gv)從gvSearchResults_DataBound事件移動到gvSearchResults_Init事件,但在 var place = row.Cells [0]; 因爲gv.BottomPagerRow爲空。 – JeffCren 2010-03-17 13:46:42

+0

更新 - 在沒有UpdatePanel的頁面上,自定義分頁工作正常,當我查看源代碼時,我有這個: 2 在UpdatePanel中,我得到: 的 2 它丟棄命令和參數('頁$ 2' )。 – JeffCren 2010-03-17 15:33:39

+1

Aaah。什麼,UpdatePanel導致問題?誰會想到......我很確定UpdatePanel負責StackOverflow上ASP.NET問題的50%。什麼是ctl13 $ ctl06?這是面板ID嗎? – Bryan 2010-03-17 19:48:39

0

如果您動態創建GridView,它將爲您節省很多麻煩:請參閱this link E.g.你需要的是一個DataSet,其餘部分將通過控制來完成...

-1

綁定之前在GridView就這樣:

+0

PageIndexChanging事件已經綁定在ASP代碼中。 – 2012-10-16 05:53:11

0

你有任何的Response.Write或Response.WriteLine您碼?如果有的話,請刪除它。因爲它也有效果。 :D

+1

邁克爾,歡迎來到stackoverflow。 :)沒有必要讓人們訪問你的網站,它已經列在你的[個人資料頁面](http://stackoverflow.com/users/701797/michael)中,任何想看到它的人都可以在那裏找到它。 – sarnold 2011-04-11 08:43:12

0

其他事件,如gvSearchResults_Sorting是否正確啓動?如果沒有,請查看頁面上的AutoEventWireup屬性,它應該設置爲true,因爲您沒有顯式綁定事件處理程序。

否則,你有沒有試過你的問題UpdatePanel

相關問題