This is a migrated thread and some comments may be shown as answers.

Dynamic load User Control open another User Control

1 Answer 175 Views
Ajax
This is a migrated thread and some comments may be shown as answers.
Jan
Top achievements
Rank 2
Jan asked on 10 Sep 2012, 06:42 AM
Hello,

How can one from a UserControl which dynamically created, close itself and open another UserControl dynamically?

Update:I solved this after some searching. I have updated my post with code that worked for me. It is not tidy. Someone may have a smarter solution?

default.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head runat="server">
    <title></title>
    <telerik:RadStyleSheetManager ID="RadStyleSheetManager1" runat="server" />
</head>
<body>
    <form id="form1" runat="server">
        <telerik:RadScriptManager ID="RadScriptManager1" runat="server">
            <Scripts>
                <%--Needed for JavaScript IntelliSense in VS2010--%>
                <%--For VS2008 replace RadScriptManager with ScriptManager--%>
                <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Core.js" />
                <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQuery.js" />
                <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryInclude.js" />
            </Scripts>
        </telerik:RadScriptManager>
        <script type="text/javascript">
            //Put your JavaScript code here.
        </script>
        <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
            <AjaxSettings>
                <telerik:AjaxSetting AjaxControlID="RibbonBarButton1">
                    <UpdatedControls>
                        <telerik:AjaxUpdatedControl ControlID="PlaceHolder1" />
                        <telerik:AjaxUpdatedControl ControlID="hf" />
                    </UpdatedControls>
                </telerik:AjaxSetting>
                <telerik:AjaxSetting AjaxControlID="RibbonBarButton2">
                    <UpdatedControls>
                        <telerik:AjaxUpdatedControl ControlID="PlaceHolder1" LoadingPanelID="RadAjaxLoadingPanel1" />
                        <telerik:AjaxUpdatedControl ControlID="hf" />
                    </UpdatedControls>
                </telerik:AjaxSetting>
            </AjaxSettings>
        </telerik:RadAjaxManager>
        <div>
 
 
            <telerik:RadRibbonBar ID="RadRibbonBar1" runat="server" Width="900px" Style="max-width: 900px;" Skin="Office2010Silver" EnableMinimizing="true">
                <telerik:RibbonBarTab Text="UC">
                    <telerik:RibbonBarGroup Text="UC1" ID="RibbonBarGroup1">
                        <Items>
 
                            <telerik:RibbonBarButton Size="Large" Text="UC1" ImageUrlLarge="/images/icons/docs_32.png" ID="RibbonBarButton1" />
 
                        </Items>
                    </telerik:RibbonBarGroup>
                    <telerik:RibbonBarGroup Text="UC2" ID="RibbonBarGroup2">
                        <Items>
 
                            <telerik:RibbonBarButton Size="Large" Text="UC2" ImageUrlLarge="/images/icons/docs_32.png" ID="RibbonBarButton2" />
 
                        </Items>
                    </telerik:RibbonBarGroup>
                </telerik:RibbonBarTab>
            </telerik:RadRibbonBar>
 
 
 
            <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
        </div>
        <asp:Label ID="hf" Text="" runat="server" Visible="false" />
    </form>
</body>
</html>


default.aspx.vb
Imports Telerik.Web.UI
 
Partial Class _Default
    Inherits System.Web.UI.Page
 
 
    Protected Sub RadRibbonBar1_ButtonClick(sender As Object, e As RibbonBarButtonClickEventArgs) Handles RadRibbonBar1.ButtonClick
 
        If e.Button.ID.ToString = "RibbonBarButton1" Then
            LoadUserControl("UC1")
        ElseIf e.Button.ID.ToString = "RibbonBarButton2" Then
            LoadUserControl("UC2")
        End If
 
            End Sub
 
    Public Sub LoadUserControl(ByVal userControl As String)
 
        hf.Text = userControl
 
        PlaceHolder1.Controls.Clear()
 
        Dim wuc As Web.UI.UserControl = CType(LoadControl("~/" & userControl & ".ascx"), Web.UI.UserControl)
        wuc.ID = userControl
        PlaceHolder1.Controls.Add(wuc)
 
    End Sub
 
 
 
 
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
 
        If Page.IsPostBack Then
 
            If hf.Text.Length > 2 Then
 
                Dim wuc As Web.UI.UserControl = CType(LoadControl("~/" & hf.Text & ".ascx"), Web.UI.UserControl)
 
                wuc.ID = hf.Text
                wuc.Visible = False
                PlaceHolder1.Controls.Add(wuc)
            End If
        End If
 
    End Sub
End Class


UC1.ascx
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="UC1.ascx.vb" Inherits="UC1" %>
 
UC1<br />
<asp:Button ID="Button1" runat="server" Text="Open UC2" />
UC1.ascx.vb
Partial Class UC1
    Inherits System.Web.UI.UserControl
 
    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' show the other control
        Dim wuc As Web.UI.UserControl = CType(LoadControl("~/UC2.ascx"), Web.UI.UserControl)
        Dim holder As PlaceHolder = CType(ControlExtensions.FindControlRecursive(Page, "PlaceHolder1"), PlaceHolder)
 
        wuc.ID = "UC2"
        wuc.Visible = True
 
        holder.Controls.Add(wuc)
 
        Dim hf As Label = CType(ControlExtensions.FindControlRecursive(Page, "hf"), Label)
        hf.Text = "UC2"
    End Sub
End Class

UC2.ascx
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="UC2.ascx.vb" Inherits="UC2" %>
 
UC2<br />
<asp:Button ID="Button1" runat="server" Text="Open UC1" />
UC2.ascx.vb
Partial Class UC2
    Inherits System.Web.UI.UserControl
 
    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' show the other control
        Dim wuc As Web.UI.UserControl = CType(LoadControl("~/UC1.ascx"), Web.UI.UserControl)
        Dim holder As PlaceHolder = CType(ControlExtensions.FindControlRecursive(Page, "PlaceHolder1"), PlaceHolder)
 
        wuc.ID = "UC1"
        wuc.Visible = True
 
        holder.Controls.Add(wuc)
 
        Dim hf As Label = CType(ControlExtensions.FindControlRecursive(Page, "hf"), Label)
        hf.Text = "UC1"
    End Sub
End Class

ControlExtensions.vb
Imports Microsoft.VisualBasic
 
Public Class ControlExtensions
 
    ''' <summary>
    ''' recursively finds a child control of the specified parent.
    ''' </summary>
    ''' <param name="control"></param>
    ''' <param name="id"></param>
    ''' <returns></returns>
    Public Shared Function FindControlRecursive(ByVal control As Control, ByVal id As String) As Control
        If control Is Nothing Then
            Return Nothing
        End If
 
        'try to find the control at the current level
        Dim ctrl As Control = control.FindControl(id)
 
        If ctrl Is Nothing Then
            'search the children
            For Each child As Control In control.Controls
                ctrl = FindControlRecursive(child, id)
                If Not ctrl Is Nothing Then
                    Exit For
                End If
            Next child
        End If
 
        Return ctrl
    End Function
 
 
End Class


/Janne

1 Answer, 1 is accepted

Sort by
0
Maria Ilieva
Telerik team
answered on 13 Sep 2012, 08:50 AM
Hi Jan,

Thank you for sharing your solution for this scenario.

 I'm sure it will be very helpful for the community.

Greetings,
Maria Ilieva
the Telerik team
If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
Tags
Ajax
Asked by
Jan
Top achievements
Rank 2
Answers by
Maria Ilieva
Telerik team
Share this question
or