View Full Version : 如何注册动态添加的程序集中的控件的事件。和程序集如何得到主窗体的某些参数


boyyao
04-02-2007, 08:38 AM
问题1:

假设。我有一个assembly 其中有一个控件有如下的代码来创建一个事件:
public delegate void DelFiles(string[] files);
public event DelFiles DelFileEvent;

目的是要把files这个变量传递给调用它的主窗体。


主窗体中用如下方法来加载这个usercontrol:
Assembly ass = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory +
path + ".Dll");
UserControl obj = (UserControl)ass.CreateInstance(className);

请问我如何在主窗体中注册这个assembly 中的DelFileEvent事件。从而得到files的值?




问题2:
也是一个主窗体。还有一个用反射添加的Assembly。我要如何操作才可以让动态添加的Assembly可以访问主窗体的某些变量?也是通过事件么?我的想法是 子窗体触发一个事件。然后主窗体得到这个事件后主动
向子窗体传递参数。不知道是否正确的做法?

v-jicwan@prcvap.microsoft.com
04-03-2007, 08:56 AM
您好:

欢迎您到MSDN新闻组提交问题,我们将会尽力帮助您。

针对您的两个问题,我想谈一下我的想法,仅供您参考:
1.动态加载程序集中控件的事件处理,您可以参考下述代码:
Assembly ass = Assembly.LoadFro(AppDomain.CurrentDomain.BaseDirectory + path + ".Dll");
UserControl obj = (UserControl)ass.CreateInstance(className);
obj.DelFileEvent += new DelFiles(DelFiles_Handler);

private void DelFiles_Handler(string[] files){}

从DLL中动态加载窗体,您也可以参考一下这个Blog:
http://www.cnblogs.com/Infinity/archive/2006/10/26/540347.html

2.关于动态加载的子窗体与主窗体的参数传递,你可以考虑使用事件的方式,我想通过子窗体的属性访问应该也是可以的。

Jasson Wang
在线技术支持工程师
微软全球技术支持中心
---------------------------------------------------------------------------------------
我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.

回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益。
---------------------------------------------------------------------------------------
本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。

boyyao
04-03-2007, 07:42 PM
你好。请问这样直接注册事件可以么?DelFileEvent 是Dll中的事件名称。这个dll是动态加载的。怎么能直接注册?

obj.DelFileEvent += new DelFiles(DelFiles_Handler);

<v-jicwan@prcvap.microsoft.com> wrote in message
news:10ea96ba-8edf-4cfc-bb9f-a5077b5aa01c@ms.shabap01.publicpsswebcat...
> 您好:
>
> 欢迎您到MSDN新闻组提交问题,我们将会尽力帮助您。
>
> 针对您的两个问题,我想谈一下我的想法,仅供您参考:
> 1.动态加载程序集中控件的事件处理,您可以参考下述代码:
> Assembly ass = Assembly.LoadFro(AppDomain.CurrentDomain.BaseDirectory +
> path + ".Dll");
> UserControl obj = (UserControl)ass.CreateInstance(className);
> obj.DelFileEvent += new DelFiles(DelFiles_Handler);
>
> private void DelFiles_Handler(string[] files){}
>
> 从DLL中动态加载窗体,您也可以参考一下这个Blog:
> http://www.cnblogs.com/Infinity/archive/2006/10/26/540347.html
>
> 2.关于动态加载的子窗体与主窗体的参数传递,你可以考虑使用事件的方式,我想通过子窗体的属性访问应该也是可以的。
>
> Jasson Wang
> 在线技术支持工程师
> 微软全球技术支持中心
> ---------------------------------------------------------------------------------------
> 我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.
>
> 回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益。
> ---------------------------------------------------------------------------------------
> 本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。

绉﹂鎰忓姩
04-04-2007, 12:12 PM
绗竴涓棶棰榲-jicwan鑰佸笀鍥炵瓟鐨勫凡缁忓緢娓呮浜
绗簩涓棶棰
瀹為檯鏄竴涓帶鍒跺弽杞殑闂(IoC 鎴朌I)
鍋氭硶:

浣犵殑UserControl
{
private IFormController form;
public void setIFormController(IFormController _form)
{
_form = form;
}

public void dobusiness()
{
form.setPrice(10);
}

..................

}

涓涓娊璞$被
public interface IFormController
{

public int getPrice();
public void setPrice(int price);

}

浣犵殑Form :Form, IFormController
{
private int maxprice;

public int getPrice()
{
return maxprice;
}
;
public void setPrice(int price)
{
maxprice = maxprice>=price?maxprice:price;
}

....
UserControl.setIFormController(this);

....
}

瑕佹敞鎰忎袱涓棶棰:
1 鍙互鐩存帴浠巙serControl鐨刾arent寰楀埌object,杞瀷鎴怷XXForm;
杩欐牱涓嶅畨鍏,鑰屼笖闄愬埗浜(纭紪鐮)鍏蜂綋鐨凢orm,鍥犱负瑕佽闂叾浠栧彉閲,涓嶈兘鐩存帴鐢‵orm.
杩樺鏄撳紩璧烽棶棰2.
2 鍙嶅悜鎺у埗鐨勪笉鑳芥湁UI,鍚﹀垯鍙兘寰幆寮曠敤


浠g爜閮芥槸鐩存帴鍦ㄦ枃鏈鍐欑殑,姣旇緝涔.



鈥渂oyyao鈥濈紪鍐欙細

> 闂1锛
>
> 鍋囪銆傛垜鏈変竴涓猘ssembly 鍏朵腑鏈変竴涓帶浠舵湁濡備笅鐨勪唬鐮佹潵鍒涘缓涓涓簨浠讹細
> public delegate void DelFiles(string[] files);
> public event DelFiles DelFileEvent;
>
> 鐩殑鏄鎶奻iles杩欎釜鍙橀噺浼犻掔粰璋冪敤瀹冪殑涓荤獥浣撱
>
>
> 涓荤獥浣撲腑鐢ㄥ涓嬫柟娉曟潵鍔犺浇杩欎釜usercontrol锛
> Assembly ass = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory +
> path + ".Dll");
> UserControl obj = (UserControl)ass.CreateInstance(className);
>
> 璇烽棶鎴戝浣曞湪涓荤獥浣撲腑娉ㄥ唽杩欎釜assembly 涓殑DelFileEvent浜嬩欢銆備粠鑰屽緱鍒癴iles鐨勫硷紵
>
>
>
>
> 闂2锛
> 涔熸槸涓涓富绐椾綋銆傝繕鏈変竴涓敤鍙嶅皠娣诲姞鐨凙ssembly銆傛垜瑕佸浣曟搷浣滄墠鍙互璁╁姩鎬佹坊鍔犵殑Assembly鍙互璁块棶涓荤獥浣撶殑鏌愪簺鍙橀噺锛熶篃鏄氳繃浜嬩欢涔堬紵鎴戠殑鎯虫硶鏄 瀛愮獥浣撹Е鍙戜竴涓簨浠躲傜劧鍚庝富绐椾綋寰楀埌杩欎釜浜嬩欢鍚庝富鍔
> 鍚戝瓙绐椾綋浼犻掑弬鏁般備笉鐭ラ亾鏄惁姝g‘鐨勫仛娉曪紵
>
>
>

v-jicwan@prcvap.microsoft.com
04-05-2007, 02:54 AM
您好:

通过Reflector调用用户自定义控件的方法如下:
Assembly ass = Assembly.LoadFrom(@"d:\Test.Dll");
Type t = ass.GetType("Test.UserControl");
object obj = Activator.CreateInstance(t);
UserControl uc = (UserControl)obj;
uc.DelFileEvent += new DelFiles(DelFiles_Handler);
private void DelFiles_Handler(string[] files){}

关于通过Reflector来调用程序集中的事件,请参考下述链接:
http://wayfarer.cnblogs.com/archive/2004/07/22/26453.html
http://www.rainsts.net/article.asp?id=393

希望能够对您有所帮助。

Jasson Wang
在线技术支持工程师
微软全球技术支持中心
---------------------------------------------------------------------------------------
我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.

回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益。
---------------------------------------------------------------------------------------
本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。

v-jicwan@prcvap.microsoft.com
04-06-2007, 02:33 AM
您好:

您的问题解决了吗?还有什么需要我们帮助的吗?

Jasson Wang
在线技术支持工程师
微软全球技术支持中心
---------------------------------------------------------------------------------------
我们的服务时间:周一至周五9:00-18:00(节假日除外)。我们将在两个工作日(48小时)内提供初始回应,并和您一起研究并解决问题。更多微软新闻组技术支持信息,请访问:http://support.microsoft.com/gp/newsgroupsupport/zh-cn.

回帖时,请在您的新闻组阅读器中使用“回复组(Reply to Group)”,这将帮助其他用户从您的提问中获益。
---------------------------------------------------------------------------------------
本贴子以”现状”提供且没有任何担保,同时也没有授予任何权利。