代码之家  ›  专栏  ›  技术社区  ›  madlan

以编程方式将控件添加到窗体

  •  1
  • madlan  · 技术社区  · 14 年前

    我正在使用附加的代码在现有集合下添加另一行控件(单击标签时)。可能会有相当多的行添加,所以我不得不重复代码多次使用计数器(I)保持跟踪。。。

    有没有更好的方法?

    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
    
    3 回复  |  直到 14 年前
        1
  •  6
  •   FastAl    14 年前

    有几点。。。

    不要将所有控件都添加到一个面板,请使用usercontrol。

    然后再加上实例。

    不处理标签中的单击事件

    示例。。。

    当然是最小的。您需要:

    • 也可以将它们添加到uc的通用列表中。
    • 设置窗体的最小/最大大小-以允许合理的大小(允许任何高度>~100)
    • 设置uc和控件。锚定属性以允许合理调整大小

    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
    
        2
  •  1
  •   Chase Florell    14 年前

    With 声明。

        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
    
        3
  •  1
  •   Chase Florell    14 年前

    如果您需要在单个页面中添加不确定数量的项,那么您需要将这些项存储在数组列表中,稍后我们可以动态添加到页面中。

    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
    

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

    基本上,每次单击按钮时都会向页面添加一个额外的控件集。您可以在页面上拥有无限数量的控件,而无需添加任何其他代码。