在我看了Clingingboy的博客園之後,我嘗試者按照他所講的來試驗,有興趣的可以去參考他的 asp.net控件开 发基础(5) 我很感謝他為我們新人寫出了很好的教材.我在這裡也和大家分享一下我的心得.
我们根据属性的不同表现形式,把其区分为简单属性和复杂属性
1.簡單屬性:大家都很熟悉的如TextBox的Text屬性等
2.複雜屬性:
(1)连字符的表现形式
(2)内镶属性的表现形式,如定义样式
(3)内镶集合属性的表现形式,如DropDownList (先不介绍,大家可看MSDN)
下面我們重點來講講複雜屬性的設置過程
1.定義複雜屬性類類型
2.解決視圖不認識屬性為有效屬性的問題
在控件屬性申明処添加一個元數據,指定屬性的可視度給設計階段序列化工具,程式碼產生器產生物件內
容的程式碼,而非物件本身的程式碼
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
3.解決属性面板并不支持这个复杂属性的問題使此複雜属性跟Font属性一样(可以折叠)显示在面板上
在此複雜屬性的定義出,添加一個元數據
[TypeConverter(typeof(ExpandableObjectConverter))]
4.解决属性面板编辑复杂属性的子属性无效的问题
为複雜屬性类的每个子属性加上一个元数据
[NotifyParentProperty(true)]
5.如果希望把此複雜属性做为内镶属性使用即如下代碼實現:
<custom:custom id="Custom1" runat="server" name="Clingingboy" CustomMetier="教师" Age="21">
<CustomAddress City="杭州" Street="不告诉你" State="中国" Zip="310000" />
</custom:custom>
我們需要如下處理:
(1)在控件屬性申明処添加一個元數據,解決无法使用内镶属性問題
[PersistenceMode(PersistenceMode.InnerProperty)]
(2)在控件類前面添加一個元數據,讓控件支持内鑲屬性
[ParseChildren(true)]
(3)在控件類前面再添加一個元數據,解決在属性面板改变属性时,仍然无法使修改后的数据生效,且修改
后,数据退回初始的数据,并且导致内镶属性消失
[PersistChildren(false)]
我们根据属性的不同表现形式,把其区分为简单属性和复杂属性
1.簡單屬性:大家都很熟悉的如TextBox的Text屬性等
<asp:TextBox ID="TextBox1" Text="textbox控件" runat="server"></asp:TextBox>
2.複雜屬性:
(1)连字符的表现形式
<asp:TextBox ID="TextBox1" Text="textbox控件" runat="server" Font-Bold="True"></asp:TextBox>
(2)内镶属性的表现形式,如定义样式
<asp:DataList ID="DataList1" runat="server">
<SelectedItemStyle />
<EditItemStyle />
</asp:DataList>
<SelectedItemStyle />
<EditItemStyle />
</asp:DataList>
(3)内镶集合属性的表现形式,如DropDownList (先不介绍,大家可看MSDN)
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>x</asp:ListItem>
<asp:ListItem>xx</asp:ListItem>
<asp:ListItem>xxx</asp:ListItem>
</asp:DropDownList>
<asp:ListItem>x</asp:ListItem>
<asp:ListItem>xx</asp:ListItem>
<asp:ListItem>xxx</asp:ListItem>
</asp:DropDownList>
下面我們重點來講講複雜屬性的設置過程
1.定義複雜屬性類類型
2.解決視圖不認識屬性為有效屬性的問題
在控件屬性申明処添加一個元數據,指定屬性的可視度給設計階段序列化工具,程式碼產生器產生物件內
容的程式碼,而非物件本身的程式碼
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
3.解決属性面板并不支持这个复杂属性的問題使此複雜属性跟Font属性一样(可以折叠)显示在面板上
在此複雜屬性的定義出,添加一個元數據
[TypeConverter(typeof(ExpandableObjectConverter))]
4.解决属性面板编辑复杂属性的子属性无效的问题
为複雜屬性类的每个子属性加上一个元数据
[NotifyParentProperty(true)]
5.如果希望把此複雜属性做为内镶属性使用即如下代碼實現:
<custom:custom id="Custom1" runat="server" name="Clingingboy" CustomMetier="教师" Age="21">
<CustomAddress City="杭州" Street="不告诉你" State="中国" Zip="310000" />
</custom:custom>
我們需要如下處理:
(1)在控件屬性申明処添加一個元數據,解決无法使用内镶属性問題
[PersistenceMode(PersistenceMode.InnerProperty)]
(2)在控件類前面添加一個元數據,讓控件支持内鑲屬性
[ParseChildren(true)]
(3)在控件類前面再添加一個元數據,解決在属性面板改变属性时,仍然无法使修改后的数据生效,且修改
后,数据退回初始的数据,并且导致内镶属性消失
[PersistChildren(false)]