tags:

views:

49

answers:

3

I'm using the attached code to add another line\row of controls beneath an existing set (when a label is clicked). There could be quite a few rows added so I'm having to repeat the code many times using the counter (i) to keep track...

Is there a better method for doing this?

Private Sub Label10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)      Handles LblExpandSearch.Click
    If i = 0 Then

        'TextBox7
        '
        Dim TextBox7 As New TextBox
        TextBox7.Size = New Size(302, 20)
        TextBox7.Name = "TextBox7"
        TextBox7.Location = New System.Drawing.Point(60, 135)
        Me.ExpAdvancedSearch.Controls.Add(TextBox7)

        'RadioButton5
        '
        Dim RadioButton5 As New RadioButton
        RadioButton5.AutoSize = True
        RadioButton5.Checked = True
        RadioButton5.Location = New System.Drawing.Point(77, 112)
        RadioButton5.Name = "RadioButton5"
        RadioButton5.Size = New System.Drawing.Size(55, 17)
        RadioButton5.TabIndex = 48
        RadioButton5.TabStop = True
        RadioButton5.Text = "NEAR"
        RadioButton5.UseVisualStyleBackColor = True

    ElseIf i = 1 Then

        ExpAdvancedSearch.Size_ExpandedHeight = 260

        'TextBox8
        '
        Dim TextBox8 As New TextBox
        TextBox8.Size = New Size(302, 20)
        TextBox8.Name = "TextBox8"
        TextBox8.Location = New System.Drawing.Point(60, 185)
        Me.ExpAdvancedSearch.Controls.Add(TextBox8)


        'RadioButton9
        '
        Dim RadioButton9 As New RadioButton
        RadioButton9.AutoSize = True
        RadioButton9.Checked = True
        RadioButton9.Location = New System.Drawing.Point(77, 162)
        RadioButton9.Name = "RadioButton9"
        RadioButton9.Size = New System.Drawing.Size(55, 17)
        RadioButton9.TabIndex = 48
        RadioButton9.TabStop = True
        RadioButton9.Text = "NEAR"
        RadioButton9.UseVisualStyleBackColor = True

    End If

    i = i + 1
End Sub
A: 

I don't know if there's a "less code" approach to this but I do know that you can save your fingers using a With statement.

    Dim RadioButton5 As New RadioButton
    With RadioButton5
        .AutoSize = True
        .Checked = True
        .Location = New System.Drawing.Point(77, 112)
        .Name = "RadioButton5"
        .Size = New System.Drawing.Size(55, 17)
        .TabIndex = 48
        .TabStop = True
        .Text = "NEAR"
        .UseVisualStyleBackColor = True
    End With
rockinthesixstring
+1  A: 

If you need to add an indefinite number of items to a single page, then you need to store those items in an array list that we can later add to the page dynamically.

Imports System.Collections.Generic


Partial Class Default2
    Inherits System.Web.UI.Page

    ''# the i integer is here for helping to set the ID of the radio button 
    ''# as well as the tabindex
    Private Shared _i As Integer
    Public Shared Property i As Integer
        Get
            Return _i
        End Get
        Set(ByVal value As Integer)
            _i = value
        End Set
    End Property

    ''# we need to create an array of our control list class
    Public Shared _ctrlList As List(Of ControlList)





    ''# page load event
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            ''# if the page is not a postback, then we need to initialize the Control List
            _ctrlList = New List(Of ControlList)
            i = 0
        End If
    End Sub



    ''# button click event
    Protected Sub button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button.Click

        ''# create a new RadioButton every time the button is clicked
        Dim rb As RadioButton = New RadioButton
        With rb
            .ID = "radioButton" + i.ToString
            .Checked = True
            .TabIndex = 48 + i
            .Text = "NEAR"
        End With

        ''# create a new literal every time the button is clicked
        Dim lt As Literal = New Literal
        With lt
            .ID = "literal" + i.ToString
            .Text = " <strong>my fancy text</strong><br />"
        End With

        ''# add the radio button and literal to our custom array
        _ctrlList.Add(New ControlList(rb, lt))

        ''# loop through the array and add the controls to the page
        For Each cl In _ctrlList
            LabelPlaceHolder.Controls.Add(cl.RadioBtn)
            LabelPlaceHolder.Controls.Add(cl.Litrl)
        Next

        ''# increment the i counter so that we have unique radioButton ID's
        i = i + 1
    End Sub



    ''# this is our custom Control List
    ''# the idea behind this is for us to store 
    ''# an array of Radio Buttons and literals to 
    ''# spit out onto the page
    ''# NOTE: you can add as many controls as you like 
    ''# to this list and even add static "Literals" to 
    ''# help you with your formatting (IE: DIV tags or <BR> tags
    Public Class ControlList
        Private _RadioBtn As RadioButton
        Public Property RadioBtn As RadioButton
            Get
                Return _RadioBtn
            End Get
            Set(ByVal value As RadioButton)
                _RadioBtn = value
            End Set
        End Property

        Private _Litrl As Literal
        Public Property Litrl As Literal
            Get
                Return _Litrl
            End Get
            Set(ByVal value As Literal)
                _Litrl = value
            End Set
        End Property

        Public Sub New(ByVal radioBtn As RadioButton, ByVal litrl As Literal)
            _RadioBtn = radioBtn
            _Litrl = litrl
        End Sub

    End Class


End Class

Try this and see how it works. All you need in your ASPX is

<form id="form1" runat="server">
    <asp:PlaceHolder runat="server" id="LabelPlaceHolder" /><br />
    <asp:Button ID="button" runat="server" Text="click me" />
</form>

Basically what this does is add an additional control set to the page every time the button is clicked. You can have an indefinite number of controls on the page without adding any additional code.

rockinthesixstring
+1  A: 

Hmmm.. UseVisualStyleBackColor says 'winforms' to me.

A few points...

Don't add controls all to one panel, use a usercontrol.

Then just add instances of that.

Don't process click events from a label

Use a linklabel or button. Anything else = being mean to users. Of course it makes sense to you, you thought of it! Now so with users, this is black and white.

Sample...

Very minimal of course. You'll want to:

  • Put the items in a scrollable panel instead of right on the form.
  • Add them to a generic list of uc probably, too.
  • Set form's min/max size - to allow reasonable sizing (allow any height > ~100)
  • Set uc's and controls .Anchor properties to allow reasonable resizing

uc.vb

Public Class uc
    Inherits System.Windows.Forms.UserControl

    Private components As System.ComponentModel.IContainer
    Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
    Friend WithEvents LinkLabel1 As System.Windows.Forms.LinkLabel

    Public Sub New()
        MyBase.New()

        Me.TextBox1 = New System.Windows.Forms.TextBox
        Me.LinkLabel1 = New System.Windows.Forms.LinkLabel
        Me.SuspendLayout()

        Me.TextBox1.Location = New System.Drawing.Point(8, 8)
        Me.TextBox1.Name = "TextBox1"
        Me.TextBox1.Size = New System.Drawing.Size(88, 20)
        Me.TextBox1.TabIndex = 0
        Me.TextBox1.Text = "TextBox1"

        Me.LinkLabel1.Enabled = False
        Me.LinkLabel1.Location = New System.Drawing.Point(112, 8)
        Me.LinkLabel1.Name = "LinkLabel1"
        Me.LinkLabel1.Size = New System.Drawing.Size(24, 16)
        Me.LinkLabel1.TabIndex = 1
        Me.LinkLabel1.TabStop = True
        Me.LinkLabel1.Text = "add"

        Me.Controls.Add(Me.LinkLabel1)
        Me.Controls.Add(Me.TextBox1)
        Me.Name = "uc"
        Me.Size = New System.Drawing.Size(148, 36)
        Me.ResumeLayout(False)

    End Sub

    Private _addcallback As EventHandler = Nothing
    Public Property AddCallback() As EventHandler
        Get
            Return _addcallback
        End Get
        Set(ByVal Value As EventHandler)

            _addcallback = Value
            LinkLabel1.Enabled = Not Value Is Nothing

        End Set
    End Property

    Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
        If AddCallback Is Nothing Then Throw New ApplicationException("AddCallback not set on a uc") ' ALWAYS check for errors like this 
        _addcallback(Me, Nothing)
        AddCallback = Nothing ' gray myself out, can't insert in thie implementation
    End Sub
End Class

frm.vb

Public Class frm
    Inherits System.Windows.Forms.Form

    Private components As System.ComponentModel.IContainer
    Public Sub New()
        MyBase.New()
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Name = "Form1"
        Me.Text = "Form1"
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddClicked(Me, Nothing)
    End Sub

    Private Sub AddClicked(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim myuc As New uc
        myuc.AddCallback = AddressOf AddClicked
        If Controls.Count > 0 Then
            myuc.Top = Controls(Controls.Count - 1).Bottom
        End If
        Me.Controls.Add(myuc)
    End Sub
End Class
FastAl