Assembly assembly = Assembly.LoadFile(Application.StartupPath + "\\myapp.exe"); object newForm = assembly.CreateInstance(UserNavBarItem.menuEvent); if (newForm != null) { newItem.LinkClicked += (sender, e) => PublicService.OpenForm((Form)newForm, this); }
newItem.LinkClicked += (sender, e) => PublicService.OpenForm((Form)newForm, this)事件只能在第一次点击时成功,关闭窗口后再次点击提示打开已成不存在的对象。
请问这种方法该如何处理。
这种情况经常会发生的,因为在newForm存在的情况下,加了newItem的LiinkClicked事件,
但等到newForm已经被关闭的时候,这个事件依然是存在的,这时候,你不经判断就去使用PublicService.OpenForm((Form)newForm,this);肯定会出错的。
有N种方法可以避免,一种是你在LinkClicked事件中再判断一下,如果newForm is null,直接跳出。
或者你也可以在PublicService.OpenForm这里面进行判断,PublicService.OpenForm((Form)newForm, this);这样写感觉有点不舒服,
PublicService.OpenForm(newForm, this);这样会好一点。当然,见仁见智。
另外的,就是在newForm关闭或是销毁事件中,注销newItem.LinkClicked事件的Handler。
解决的思路正如您所说,先判断再进行!
newForm关闭后就已经销毁了,你要再运行一次 assembly.CreateInstance(UserNavBarItem.menuEvent) 才行呀。
问题是如此,已解决,谢谢提醒!