【问题标题】:Losing update panel trigger from databound gridview in tab container从选项卡容器中的数据绑定网格视图中丢失更新面板触发器
【发布时间】:2014-06-02 06:26:48
【问题描述】:

我在获取 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 中的另一行,则没有任何反应。

有没有一种方法来构建它,以便选项卡可以在不丢失回发触发器的情况下更改,或者我是否将这一切都搞错了?

谢谢。

【问题讨论】:

    标签: asp.net vb.net gridview updatepanel eventtrigger


    【解决方案1】:

    回发触发器不会丢失。问题是由每个选项卡中的各个 UpdatePanel 引起的。

    将整个 TabContainer 放在 UpdatePanel 中,您可以从选项卡中删除 UpdatePanel(但您不必这样做)。确保该新面板的 UpdateMode 设置为“始终”。

    我认为它在您的示例中没有更改的原因是 UpdatePanel 仅刷新它自己的内容和属性,该属性决定选项卡是否可见,为该 UpdatePanel 之外的 div (tabPanel) 设置。当您返回到带有网格的选项卡时,您通过单击它在客户端执行它,这就是它出错的时候。

    要深入了解问题并弄清楚为什么它在第一次回发期间确实有效,您可能必须为 TabContainer 控件调试 ajax 工具包 javascript。

    【讨论】:

    • 太棒了。现在似乎合乎逻辑地将整个内容包装在一个大型更新面板而不是单个更新面板中。该解决方案奏效了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 2011-10-08
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多