【問題症狀】:
自定義控件寫好后生成,拖到窗體上,可以對其屬性進行操作,當第二次打開窗體,就會顯示一些亂七八糟的錯,但是編譯是能夠通過的,而且運行也是正常的。截圖如下:
這個錯誤是見的次數較多的,還有其他的莫名其妙的錯誤。

【問題未解決】:
無奈之下,只好打開了頁面的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了,通過代碼片實現的,不是什么稀奇的操作。
菜鳥D的這篇文字並沒有什么高深技術,牛13理論,只是從簡單細微的地方發現反思問題,這個解決問題的思路包括手段都很稚嫩,老鳥們看了笑就笑了,菜鳥們看了笑也就笑了,本來這思路也不是個人獨有的(甚至對和錯都不一定),如有謬誤,歡迎指正,菜鳥D期待進步。
這篇文字里並沒有從實質或者大方面來解決標題中的問題,只是針對了一個特例,若讀者有更巧妙的思路和方法,歡迎評論或者聯系本人QQ:1304679383.
菜鳥D希望這篇文字對您有所幫助。
