Question Creating Dynamic Controls

steveb46

Member
Joined
Aug 5, 2010
Messages
15
Programming Experience
Beginner
I have the need to create numerous controls (unknown) (based upon the value in a text box in an asp page. For example, if the user enters 20 into to a text field, I need to create 20 labels & 20 textboxes. I used to do this in vb6 with control arrays. They don't exist anymore. How can I do this in asp.net?

Sorry for a newbie question.
 
Please check this very basic example:

HTML code:

PHP:
<form id="form1" runat="server">
    <div>
        <asp:TextBox ID="NumberOfControls" runat="server" />
        <asp:Button ID="CreateButton" runat="server" Text="Create" />
        <br /><br />
        <asp:Panel ID="Container" runat="server" />
    </div>
</form>


Code-Behind:
VB.NET:
   Protected Sub CreateButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateButton.Click
        For i As Integer = 1 To Convert.ToInt32(NumberOfControls.Text)
            Dim newlabel As New Label
            newlabel.ID = "Label" & i
            newlabel.Text = "New Label No. " & i

            Dim newtextbox As New TextBox
            newtextbox.ID = "TextBox" & i
            newtextbox.Text = ""

            Container.Controls.Add(newlabel)
            Container.Controls.Add(newtextbox)
            Container.Controls.Add(New LiteralControl("<br /><br />"))
        Next
    End Sub
 
Just add an extra button for testing purpose and name it GetValueButton.

PHP:
<body>
    <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="NumberOfControls" runat="server" />
            <asp:Button ID="CreateButton" runat="server" Text="Create" /> 
             
            <asp:Button ID="GetValueButton" runat="server" Text="Get Value" />
            <br /><br />
            <asp:Panel ID="Container" runat="server" />
        </div>
    </form>
</body>

Code-Behind:

VB.NET:
     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            'Initiate the counter of dynamically added controls
            Me.NumOfControls = 0
        Else
            'Controls must be repeatedly be created on postback
            Me.ReCreateControls()
        End If
    End Sub

    Protected Sub CreateButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateButton.Click
        For i As Integer = 1 To Convert.ToInt32(NumberOfControls.Text)
            AddNewControl()
        Next
    End Sub

    Protected Property NumOfControls() As Integer
        Get
            Return CType(ViewState("NumOfControls"), Integer)
        End Get
        Set(ByVal value As Integer)
            ViewState("NumOfControls") = value
        End Set
    End Property

    Private Sub ReCreateControls()
        For i As Integer = 1 To Me.NumOfControls
            Dim newlabel As New Label
            newlabel.ID = "Label" & i
            newlabel.Text = "New Label No. " & i

            Dim newtextbox As New TextBox
            newtextbox.ID = "TextBox" & i
            newtextbox.Text = ""

            Container.Controls.Add(newlabel)
            Container.Controls.Add(newtextbox)
            Container.Controls.Add(New LiteralControl("<br /><br />"))
        Next
    End Sub

    Private Sub AddNewControl()
        Dim newlabel As New Label
        newlabel.ID = "Label" & (NumOfControls + 1).ToString
        newlabel.Text = "New Label No. " & (NumOfControls + 1).ToString

        Dim newtextbox As New TextBox
        newtextbox.ID = "TextBox" & (NumOfControls + 1).ToString
        newtextbox.Text = ""

        Container.Controls.Add(newlabel)
        Container.Controls.Add(newtextbox)
        Container.Controls.Add(New LiteralControl("<br /><br />"))
        Me.NumOfControls += 1
    End Sub

    ''' <summary>
    ''' Gets value from the dinamically created TextBox controls
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub GetValueButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles GetValueButton.Click
        Dim TBox As TextBox = CType(Container.FindControl("TextBox1"), TextBox)
        If TBox IsNot Nothing Then
            Response.Write(TBox.Text)
        End If
    End Sub
 

Latest posts

Back
Top