【问题标题】:Dynamically add code at runtime in VB(.NET)在 VB(.NET) 中在运行时动态添加代码
【发布时间】:2015-05-06 11:16:26
【问题描述】:

我想在 VB(.NET) 中制作一个程序,在该程序中,每次单击一个按钮都会向用户窗体添加一个或多个新按钮。这个过程应该工作无数次。然后按钮将调用一个公共子,传递一个单独的变量,以便代码知道它是从哪个按钮调用的(因此:知道该做什么)。

我学习了如何使用Button = new Buttoncontrols.add(Button) 代码在运行时创建按钮。我还设法使用WithEventsAddHandler 将新代码传递给按钮。但直到现在,我总是需要在程序运行之前准备好代码。 IE。我需要提前知道按钮的名称并准备好代码。

有没有办法动态创建在运行时截断的代码,以指向预先存在的代码?

我给你一个简单的例子:

WithEvents NewButton01 As New Button
WithEvents NewButton02 As New Button
WithEvents NewButton03 As New Button

Private Sub AddNewButton_Click() Handles AddNewButton.Click

    NewButton01.Location = New Point(10, 10)
    NewButton01.Text = "01"
    Controls.Add(NewButton01)

    NewButton02.Location = New Point(50, 50)
    NewButton02.Text = "02"
    Controls.Add(NewButton02)

    NewButton03.Location = New Point(90, 90)
    NewButton03.Text = "03"
    Controls.Add(NewButton03)

End Sub

Private Sub NewButton01_click() Handles NewButton01.Click
    Call MessageBox(1)
End Sub

Private Sub NewButton02_click() Handles NewButton02.Click
    Call MessageBox(2)
End Sub

Private Sub NewButton03_click() Handles NewButton03.Click
    Call MessageBox(3)
End Sub

Private Sub MessageBox(flag As Integer)
    MsgBox("You activated button number " & flag)
End Sub

如您所见,这是一种非常不专业的编码方式。另外,我想保持创建的按钮数量无限,所以我不能使用这段代码。我宁愿让 VB 每次单击“AddNewButton”时都创建一个新按钮,并编写一个引用 Private Sub MessageBox 的代码或最后可能的任何代码。

我是 VB.Net 的新手,所以如果示例中包含任何让您颤抖的内容,请原谅我。

非常感谢!

【问题讨论】:

    标签: vb.net button


    【解决方案1】:

    这样的事情可能会有所帮助:

        Private Sub AddNewButton_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim lastButtonPos As Integer = 10
            For i = 1 To 3
                Dim NewButton As New Button
                NewButton.Location = New Point(lastButtonPos, lastButtonPos)
                NewButton.Text = "0" & i.ToString
                NewButton.Name = i.ToString
                AddHandler NewButton.Click, AddressOf Button_click
                Controls.Add(NewButton)
                lastButtonPos = lastButtonPos + 40
            Next
    
        End Sub
    
        Private Sub Button_click(ByVal sender As Object, ByVal e As EventArgs)
            Dim clickedButton As Button = CType(sender, Button)
            Dim clickedNumber As Integer = clickedButton.Name
            Call MessageBox(clickedNumber)
        End Sub
    
        Private Sub MessageBox(flag As Integer)
            MsgBox("You activated button number " & flag)
        End Sub
    

    【讨论】:

    • 您必须将 lastButtonPos 设为静态或将其设为类变量才能多次使用。我会改用 FlowLayoutPanel,然后只执行 FlowLayoutPanel1.Controls.Add(NewButton) 以便为您处理所有定位。
    • 是的,我同意实现可能会更好,但我想展示动态事件处理程序分配和事件处理程序中的类型转换。我记得当我意识到类型转换时是多么令人兴奋:D
    • 感谢代码!它确实有效,但我仍然需要了解那里发生了什么。我说对了吗:“sender”是一个变量,它告诉 Private Sub 从哪里执行。在这种情况下,“发送者”是 button1。现在你让“button1”变成一个按钮,并将它分配给新定义的按钮“clickedButton”?
    • CType 类型转换语句允许您将传入的对象转换为预期的类型,以便您可以使用它的属性和方法。您可以像这样测试类型: If TypeOf(sender) Is Button Then... before cast to button。如果需要,您还可以处理其他控件类型...
    • 那太好了,因为我可能会结束使用可点击的文本框而不是按钮,不确定......此外,Capellan 的提示也很棒。我确实必须考虑最终如何布局所有这些按钮,所以我也要看看 FlowLayoutPanel。谢谢!
    猜你喜欢
    • 2015-06-13
    • 2010-11-28
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多