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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章