【问题标题】:Unable to handle event in another class无法处理另一个类中的事件
【发布时间】:2015-05-20 22:02:28
【问题描述】:

我对 Visual Basic 有点陌生,想知道是否可以根据表单中的操作触发类中的事件。

所以以下是我的问题: 我有一个名为 Main 的表单,带有一个名为 picPID 的图片框 还有一个叫 add_new 的类

我想做的是: 单击鼠标右键时,事件处理的代码将放在名为 add_new 的类中

我想我可以通过以下方式声明它:

Sub meMouseDown(sender As Object, e As MouseEventArgs) 处理 Main.picPID.MouseDown

但我收到一个错误,说我必须用Events 声明它,我试图将图片框声明为:

Public shared withEvents as picturebox

但它没有帮助,有什么建议吗?将代码放在 Main 窗体中没有问题,但会导致大量代码,所以我希望将其拆分。

【问题讨论】:

  • 不确定这是否是个好主意。将表单的 UI 功能拆分为单独的类会使它们相互依赖。它似乎违反了 OOP 的一些基本原则。也许,如果你想为 PictureBox 功能创建可重用的代码,你应该尝试扩展 PictureBox 类来创建你的 PictureBox 派生类
  • Handles Main.picPID.MouseDown 是一个非常讨厌的 VB.NET 陷阱,您必须学会避免。 Main 是一个类型名称,但需要一个对象引用。 VB.NET 允许您在您的代码中使用Main 时您真的是指一个对象,这太宽容了。在这里行不通。 Anyhoo,你必须在这里使用 AddHandler 语句。

标签: vb.net


【解决方案1】:

所以你有一个带有事件处理程序的类:

Public Class add_new

    Public Sub PictureBoxEventHandler(sender As Object, e As MouseEventArgs)
        'Your Implementation
    End Sub

End Class

那么你需要在包含图片框的表单中创建一个此类的实例:

Public Class Form1

    Private add_New_Command As New add_new ' hold a reference to the command

    'constructor
    Public Sub New()

        InitializeComponent()

        ' and add the handler to the event of the picture box ... hook it up
        AddHandler PictureBox1.MouseDown, AddressOf add_New_Command.PictureBoxEventHandler

    End Sub

End Class

【讨论】:

  • 这是怎么做的。但我宁愿听从@Steve 的建议,并在参与大事之前复习 OOP 设计原则。有很多关于这个主题的书,我建议你买一本……好东西
  • 很好的解决方案,但也要确保删除处理程序。否则你的记忆可能无法处理并且会变得很糟糕......
  • @436f6465786572 应该在没有引用 Form1 的实例时进行垃圾收集...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多