我有一个时髦的问题,有一个解决方法,但我想保持代码尽可能相似。问题集中在我的用户控件的基类中的特定变量上,该变量可能为空,也可能不为空,并且它永远不应该为空。
基本上,我有许多带有单个基类的用户控件,它们抓取我的主窗体窗口的一个实例,因此用户控件可以访问主窗体属性并可以调用主窗体上的方法。这是一个片段(this.frmParent 是公共成员):
private void ucBase_Load( object sender, EventArgs e )
{
// Establish the link to the main form.
this.frmParent = FindForm() as frmMain;
}
然后每个用户控件共享这个基类:
public partial class ucLiberty : ucBase
然后在主窗体中,我将这样调用用户控件:
ucLiberty Liberty = new ucLiberty();
IQDevicePath = Liberty.GetIQDrivePath();
出于某种原因,当我实例化用户控件时(在本例中,它位于主窗体中),基类中的 frmParent 变量可能会或可能不会填充非空值。
我注意到用户控件中的加载事件没有触发。我找到了一个名为 CreateControl() 的方法,它应该强制创建控件,然后我的加载事件开始触发,但是当我在调试器中跟踪执行并到达它试图填充 frmParent 的基类时, FindForm() 并不总是返回非空值。
我有其他没有这个问题的用户控件,它们之间的区别是一些用户控件有子控件,而有些没有子控件。没有子控件的那个有这个问题。
我的解决方法是监视哪个用户控件 FindForm() 失败,并在该用户控件的加载事件中,通过调用主窗体的构造函数来分配值,如下所示:
this.frmParent = new frmMain();
但是,我仍然必须调用 CreateControl() 才能触发加载事件,而且我不喜欢要求未来的维护者必须明确了解不同行为要求的想法。换句话说,我希望我的用户控件都以相同的方式工作,以保持维护简单。
我已经将我的代码拆散了,无法弄清楚为什么有时用户控件的加载事件可能会或可能不会触发,以及为什么在用户控件基类中对 FindForm() 的调用失败。
有没有人对如何解决这些问题有任何想法?谢谢。