簡體   English   中英

C#事件分發

[英]C# event distribution

我有一個帶模塊/可停靠子表單的WinForm(WeifenLuo)。 在表單之間傳遞事件/信息的最佳做法是什么?

例如:我希望SubForm1中的“SelectionChanged”事件更改SubForm2中突出顯示的內容。 問題是,可能沒有SubForm2-Tabs,一個或多個實例。

目前,如果用戶請求新的SubForm實例,則調用這樣的函數:

    private void toolStripMenuItemSubForm1_Click(object sender, EventArgs e)
    {
        SubForm1 subForm1 = new SubForm1();
        subForm1.Show(dockPanelMain, DockState.Document);
    }

除了dockPanelMain.Contents之外,MainForm沒有所有子dockPanelMain.Contents記錄。

編輯:我知道表單如何相互交互以及事件本身如何工作。 我的問題是來自SubForm1的事件可以改變不同的其他子表單,但它們可能不存在於給定的時間點,或者可能存在多個實例,我不希望通過MainForm為每個單個事件鏈接它。

恕我直言,你采取了錯誤的方式

一位老師過去常常以這種方式向我提出這樣的問題:“首席執行官並不一定知道每個為他工作的人。但是,每個工人都會知道它的首席執行官”(原諒這句話,它是(草率地)翻譯過來的)

這也可以應用於您的問題:

將父實例傳遞給將負責保留此實例的子項,並將其存入他們應該監聽的事件中。

這樣,你的父班只需要照顧好事件,孩子們就會做更新自己的工作

編輯:

要在dockpanel的內容類之間工作,它基本上是一回事。

將dockpanel的Contents屬性傳遞給子類。 由於它是一個集合(因此也是一個引用類型),子類總是可以訪問集合的最新“版本”。

您只需要通過過濾此集合來獲取您感興趣的所有實例

過濾示例(我可能在最后錯過了演員表):

IEnumerable<SubForm2> sf2 = dockContents.Where(sf => sf is SubForm2)

我建議將包含事件/委托的Event類傳遞給Subform構造函數。 每個子表單都可以訂閱在適當的時間引發的事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM