繁体   English   中英

Visual Basic 生成表单

[英]Visual Basic Generate a Form

我需要在 Visual Basic 中构建许多表单,但是手动完成需要很多时间。 作为一个实验,我想知道是否可以生成带有多个参数的表单,但是我找不到编写表单的方法。 例如,我将如何声明和初始化按钮、标签、文本框等并将它们编码为流布局或表格布局。 我是在 Class 或 Form.vb 或 Module 中构建它吗?

请让我知道,是否可能。

下面是一个如何在 WinForms 中动态创建控件并将它们添加到容器控件的示例。 我还向您展示了如何连接事件处理程序。 要测试代码,请创建一个新表单并向其添加一个名为“Panel1”的面板。 然后将此代码粘贴到 .vb 文件中。 您可以添加对更多控件类型的支持。

此扩展方法很有用,可确保 WinForms 在您从容器中清除控件时销毁控件(需要进入其自己的文件)

Module ExtensionMethods
    <Extension()>
    Sub Clear(ByVal controls As Control.ControlCollection, ByVal dispose As Boolean)
        For ix As Integer = controls.Count - 1 To 0

            If dispose Then
                controls(ix).Dispose()
            Else
                controls.RemoveAt(ix)
            End If
        Next
    End Sub
End Module

此代码显示如何动态创建控件

''' <summary>
''' Function for creating a textbox and adding it to a control
''' </summary>
''' <param name="Container">The container control to add the textbox to</param>
''' <param name="Name">The Name (Id) of the TextBox (must be unique)</param>
''' <param name="LabelText">The text of the label to create to go with it</param>
''' <param name="Top">The Top (y) position of the TextBox</param>
''' <param name="Left">The Left (x) position of the TextBox</param>
''' <param name="Value">The value of the TextBox</param>
''' <returns></returns>
Private Function AddTextBox(ByRef Container As Control, Name As String, LabelText As String, Top As Integer, Left As Integer, Value As String) As TextBox
    Dim tb As New TextBox With {.Name = Name, .Top = Top, .Left = Left, .Text = Value}
    Dim lbl As New Label With {.Name = Name & "_lbl", .Top = Top, .Left = Left - 150, .Text = LabelText}
    Container.Controls.Add(lbl)
    Container.Controls.Add(tb)
    Return tb
End Function

''' <summary>
''' Function for creating a button and adding it to a control
''' </summary>
''' <param name="Container">The container control to add the button to</param>
''' <param name="Name">The Name (Id) of the Button (must be unique)</param>
''' <param name="Text">The Text of the Button</param>
''' <param name="Top">The Top (y) position of the Button</param>
''' <param name="Left">The Left (x) position of the Button</param>
''' <returns></returns>
Private Function AddButton(ByRef Container As Control, Name As String, Text As String, Top As Integer, Left As Integer) As Button
    Dim btn As New Button With {.Name = Name, .Text = Text, .Top = Top, .Left = Left, .Visible = True, .AutoSize = True}
    Container.Controls.Add(btn)
    Return btn
End Function

''' <summary>
''' A click handler for our Button
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub button_Click(sender As Object, e As EventArgs)
    Dim tb_Name As TextBox = Panel1.Controls.Find("tb_Name", False)(0)
    Dim tb_EmailAddress As TextBox = Panel1.Controls.Find("tb_EmailAddress", False)(0)
    MessageBox.Show("Name: " & tb_Name.Text & "  Email Address: " & tb_EmailAddress.Text)
End Sub

''' <summary>
''' A sub for building our form
''' </summary>
Private Sub BuildForm()
    ' Clear existing controls
    ' This is only really needed in an ASP.NET solution where
    ' you are re-rendering the controls in the PreRender
    ' event because things have changed since the OnInit event.
    ' Although, if you need to change the form based on what
    ' was put into it (like a dynamic questionnaire) then this would
    ' also be applicable in a WinForms scenario.
    Panel1.Controls.Clear(True)
    ' Create a "Name" textbox
    AddTextBox(Panel1, "tb_Name", "Your Name", 10, 200, "")
    ' Create an "EmailAddress" textbox
    AddTextBox(Panel1, "tb_EmailAddress", "Your EmailAddress", 40, 200, "")
    ' Create a button to Save Changes
    Dim SaveButton As Button = AddButton(Panel1, "btn_Save", "Save Changes", 70, 200)
    ' Add a handler to the button click event
    AddHandler SaveButton.Click, AddressOf button_Click
End Sub

''' <summary>
''' Build the form as soon as it's shown
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    BuildForm()
End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM