一個自定義控件內部有一個屬性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