FoxOne---一個快速高效的BS框架--WEB控件屬性編輯器
FoxOne---一個快速高效的BS框架--數據訪問(Dao)
我們都知道,VS中有個WEBFORM的控件屬性編輯器,能夠自動反射控件的各個屬性,並且根據屬性的類型出現相應的編輯控件,例如:
1.布爾類型,對應下拉框,里面的選項出現 是 和 否
2.枚舉類型,對應下拉框,里面的選項出現的是枚舉的各個值
3.string類型和int類型,出現的都是輸入框
對於除String和值類型之外的其它類型的屬性,支持得就不太好了,需要手動去實現自己的UITypeEditor,並且用Attribute的方式聲明到屬性中。
如果不聲明自定義復雜類型對應的Editor,那么結果將如下面的User屬性:
只是給了一個慘白的輸入框,沒什么實際意義,只是想告訴你這個屬性我識別到了,無能為力。。。
顯然我不可能讓每個實現了自定義控件的人都去實現一次UITypeEditor,所以我決定基於VS控件屬性編輯器的基礎之上,增加對其它類型的支持,包括:
1.所有繼承自IControl接口的接口類型;
2.所有實現自IControl接口的類型及其子類;
3.泛型列表屬性(IList<T>),不過類型T也只能是實現了IControl或其實現類的子類;
效果是這樣的:
上面的截圖是Table控件的各個屬性,其中String和值類型的屬性出現在“表格組件”那一欄,其它類型的屬性分別出現在各個選項卡中,有接口,有復雜類型,也有泛型列表類型;
其中,對於泛型列表類型,出現的編輯頁面如下:
點擊這個頁面的”新增“時,出現的是對TableColumn類型的編輯;
對於自定義的復雜類型,效果如下:
對於接口類型的屬性,出現如下編輯頁:
注意上圖中出現的五個供選擇的數據源是實現了IListDataSource的類型,只要是實現了特定的接口,無需一一注冊也會被自動識別到(當然那個擴展是出現在你后來新建的工程的話,那工程的Assembly還是要注冊一下的)
當然也可以用特定的Attribute去聲明屬性需要特定的編輯控件,或者數據源,或者是否出現在編輯器中。
例如:
對於”數據表數據源“,在編輯它的屬性時,表名是可以直接選擇,而不用手動填寫的,但屬性類型是String的,這是因為:
在代碼中,我用FormFieldAttribute聲明了這個屬性需要用下拉框,並且用FunctionDataSourceAttribute聲明這個下拉框的數據源來自AllTableDataSource。
這樣的話,這個控件屬性編輯器就很靈活了。。
對於這樣的設計,實現中有四點是比較關鍵的:
1.對於控件屬性類型的反射識別,對於不同的類型出現不同的編輯頁面;
2.控件的系列化;
3.系列化之后結果的存儲,其父子關系的關聯;
4.控件的反系列化;
在接下來的文章中,我將繼續就這4點展開敘述。。
如果有興趣的可以加入群里來交流一下,群號:581523872
github:https://github.com/gameking0124/FoxOne