2013-11-04 27 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

感谢您的支持 –