.net WinForms-如何设置对非模式表单事件的“订阅”?

.net WinForms-如何设置对非模式表单事件的“订阅”?,.net,vb.net,winforms,.net,Vb.net,Winforms,我有一个数据库驱动的多用户vb.net WinForms应用程序,它为用户提供日历/日程安排界面。用户可以同时编辑日历上的多个约会,从而打开编辑约会表单的一个、多个或没有实例 在应用程序的其他地方,我有各种搜索功能,可以显示事件列表,包括当前正在编辑的事件。如果编辑、移动或删除了其中一个事件,则搜索表将过时 当我打开搜索功能时,我希望能够订阅所有打开的编辑约会表单生成的事件。然后,如果修改/删除了搜索界面中显示的约会,则搜索表会自动刷新 在vb.net中是否有一些最佳实践或机制来启用此功能 具体

我有一个数据库驱动的多用户vb.net WinForms应用程序,它为用户提供日历/日程安排界面。用户可以同时编辑日历上的多个约会,从而打开编辑约会表单的一个、多个或没有实例

在应用程序的其他地方,我有各种搜索功能,可以显示事件列表,包括当前正在编辑的事件。如果编辑、移动或删除了其中一个事件,则搜索表将过时

当我打开搜索功能时,我希望能够订阅所有打开的编辑约会表单生成的事件。然后,如果修改/删除了搜索界面中显示的约会,则搜索表会自动刷新

在vb.net中是否有一些最佳实践或机制来启用此功能

具体关注事项:

我需要一种方法来列出或跟踪所有打开的编辑约会表单 搜索界面已打开时,可以打开其他编辑约会表单。 如果我的搜索界面关闭,我将需要取消订阅这些visual basic事件,以便不会出现内存泄漏或意外行为。
澄清:我认为正确的处理方法是处理表单关闭或编辑约会表单中生成的事件。需要以某种方式处理此visual basic事件,以便它可以通知订阅表单可能发生了更改。

我在C/WPF中处理此事件的方式是在我的编辑表单上放置一个事件,如下所示:

    public event EventHandler<AppointmentSavedEventArgs> AppointmentSavedEvent;
在我的例子中,我的搜索或列表有一个打开编辑屏幕的按钮。当我打开编辑屏幕时,我附加保存的事件

            // Note this is a user control shown using a generic window manager... don't get hung up on that part
            ucAppointmentEdit ucAE = new ucAppointmentEdit(((Appointment)(dataGrid.SelectedItem)));
            ucce.AppointmentSavedEvent += ucAE_AppointmentSavedEvent;
所以当我捕捉到保存的事件时,我只是刷新列表

如果有多个屏幕启动编辑部分,则可能需要考虑循环查找任何需要更新的列表或搜索窗口


很抱歉,没有时间转换为Winforms,但这应该可以让您继续。。。如果我正确理解了你的问题

许多只在VB中编写代码的人永远不会意识到事件只是管理和调用委托的语法糖衣。如果您要声明一个,这个概念就变得显而易见了

话虽如此,一个可能的解决方案是只将回调委托传递给EditAppointment表单,该表单在表单关闭时被调用,而不是使用典型的事件订阅模型

Public Class EditAppointment : Inherits Form
    Public Delegate Sub OnCloseCallBack(ea As EditAppointment)
    Private callBack As OnCloseCallBack
    Public Sub New()
        InitializeComponent()
    End Sub
    Public Sub New(onCloseCallBackMethod As OnCloseCallBack)
        Me.New()
        Me.callBack = onCloseCallBackMethod
    End Sub
    Protected Overrides Sub OnClosed(e As EventArgs)
        MyBase.OnClosed(e)
        callBack.Invoke(Me)
    End Sub
End Class
然后,示例用法可以是:

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim ea As New EditAppointment(AddressOf EditAppointmentClosed)
        ea.Show()
    End Sub

    Private Sub EditAppointmentClosed(ea As EditAppointment)
        ' do something on EditAppointment closed
    End Sub
End Class

而不是一个以表单为中心的应用程序,考虑类,我不知道这意味着什么。我的理解是所有形式都是类。我可以用什么方式使用类来解决我的问题?是的,所有的表单都是类-它们的专业是与用户交互。约会类可以包含数据和对其进行操作的逻辑,而不是您没有提到订阅各种表单事件以执行某些操作的内容。如果需要的话,它可以告诉Form87将foo更改为bar。我不确定,但我认为您在帖子中使用的术语event既指可以取消的会议等日历事件,也指调用某些代码操作的类事件。这使得你很难辨别你的目标。如果这是正确的,您可以编辑您的帖子来澄清这一点吗?我指的是Visual Basic AddHandler/RemoveHandler/WithEvents感知中的一个事件。当我把某件事称为约会而不是事件时,我尽量说得具体一些。其思想是,当我的编辑约会表单关闭时,它将发出一个事件,该事件可能会被另一个表单捕获。问题是可以有多个编辑约会表单,所以我不能将它们定义为WithEvents。我可以将表单添加到集合中,并在创建表单时向其添加处理程序,但这似乎存在大量未处理事件的可能性。这似乎非常有趣,但我无法将C转换为VB.NET。我不明白你到底在干什么这太棒了。我知道我如何准确地使用它。非常感谢。
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim ea As New EditAppointment(AddressOf EditAppointmentClosed)
        ea.Show()
    End Sub

    Private Sub EditAppointmentClosed(ea As EditAppointment)
        ' do something on EditAppointment closed
    End Sub
End Class