我在获取 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 查询绑定(bind)到它。
现在我将 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 中的另一行,则什么也不会发生。
是否有一种方法可以构建此结构,以便选项卡可以在不丢失回发触发器的情况下进行更改,或者我是否将这一切都搞错了?
谢谢。
最佳答案
回发触发器不会丢失。问题是由每个选项卡中的单独 UpdatePanel 引起的。
将整个 TabContainer 放入 UpdatePanel 中,您可以从选项卡中删除 UpdatePanel(但您不必这样做)。确保该新面板的 UpdateMode 设置为“始终”。
我认为它在你的示例中没有改变的原因是 UpdatePanel 仅刷新它自己的内容,并且为 UpdatePanel 外部的 div (tabPanel) 设置了决定选项卡是否可见的属性。当您返回带有网格的选项卡时,您可以通过单击它在客户端执行此操作,这就是出错的时候。
要深入了解问题并找出它在第一次回发期间起作用的原因,您可能必须调试 TabContainer 控件的 ajax 工具包 javascript。
关于asp.net - 从选项卡容器中的数据绑定(bind) GridView 丢失更新面板触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23142353/