Programmatically add controls to form

后端 未结 3 1747
被撕碎了的回忆
被撕碎了的回忆 2021-01-24 07:22

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 repe

相关标签:
3条回答
  • 2021-01-24 07:37

    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
    
    0 讨论(0)
  • 2021-01-24 07:40

    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
    
    0 讨论(0)
  • 2021-01-24 07:40

    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.

    0 讨论(0)
提交回复
热议问题