话不多说,直入主题。
众所周知,winform程序启动必须通过main函数入口来启动,新打开一个form窗体要通过main函数中执行Application.Run() 方法来启动(如:Application.Run(new Form1());).在进入Run方法后会执行Form类的几个方法来加载页面数据:BindingContextChanged()、HandleCreated()、Load()等方法。
我写的一个程序,在直接F5启动时,在运行我写的页面Load方法之前就抛出了异常。如图:
既然出现了异常,那么就是程序有问题,开始找bug。
在程序代码中添加断点,单步调试,发现每次都是执行到Application.Run(new Form1())时就抛出异常,心想,不科学啊,这里怎么会有错呢。接下来我想到在进入Application.Run(new Form1())方法之后,程序就会执行form的方法。所以我就去查了一下C#WinForm窗体事件执行次序,发现在load()方法之前还会执行一些其他的方法:
所以我就先将系统的这些方法重载一下,代码如下:
protected override void OnBindingContextChanged(EventArgs e)
{
base.OnBindingContextChanged(e);
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
}
然后发现程序在执行完OnHandleCreated()方法之后,并没有按顺序去执行OnBindingContextChanged()方法,而是执行了一个我自己给控件添加的一个方法,如下
我在页面上添加了一个combobox控件,给该控件添加了EditValueChanged() 方法,如下图所示:
我添加的这个方法是用来在此控件选择的内容发生变化时,从数据库取相对应的数据绑定到另外的控件,由于我连接数据库用的是公司的WebService,需要在页面加载的时候设置一些参数,才可以成功连接到数据库,否则就会抛出异常。
而上述程序在执行完OnHandleCreated()方法之后,转而去执行EditValueChanged()方法导致抛出了异常。
发现了错误的地方,还要找到解决方法。
虽然不明白为什么程序的事件执行顺序是这样,但是不妨碍我们找到解决的办法。
既然它在load()方法执行之前就会执行,那么我们把它的初始化语句放在load()方法里不就可以了吗,如下:
checkedComboBoxEdit1.EditValueChanged += new EventHandler(checkedComboBoxEdit1_EditValueChanged);
在运行程序,完美解决。