問題待解決 自定義控制項設計介面報錯,編譯執行正常

2022-03-26 05:23:05 字數 2247 閱讀 6330

【問題症狀】:

自定義控制項寫好後生成,拖到窗體上,可以對其屬性進行操作,當第二次開啟窗體,就會顯示一些亂七八糟的錯,但是編譯是能夠通過的,而且執行也是正常的。截圖如下:

這個錯誤是見的次數較多的,還有其他的莫名其妙的錯誤。

【問題未解決】:

無奈之下,只好開啟了頁面的designer.cs和.resx,其中倒是發現了一些端倪,截圖如下:

都指向自定義控制項的datasource屬性,於是就嘗試將.resx的部分**給刪去。結果出乎意料啊,沒有問題,設計器再開再關都沒有問題了,但是把自定義控制項刪除後重新再拉乙個,那段**又自動出現。不能忍啊。依然是datasource的問題,然後就在自定義控制項的構造方法中新增了一行:datasource=null;,結果也是出乎意料,問題似乎是解決了,開關設計器或者刪除後再新增都沒有出錯,事情似乎可以告一段落了,但是在構造方法中設定自己的資料來源為空,似乎是乙個很奇葩另類的事。這種解決思路pass了。

既然是datasource的問題,那就到自定義控制項中來找問題。

public listdatasource

set

}

似乎也沒有問題,於是把datasource替換成自動屬性,放棄使用內部欄位items,再生成再拖來拖去試驗,再沒報過錯。問題似乎更加清晰了,「items」的初始值。items作為私有字段,可以在構造方法中賦值,也可以在load事件中賦值。但是,在這個自定義控制項中,卻是在items被定義的時候賦值的「 private listitems=new list();」,只開闢了記憶體空間,並沒有給出實際的物件。問題的解決已經到了一定程度,現在既要讓內部使用items欄位,又要給外部提供訪問途徑,最後將items的初始值(也就是new)給去掉了,問題得到了解決(但這不是我想要的效果)。

【反思】:

1.在解決這個問題的過程中,看到有人通過designmode或者site.designmode屬性,「過濾」一部分操作,使控制項在設計介面不致崩潰。菜鳥d記得有乙個特性(attribute)標記控制項後,控制項在設計介面只做顯示,不會載入與資料相關的東西(這才是我想要的效果),可惜沒有找到(不知道是記錯了,還是壓根就沒有)。關於designmode的可以參考

2.關於特性(attribute):了解得不多,如[designtimevisible(false)]可以使控制項在工具箱中隱藏(屬於無法理解的用途,控制項在工具箱裡找不到,做出來不是讓用的麼);

[category("外觀")]為標記的(控制項)屬性的分類,屬於外觀屬於行為或者屬於資料,也可以自己定義乙個分類;

[browsable(false)]標記的屬性在屬性窗體在可見或不可見

[description("與控制項關聯的文字")]為標記的(控制項)屬性新增描述,可以在屬性窗體中檢視,如圖:

3.自定義控制項中不可避免要提供一些供外界訪問的途徑,常用的有屬性和事件,事件在此節不做討論,現在先說屬性的問題。屬性是為外界提供訪問內部私有字段(內部資源)的安全有效的途徑。

自動屬性(也有人叫它自實現屬性)是新增屬性的乙個快捷方式,輸入prop,按下回車鍵,然後乙個屬性的模板就生成好了,只需要修改屬性的型別和屬性名就ok了,通過**片實現的,不是什麼稀奇的操作。

效果如下: public type type

還有一種則是將已有字段封裝成屬性,也有快捷方式:將游標放在欄位名後面(前面,中間或選中),乙個組合鍵ctrl+r、e,然後兩次回車(中間是預覽,直接用回車,沒有必要看)。這裡需要注意的是將已有字段封裝成屬性時,已有字段還是不要賦初始值,以免發生上面的錯誤。

-----------------------------------------華(yin)麗(dang)的分割線-------------------------------------

菜鳥d的這篇文字並沒有什麼高深技術,牛13理論,只是從簡單細微的地方發現反思問題,這個解決問題的思路包括手段都很稚嫩,老鳥們看了笑就笑了,菜鳥們看了笑也就笑了,本來這思路也不是個人獨有的(甚至對和錯都不一定),如有謬誤,歡迎指正,菜鳥d期待進步。

菜鳥d希望這篇文字對您有所幫助。

自定義控制項閃爍問題

今天看ui 設計 無意中 想起 之前 自定義控制項閃爍的情況 於是上網搜尋 base.setstyle controlstyles.doublebuffer controlstyles.optimizeddoublebuffer controlstyles.allpaintinginwmpaint,...

自定義Web上傳控制項設計

lgz.on elid,callback 建立乙個透明的,設display為none 註冊elid的mousemove 移動upload的位置使當前滑鼠位置落在upload的右端按鈕上面,設upload的display為block 不能使用mouseover,不知什麼原因,upload很多時候第一次...

自定義窗體設計器 控制項測試

基於.net2的自定義窗體設計器控制項 類似visual studio的vb,c 設計器,其實就是vs2005的設計器 控制項由四部分組成 工具欄,工具箱,繪圖設計區,屬性框 工具欄 儲存 圖形檔案 刪除 控制項,元件 以及.net標準操作 工具箱 通用.net2元件 可以為自定義任意.net 元件...