C# 控件的visible属性和databinding的关系

一个自定义控件内部有一个属性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

 

 

 

 

 

发布了31 篇原创文章 · 获赞 3 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章