【問題待解決】自定義控件設計界面報錯,編譯運行正常


【問題症狀】:

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

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

【問題未解決】:

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

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

     既然是DataSource的問題,那就到自定義控件中來找問題。

         public List<ComBoxItem> DataSource
        {
            get { return items; }
            set { items = value; }
        }    

 

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

【反思】:

     1.在解決這個問題的過程中,看到有人通過DesignMode或者Site.DesignMode屬性,“過濾”一部分操作,使控件在設計界面不致崩潰。菜鳥D記得有一個特性(Attribute)標記控件后,控件在設計界面只做顯示,不會加載與數據相關的東西(這才是我想要的效果),可惜沒有找到(不知道是記錯了,還是壓根就沒有)。關於DesignMode的可以參考http://www.cnblogs.com/wuhuacong/p/3508467.html

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

       [Category("外觀")]為標記的(控件)屬性的分類,屬於外觀屬於行為或者屬於數據,也可以自己定義一個分類;

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

       [Description("與控件關聯的文本")]為標記的(控件)屬性添加描述,可以在屬性窗體中查看,如圖:

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

      自動屬性(也有人叫它自實現屬性)是添加屬性的一個快捷方式,輸入prop,按下回車鍵,然后一個屬性的模板就生成好了,只需要修改屬性的類型和屬性名就OK了,通過代碼片實現的,不是什么稀奇的操作。

效果如下: public TYPE Type { get; set; }
      還有一種則是將已有字段封裝成屬性,也有快捷方式:將光標放在字段名后面(前面,中間或選中),一個組合鍵ctrl+r、e,然后兩次回車(中間是預覽,直接用回車,沒有必要看)。這里需要注意的是將已有字段封裝成屬性時,已有字段還是不要賦初始值,以免發生上面的錯誤。
-----------------------------------------華(yin)麗(dang)的分割線-------------------------------------

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

     這篇文字里並沒有從實質或者大方面來解決標題中的問題,只是針對了一個特例,若讀者有更巧妙的思路和方法,歡迎評論或者聯系本人QQ:1304679383.

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM