2013-11-04 147 views
0

我們可以將事件處理程序動態添加到某個類而無需創建對象實例嗎?動態事件無需創建實例

我的情況

從主要形式[0級]我打電話子表單[1級],這些子表單我能夠從主窗體中添加動態事件。但是從子表單我再次調用表單[級別2]。我無法從這個級別添加動態事件[級別2]。我不知道表單何時從第1級接到電話,它必須是按鈕點擊事件或任何其他事件。

下面的代碼不起作用,因爲在這裏需要一個實例FRM是一個實例

Dim frmLoad = New FormLoadEventHandler(AddressOf On_Load) 
t.GetEvent("Load").AddEventHandler(frm, frmLoad) 

我加載各個組件到一個單一的平臺,讓每一個人裝配有這麼多子的形式,從我的主我可以通過反射訪問初始表單。我的想法是使所有形式的字體都與我的平臺相同

+3

我可能失去了一些東西,但是這並沒有任何意義,我......沒有實例一個表格,不會引發任何事件。你的意思是沒有_reference_一個實例嗎?如果是這樣,那麼答案是否定的 - 但它的解決方法很簡單 - 只需將相關參考通過代碼傳遞到需要的地方(將'l2frm'傳遞給'l0frm'或反之亦然) – Basic

+0

我將單個程序集加載到單一的平臺,所以每個單獨的程序集都有來自我的主模塊的許多子表單,我可以通過反射訪問初始表單。我的想法是在我的平臺上調用所有形式的字體相同 –

+0

這聽起來不像一個乾淨的架構。 「單一平臺」是什麼意思?單個AppDomain /進程/ ???如果你有組裝的控制權,你不應該需要反思(99%的時間)。如果您沒有控制權,更改字體可能會導致問題(文本溢出時會發生什麼情況?)。只有當您處理未知類型時,反射纔有用 - 您的類型未知的原因是否存在? – Basic

回答

0

將主窗體的實例傳遞給2級窗體,並使用傳遞的引用添加事件處理函數。

0

怎麼樣剛好路過的字體中....

'Modify a form so the constructor takes a font 

Private Property CustomFont As Font 
Public Sub New(FontToUse As Font) 
    ' This call is required by the designer. 
    InitializeComponent() 

    'Store the font for later use  
    Me.CustomFont = FontToUse 

    'Use the font on all controls as appropriate here 
End Sub 


Public Sub MakeChildren() 
    'Create a child form and tell it which font to use 
    Dim ChildForm As New ChildForm(CustomFont) 
    ChildForm.Show() 
End Sub 

等等等等

+0

基本...我無法編輯代碼,我正在使用反射來打開我的主窗體中的程序集,如插件模塊。 –

+0

好吧,暫時擱置這是一個非常糟糕的主意(你不知道你對字體的改變會使表單無法使用),你必須使用反射來讀取用於存儲引用的內部變量每種形式 - 假設參考被保留。如果不這樣做,你可以使用Win32 API來查找進程的所有窗口並獲取它們的句柄... http://stackoverflow.com/a/79205/156755它會工作,但它很臭,真的你應該得到插件設計師以標準方式開發他們的模塊,允許您訪問您需要的文件 – Basic

+0

感謝您的支持 –