2014-04-17 30 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