2014-04-17 32 views
4

我在GridView中獲取命令鏈接時遇到了一些問題,以保持它在初始回發之後更改選項卡的能力。所以,下面你會看到我的內容的結構(很大程度上簡化):從tabab容器中的databound gridview丟失更新面板觸發器

<ajaxToolkit:TabContainer runat="server" ID="tabBody">  
    <ajaxToolkit:TabPanel runat="server" ID="tabPanel1"> 
     <ContentTemplate> 
     <asp:UpdatePanel runat="server" ID="updPanel1"> 
      <ContentTemplate> 
      <asp:Gridview runat="server" ID="grd1" OnRowCommand="grd1_RowCommand" OnRowDataBound="grd1_RowDataBound"> 
       <asp:TemplateField> 
        <ItemTemplate> 
        <asp:LinkButton ID="lnkChangePanels" runat="server" CommandArgument='<%#Eval("id") %>' CommandName="gotopanel2" Text='<%#Eval("FirstName") & " " & Eval("LastName")%>' /> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </asp:Gridview> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
     </ContentTemplate> 
    </ajaxToolkit:TabPanel> 
    <ajaxToolkit:TabPanel runat="server" ID="tabPanel2"> 
     <ContentTemplate> 
     <asp:UpdatePanel runat="server" ID="updPanel2"> 
      <ContentTemplate> 
      <asp:Gridview runat="server" ID="grd2"> 

      </asp:Gridview> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
     </ContentTemplate> 
    </ajaxToolkit:TabPanel> 
</ajaxToolkit:TabContainer> 

爲了填補面板1在GridView上,有一個搜索框,用戶類型爲我調用一個函數來綁定LINQ查詢到它。

現在我添加rowcommand作爲回傳觸發的RowDataBound:

Protected Sub grd1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) 
     If e.Row.RowType = DataControlRowType.DataRow Then 
      Dim lb As LinkButton = CType(e.Row.FindControl("lnkChangePanels"), LinkButton) 
      If Not lb Is Nothing Then 
       ToolkitScriptManager1.RegisterPostBackControl(lb) 
      End If 
     End If 
    End Sub 

那麼這裏就是我要觸發標籤面板更改(並做一些其他的東西)的代碼:

Protected Sub grd1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles grd1.RowCommand 
    Dim id = e.CommandArgument.ToString() 
    Select Case e.CommandName 
     Case "gotopanel2" 
      eventDetails(id, "C") 
      tabBody.ActiveTab = tabPanel2 
    End Select 
End Sub 

這會導致正確的回發並更改選項卡,一切按預期工作。但是如果我回到第一個選項卡並嘗試在gridview 1中單擊另一行,則什麼都不會發生。

有沒有一種方法來構造這樣的一個選項卡可以改變而不會丟失回發觸發器,或者我對這一切都有錯?

謝謝。

回答

1

回傳觸發不會丟失。問題是由每個選項卡中的單個UpdatePanel造成的。

將整個TabContainer放入UpdatePanel中,並且可以從選項卡中移除UpdatePanels(但不一定)。確保新面板的UpdateMode設置爲「始終」。

我認爲它在你的例子中沒有改變的原因是UpdatePanel只刷新它自己的內容和屬性,決定tab是否可見或是否被設置爲UpdatePanel外的div(tabPanel)。當你回到帶有網格的標籤時,你可以通過點擊它來做到客戶端,那就是它出錯的時候。

爲了深入瞭解問題的原點並找出它在第一次回發期間的工作原理,您可能需要爲TabContainer控件調試ajax工具包javascript。

+0

輝煌。現在看來合乎邏輯的是將整個事情包裝在一個大的更新面板中,而不是單個的。該解決方案奏效。謝謝。 – jethomas