winform程序页面打开初始化时各事件的执行顺序

本文探讨了WinForm程序启动时的事件执行顺序,特别是在遇到异常情况时的调试过程。通过重载系统方法,作者发现`OnHandleCreated()`后并非按预期执行`OnBindingContextChanged()`,而是跳转到了自定义的`EditValueChanged()`方法,由于此方法中涉及数据库连接参数设置,导致异常。解决方案是将相关初始化语句移至`Load()`事件中,从而解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,直入主题。
众所周知,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);

在运行程序,完美解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值