0

I'm creating a chat application in asp.net. In this I'm creating tab panels in a tab container dynamically for each user. when you select a new user I'm generating a tab for him with two text boxes and send button to send messages. If he doesn't want to continue his chat I need to remove or delete that tab. Is there any way that i can remove or delete those tabs in asp.net using vb.net?

krrish
  • 163
  • 5
  • 12

1 Answers1

1

Here is a complete working sample, it could be broken down into this line(in RemoveTab):

Me.TabContainer1.Tabs.Remove(tab)

But have a look yourself ...

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

    Const idSuffix = "_"c

    Property CreatedTabIDs As List(Of String)
        Get
            If Session("CreatedTabIDs") Is Nothing Then
                Session("CreatedTabIDs") = New List(Of String)
            End If
            Return DirectCast(Session("CreatedTabIDs"), List(Of String))
        End Get
        Set(value As List(Of String))
            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 String)
        Dim ucChat = DirectCast(Page.LoadControl("ChatControl.ascx"), ChatControl)
        ucChat.UserName = tabID
        AddHandler ucChat.ChatSubmitted, AddressOf chatSubmitted
        AddHandler ucChat.ChatClosed, AddressOf chatClosed
        Dim newTabPanel = New AjaxControlToolkit.TabPanel
        newTabPanel.ID = String.Format("Tab{0}{1}", idSuffix, tabID)
        newTabPanel.HeaderText = String.Format("TabPanel {0}", tabID)
        newTabPanel.Controls.Add(ucChat)
        TabContainer1.Tabs.Add(newTabPanel)
    End Sub

    Private Sub RemoveTab(tabID As String)
        Dim tab = (From t In Me.TabContainer1.Tabs.Cast(Of AjaxControlToolkit.TabPanel)()
                  Where t.ID.Contains(idSuffix)
                  Let id = t.ID.Substring(t.ID.LastIndexOf(idSuffix) + 1)
                  Where id = tabID
                  Select t).First
        Me.TabContainer1.Tabs.Remove(tab)
        Me.CreatedTabIDs.Remove(tabID)
        Me.UpdTabContainer.Update()
    End Sub

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

    Private Sub chatSubmitted(chat As ChatControl)
        ' do something '
    End Sub

    Private Sub chatClosed(chat As ChatControl)
        RemoveTab(chat.UserName)
    End Sub

End Class

The Chat-UserControl:

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="ChatControl.ascx.vb" Inherits="WebApplication1.ChatControl" %>
<asp:UpdatePanel ID="UpdChatControl" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
    Username: <asp:Label ID="LblUserName" runat="server" Text="0"></asp:Label>
    <br /><asp:TextBox ID="TxtChat" runat="server" TextMode="MultiLine" Rows="4"></asp:TextBox>
    <br /><asp:Button ID="BtnSend" runat="server" Text="Send" />
    <br /><asp:Button ID="BtnClose" runat="server" Text="Close" />
    </ContentTemplate>
</asp:UpdatePanel>

Codebehind:

Public Class ChatControl
    Inherits System.Web.UI.UserControl

    Public Event ChatSubmitted(sender As ChatControl)
    Public Event ChatClosed(sender As ChatControl)

    Public Property UserName As String
        Get
            Return Me.LblUserName.Text
        End Get
        Set(value As String)
            Me.LblUserName.Text = value
        End Set
    End Property

    Public Property ChatText As String
        Get
            Return Me.TxtChat.Text
        End Get
        Set(value As String)
            Me.TxtChat.Text = value
        End Set
    End Property

    Private Sub BtnSend_Click(sender As Object, e As System.EventArgs) Handles BtnSend.Click
        RaiseEvent ChatSubmitted(Me)
        Me.UpdChatControl.Update()
    End Sub

    Private Sub BtnClose_Click(sender As Object, e As System.EventArgs) Handles BtnClose.Click
        RaiseEvent ChatClosed(Me)
        Me.UpdChatControl.Update()
    End Sub
End Class

If you have further question, ask.

Tim Schmelter
  • 450,073
  • 74
  • 686
  • 939
  • Thanks... I have another problem with the update panel.I have a tab container in the update panel in which I'm loading the user control in it as you suggested. I need to query the database and check the current user who is logged in has any messages.if i found any messages in the database then i need to load the web user control in to the tab container and show him the messages.for this I'm using timer function to the update panel and refreshing the whole update panel in which we had tab container. there comes the problem.the text box in the usercontrol is not maintaining its current position – krrish Feb 01 '12 at 21:57
  • @krish: I think this is not related to your question "deleting tab panel in tab container", is it? Try to reduce your problem as good as possible and ask a question which contains all required details to reproduce/understand it(f.e. what does "not maintaining its current position" mean?). – Tim Schmelter Feb 01 '12 at 22:04
  • I'm sorry for that...... I will post a new question....... what i mean by "not maintaining its current position" is i set the timer for every 5 seconds.... after every 5 seconds the timer refreshes the update panel in which all the tabs are inserted...if i typed after 5 seconds then I'm typing from the start of the text box... Thanks for answering my question i will upvote..... – krrish Feb 01 '12 at 22:09
  • please have a look at my new question:: http://stackoverflow.com/questions/9198144/how-to-display-lastline-of-la-multiple-line-textbox-every-time-i-refresh-the-con – krrish Feb 08 '12 at 17:22