一个自定义控件内部有一个属性P1,有一个numeric控件。
numeric控件的visible属性设为false,minimum最小值为30(非默认值0),value属性在自定义控件的load事件中通过databinding绑定到P1。
numeric.DataBindings.Add(new Binding("Value",this,"P1"));
测试1:
外部调用这个自定义控件,界面上点击按钮设置P1=100(此时numeric不可见,100未超出numeric.Value的范围)时出现异常:
【值0不在numeric控件的范围内】
查看堆栈,是在P1.setValue时,databinding的PushData步骤发生的异常。
疑问1:明明设置的是100,为什么会变成值0了?
测试2:
外部调用这个自定义控件,界面上点击按钮[color=#FF0000]显示numeric控件,然后设置numeric控件值=200[/color],此时P1确实变成了200,继续接着进行测试1的步骤,此时未出现异常。
测试3:
结合上面两个主要测试以及其他现象,猜测可能numeric的Visible为false时,databinding未完全绑定?或者是numeric未完全初始化?赋值P1时才会执行初始化?所以有了下面的测试。
步骤与测试1相同,只是设置numeric的visible属性为true。此时未出现异常。
通过以上步骤,猜测当numeric的Visible为false时,整个自定义控件初始化时可能numeric尚未未被初始化,此时直接赋值就会出错。
(可能跟控件的InitBegin和InitEnd有关?了解清楚后再来补充)
最终解决方法:
1、让自定义控件继承ISupportInitialize接口,实现接口的BeginInit和EndInit方法。
2、在BeginInit方法中设置numeric控件的visible=true; 在EndInit方法中设置visible=false;
3、在使用自定义控件时,初始化前调用BeginInit,初始化后调用EndInit(设计器可能会自动生成,不一定要手动调用)
附带关于BeginInit和EndInit的参考链接:https://bbs.csdn.net/topics/390849428