2016-09-18 58 views
-1

我有一个数据库驱动的多用户vb.net WinForms应用程序,它向用户提供日历/日程安排界面。用户可以同时在日历上编辑多个约会,因此可以打开“编辑约会”窗体的一个,多个或者没有实例。WinForms - 如何为非模态表单事件设置“订阅”?

在应用程序的其他地方,我有各种搜索功能,可能会显示事件列表 - 包括可能正在编辑的列表。如果其中一个事件被编辑,移动或删除,搜索表将失效。

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

在vb.net中有一些最佳实践或机制来启用它吗?

具体问题:

  • 我需要一种方法来列出或跟踪所有打开的“编辑约会”的形成,而搜索界面已经打开
  • 附加“编辑约会”的形式可以被打开。
  • 如果我的搜索界面关闭,我将需要取消订阅这些可视化基本事件,这样我就没有内存泄漏或意外行为。

澄清:我认为正确的方式来处理,这是通过处理“FormClosed”或从“编辑约会”的形式生成的事件。这个视觉基本事件需要以某种方式“处理”,以便它可以通知订阅表单发生更改(可能)发生。

+0

而不是形式为中心的应用程序,考虑类 – Plutonix

+0

我不知道是什么,在这里指。我的理解是,所有的形式都是阶级。我可以用什么方式来解决我的问题? –

+0

是的所有形式都是类 - *他们的*专业是与用户交互。而不是什么(你没有提到什么)订阅各种形式的事件来做事,约会类可以包含数据和逻辑来对其采取行动。如果需要的话,它可以告诉Form87将“foo”改为“bar”。 – Plutonix

回答

1

许多谁代码只在VB中从来没有意识到,事件只是一个语法用于管理和调用代表的糖衣。如果你要申报VB Custom Event,这个概念就变得很明显。

就这样说,一种可能的解决方案是仅将一个回调委托传递给在表单闭包上调用的EditAppointment表单,而不是使用典型的Event-subscription模型。

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 
+0

这真是太棒了。我明白我可以如何精确地使用它。谢谢! –

1

我在C#中处理这个问题的方法/ WPF是已经把一个事件我的编辑表单,像这样:

public event EventHandler<AppointmentSavedEventArgs> AppointmentSavedEvent; 

当物品被保存我检查订户对事件和火灾如果需要的话:

    if (this.AppointmentSavedEvent != null) 
        { 
         this.AppointmentSavedEvent(this, new AppointmentSavedEventArgs(theAppointment.AppointmentID)); 
        } 

在我的情况下,我的“搜索”或“列表”有一个按钮,打开编辑屏幕。当我打开编辑屏幕时,我附加了Saved事件。

  // 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,不过这应该让雅去......(如果我理解正确你的问题)

+0

这看起来真的很有趣,但我无法将C#翻译成VB.NET。我不明白你在做什么。 –