0

我正在制作一个程序,它可以动态地将对象(例如按钮或复选框)添加到表单中。

对于每个实例,都会添加一个处理程序,以便为每个对象的 Click 事件调用某个函数。

现在,当调用该处理程序时,如何操作触发 Click 事件的对象?Sender 对象在这里没用,因为我无法更改位置、文本、父级,什么都没有。

由于对象是动态创建的,不幸的是它们的实例名称总是相同的,因此我不能简单地执行 button1.Text = "Button 1" 之类的操作。

我真的不想为每种类型创建一个新的子例程,因为将执行的操作是相同的......那么我该如何操作这些对象呢?

最后统计一下,有 27 种不同的对象类型正在被操纵,而我想由单个子操纵。

谢谢您的帮助!

4

3 回答 3

4

听起来发送者就是您想要的,因为这将是触发 Click 事件的对象。您只需要找出一种将其转换为所需类型的方法。

如果您只是在操作位置、文本和父级,那么投射到 Control 就足够了:

Dim c As Control = CType(sender, Control)

否则,您将需要转换为特定类型,这意味着每种类型需要不同的例程。

另一种选择是打开后期绑定,我相信在VB中是Option Strict Off。然后,即使没有强制转换,您也可以引用控件属性——.NET 将在运行时查找该属性(并且,请注意,如果该属性不存在,则会引发异常)。

于 2009-10-15T23:51:10.983 回答
3

将发件人投射到Control& 你可以做你想做的事(你所有的对象都是控件吗?)

于 2009-10-15T23:50:12.717 回答
2

如果您知道调用处理程序的输入类型,那么您可以使用类型转换来解决您的问题:

Sub General_OnClick(ByVal sender As Object, ByVal e As EventArgs)
    Dim b As Button = sender
    b.Text = "Hello World!"
End Sub

如果你不这样做,你看起来不像,你可以尝试转换为Control,这可能会给你足够的控制权,这取决于你需要做什么。如果没有,您可以随时执行以下操作:

Sub General_OnClick(ByVal sender As Object, ByVal e As EventArgs)
    If TypeOf sender Is Button Then
        Dim b As Button = sender
        b.Text = "Hello World!"
    Else If TypeOf sender Is TextBox Then
        Dim tb As TextBox = sender
        tb.Text = "Goodbye cruel world!"
    End If
End Sub

编辑:更新为翻译成 VB.Net

于 2009-10-15T23:48:42.123 回答