首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用vb.net访问asp.net中选项卡容器中动态创建的控件

无法使用vb.net访问asp.net中选项卡容器中动态创建的控件
EN

Stack Overflow用户
提问于 2012-01-21 01:51:00
回答 1查看 1.5K关注 0票数 0

我正在开发一个聊天系统。在这里,当我更改用户列表框的选定索引时,我将在选项卡容器中创建动态选项卡面板。在这些选项卡面板中,我动态地创建了2个文本框和1个按钮,并为按钮单击事件添加了一个处理程序。我将tabid存储在会话状态中,并在page_init事件中重新创建所有选项卡。我可以在选项卡面板中触发按钮单击事件,其中我无法访问这些动态创建的文本框,但我可以访问我静态创建的标签。我使用了findcontrol()方法,但它显示了一条错误消息:"Use new command to create the textbox instance“。它显示的内容类似于我尚未创建textbox的实例。

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-21 03:48:45

下面是一个完整的工作示例:

Page-ASPX:

代码语言:javascript
复制
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" CombineScripts="true">
</asp:ToolkitScriptManager>
<div>
   <asp:UpdatePanel ID="UpdTabContainer" ChildrenAsTriggers="false" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
   <asp:TabContainer ID="TabContainer1" runat="server" AutoPostBack="true">
        <asp:TabPanel ID="TabUserList" runat="server" HeaderText="UserList">
            <ContentTemplate>
                <asp:UpdatePanel ID="UpdUserList" runat="server" UpdateMode="Conditional">
                    <ContentTemplate>
                        <asp:ListBox ID="ListBox1" SelectionMode="Single" AutoPostBack="true" OnSelectedIndexChanged="UserChanged" runat="server">
                            <asp:ListItem Text="User 1" Value="1"></asp:ListItem>
                            <asp:ListItem Text="User 2" Value="2"></asp:ListItem>
                            <asp:ListItem Text="User 3" Value="3"></asp:ListItem>
                        </asp:ListBox>
                    </ContentTemplate>
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="TabContainer1" EventName="ActiveTabChanged" />
                    </Triggers>
                </asp:UpdatePanel>
            </ContentTemplate>
        </asp:TabPanel>
    </asp:TabContainer>
    </ContentTemplate> 
    </asp:UpdatePanel>
</div>

代码背后:

代码语言:javascript
复制
Public Class TabContainerSample
    Inherits System.Web.UI.Page

    Property CreatedTabIDs As List(Of Int32)
        Get
            If Session("CreatedTabIDs") Is Nothing Then
                Session("CreatedTabIDs") = New List(Of Int32)
            End If
            Return DirectCast(Session("CreatedTabIDs"), List(Of Int32))
        End Get
        Set(value As List(Of Int32))
            Session("CreatedTabIDs") = value
        End Set
    End Property

    Private Sub TabContainerSample_Init(sender As Object, e As System.EventArgs) Handles Me.Init
        For Each userID In CreatedTabIDs
            AddTab(userID)
        Next
    End Sub

    Private Sub AddTab(tabID As Int32)
        Dim ucLogin = DirectCast(Page.LoadControl("LoginControl.ascx"), LoginControl)
        ucLogin.UserID = tabID
        AddHandler ucLogin.LoggedIn, AddressOf userLoggedIn
        Dim newTabPanel = New AjaxControlToolkit.TabPanel
        newTabPanel.ID = String.Format("Tab{0}", tabID)
        newTabPanel.HeaderText = String.Format("TabPanel {0}", tabID)
        newTabPanel.Controls.Add(ucLogin)
        TabContainer1.Tabs.Add(newTabPanel)
    End Sub

    Protected Sub UserChanged(sender As Object, e As EventArgs)
        Dim tabID = Int32.Parse(DirectCast(sender, ListBox).SelectedValue)
        If Not CreatedTabIDs.Contains(tabID) Then
            AddTab(tabID)
            CreatedTabIDs.Add(tabID)
            Me.UpdTabContainer.Update()
        End If
    End Sub

    Private Sub userLoggedIn(login As LoginControl)
        ' do something '
    End Sub

End Class

UserControl,例如登录控件:

代码语言:javascript
复制
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="LoginControl.ascx.vb" Inherits="WebApplication1.LoginControl" %>
<asp:UpdatePanel ID="UpdLoginControl" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
    User-ID: <asp:Label ID="LblUserID" runat="server" Text="0"></asp:Label>
    <br /><asp:TextBox ID="TxtUserName" runat="server"></asp:TextBox>
    <br /><asp:TextBox ID="TxtPassord" runat="server"></asp:TextBox>
    <br /><asp:Button ID="BtnLogin" runat="server" Text="Login" />
    </ContentTemplate>
</asp:UpdatePanel>

代码背后:

代码语言:javascript
复制
Public Class LoginControl
    Inherits System.Web.UI.UserControl

    Public Event LoggedIn(sender As LoginControl)

    Public Property UserID As Int32
        Get
            Return Int32.Parse(Me.LblUserID.Text)
        End Get
        Set(value As Int32)
            Me.LblUserID.Text = value.ToString
        End Set
    End Property

    Private Sub BtnLogin_Click(sender As Object, e As System.EventArgs) Handles BtnLogin.Click
        Dim userName = TxtUserName.Text
        Dim password = TxtPassord.Text
        ' validate UserName and Password, if valid you can raise your custom LoggedIn-Event'
        Dim loggedIn As Boolean = True
        If loggedIn Then
            RaiseEvent LoggedIn(Me)
        End If
        Me.UpdLoginControl.Update()
    End Sub
End Class

如果您有进一步的问题,请提问。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8945691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档