2016-09-18 3 views
-1

私は、カレンダー/スケジューリングインターフェイスをユーザーに提示するデータベース駆動のマルチユーザーvb.net WinFormsアプリケーションを持っています。ユーザーは、カレンダー上の複数の予定を同時に編集することができ、したがって、「予定の編集」フォームの1つ、多くのインスタンスを開くことはできません。WinForms - 非モーダルフォームイベントへの "サブスクリプション"を設定するには?

私はさまざまな検索機能を備えていますが、現在編集中のものも含めて、イベントのリストを表示することがあります。これらのイベントの1つが編集、移動、または削除された場合、検索テーブルは古くなります。

検索機能を開くと、開いているすべての[予定の編集]フォームで生成されたイベントに「購読する」ことができます。次に、検索インタフェースに表示された予定が変更/削除されると、検索テーブル自体が更新されます。

有効にするには、vb.netにいくつかのベストプラクティスまたはメカニズムがありますか?

具体的な懸念事項:

  • 私は検索インターフェイスがすでに開いている間
  • 追加「の編集予定」フォームが開くことがあり、開いているすべての「編集予定の」フォームのトラックをリストまたは維持するための方法が必要です。
  • 検索インターフェイスを閉じると、これらのビジュアルな基本イベントの購読を解除して、メモリリークや予期しない動作がないようにする必要があります。

明確化:私はこれを処理する適切な方法は、「FormClosed」または「編集予定」フォームから生成されたイベントを処理することであると考えています。このビジュアルベーシックイベントは、(潜在的に)変更が発生したことを購読フォームに通知できるように、何らかの方法で「処理」する必要があります。

+0

ではなく、フォーム・セントリックアプリ、クラス – Plutonix

+0

私は、この文脈で何を意味するのかわからないを考えてみましょう。私の理解は、すべてのフォームがクラスであるということです。私の問題を解決するためにどのようにクラスを使用できますか? –

+0

はい、すべてのフォームはクラスです* *その専門はユーザーと対話しています。さまざまなフォームイベントを購読する何か(何も言及していない)ではなく、アポイントメントクラスにはデータとそれに作用するロジックが含まれています。それが必要ならば、 "foo"を "bar"に変更するようにForm87に指示することができます。 – Plutonix

答えて

1

だけVBのコードのイベントは単なる構文であることを理解しません多くの人...屋が軌道に乗る必要があります申し訳ありませんデリゲートを管理し呼び出すための砂糖コーティング。 VB Custom Eventを宣言した場合、この概念は明白になります。

これは、典型的なイベントサブスクリプションモデルを使用する代わりに、フォームクロージャで呼び出される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 
+0

これは素晴らしいです。私はこれをどのように正確に使うことができるかを見ています。ありがとうございました! –

1

私はC#/ WPFでこれを処理する方法はこれのように私の編集フォーム上のイベントを入れていることです:アイテムが必要な場合、私はイベントや火災への加入を確認するに保存されている場合

public event EventHandler<AppointmentSavedEventArgs> AppointmentSavedEvent; 

私の場合、「検索」または「リスト」には編集画面を開くボタンがあります。編集画面を開くと、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への翻訳はできません。私はあなたが実際にやっていることを理解していません。 –

関連する問題