Programmatically add controls to form

后端 未结 3 1830
被撕碎了的回忆
被撕碎了的回忆 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
    

提交回复
热议问题