Here is a complete working sample:
Page-ASPX:
<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>
Codebehind:
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
The UserControl, for example a Login-Control:
<%@ 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>
Codebehind:
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
If you have further question, ask.