【问题标题】:Adding parameters to an AddHandler event in VB.NET 2008在 VB.NET 2008 中向 AddHandler 事件添加参数
【发布时间】:2013-01-07 01:01:03
【问题描述】:

我阅读了所有关于向 AddHandler 事件添加参数的当前帖子,但我无法将它们应用于我的情况。

在 VB.NET 2008 的 MDI 程序中,我有一个模块 QuickSaleModule,它调用多个模式数据输入表单来向表中添加订单。发生这种情况时,会打开一个带有网格的表单,其中显示表中的所有订单。此表单网格已与订单模块分开打开,因此表单和模块都不会相互依赖,尽管它们是解决方案中同一项目的一部分。订单网格来自 SQL 查询。

在模块中我定义了简单事件:

公共事件 RefreshGrid()

我在模块中的某个点提出它 - 在输入并保存订单之后:

RaiseEvent RefreshGrid()

现在以我在加载事件中的顺序网格形式:

AddHandler QuickSaleModule.RefreshGrid, AddressOf RefreshMyGrid

对于 RefreshMyGrid() 处理程序,我有:

Public Sub RefreshMyGrid()
     DoReturnSetup() – a sub in the grid form
     removeHandler QuickSaleModule.RefreshGrid, AddressOf RefreshMyGrid
End Sub

这会调用 SQL 查询以使用新顺序刷新网格表单。在退出之前,可能会通过 quickSaleModule 添加许多订单,因此每次输入新订单时我都会调用该事件,因此在表单关闭时删除处理程序没有意义。然而,这是我创建的第一个 AddHandler 事件。

这是我的问题:

  1. 最重要。如何将模块中的 orderID 作为参数传递给网格表单中的 RefreshMyGrid 处理程序?我想我可以使用全局变量,但我更喜欢更好的东西。现在作为一个事件新手,我似乎无法使用其他调用事件的方法。当我退出从网格表单调用的数据输入表单时,我使用 with 事件(带参数)。但在这种情况下,正如我所说,没有任何联系。

  2. “removeHandler QuickSaleModule.RefreshGrid, AddressOf RefreshMyGrid”的位置是否正确?还是应该是关闭事件的形式。

  3. 最后,RefreshMyGrid 是否需要公开?

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    要将参数传递给事件,您应该遵循.NET 事件标准,将两个参数传递给事件:发送者和事件参数。

    为了传递可用数据,您需要创建自己的继承自 EventArgs 的类,然后将您的属性添加到其中。

    例如,定义参数类:

    Public Class RefreshGridEventArgs
        Inherits EventArgs
    
        Public Property OrderId As Integer
    
        Public Sub New(wOrderId As Integer)
            MyBase.New()
    
            Me.OrderId = wOrderId
        End Sub
    End Class
    

    然后重新定义事件:

    Public Event RefreshGrid(sender As Object, e As RefreshGridEventArgs)
    

    接下来,重新定义此事件的引发方式:

        ' Replace 1 with the actual order id
        RaiseEvent RefreshGrid(Me, New RefreshGridEventArgs(1))
    

    最后,在事件处理程序中,使用e.OrderId 执行相应的逻辑。

    回答您的其他问题:

    2) 删除事件中的处理程序意味着该事件只会引发一次,这通常不是您想要的(在某些情况下这是有道理的,但这似乎不是一个)。当表单关闭时也不需要删除事件处理程序,因为它包含在表单中,但是如果表单由于某种原因实际上没有关闭(有些东西挂在上面),这样做也没有什么坏处在某处引用它)。

    3) RefreshMyGrid 不需要公开,除非外部调用者调用它是合法的。

    【讨论】:

    • 谢谢。我已经输入了代码进行测试,但一个问题是我在“我”无法引用的模块内引发事件,所以我该怎么做:RaiseEvent RefreshGrid(??, New RefreshGridEventArgs(1))
    • 在这种情况下,只需发送 Nothing 作为发件人。
    • 好吧,我刚刚删除了第一个参数,只是在定义、raiseevent 和处理程序中使用了 REfreshGridEventArgs。有效。我发现没有什么比这个更清晰和直接的答案了。这是一个简单的事件,但直到现在我还没有很好地回答这个问题。精彩的。谢谢你。
    • 很高兴我能提供帮助并欢迎使用 stackoverflow。请记住,如果某个答案解决或有助于解决您的问题,您应该单击答案旁边的复选标记,以向问题的未来查看者表明这是对您有用的答案。此外,一旦您有足够的声望,您还应该通过单击答案旁边的向上箭头来“投票”该答案。谢谢!
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多