日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET控件开发基础5

發布時間:2023/12/10 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET控件开发基础5 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?上一篇簡單的講了從WebControl繼承的控件(好象我講的都是簡單的,嘿嘿).本次講的更簡單,主題是是屬性,只當分享經驗,希望對大家有幫助

我們根據屬性的不同表現形式,把其區分為簡單屬性和復雜屬性

下面來看下屬性的表現形式

簡單屬性表現形式如下,大家都很熟悉

<asp:TextBox?ID="TextBox1"?Text="textbox控件"?runat="server"></asp:TextBox>


屬性中含有子屬性,稱之為復雜對象,如Font屬性
復雜屬性的表現形式如下,

(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>


(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>


下面得好好看

1,復雜屬性基本使用方法

請看我是怎么做的,關于下面看到了一些元數據,如果你不熟悉,請參考MSDN.

下面一段代碼記錄一個custom的信息.

1.1 定義枚舉

using?System;

namespace?CustomComponents
{
????
/**////?<summary>
????
///?職業
????
///?</summary>?

????public?enum?Metier
????
{
????????教師,程序員,作家
????}

}



1.2定義復雜屬性

using?System;
using?System.ComponentModel;

namespace?CustomComponents
{


????
/**////?<summary>
????
///?地址集合
????
///?</summary>

????public?class?Address
????
{
????????
private?String?street?=?null;
????????
private?String?city?=?null;
????????
private?String?state?=?null;
????????
private?String?zip?=?null;

????????
public?String?Street
????????
{
????????????
get
????????????
{
????????????????
return?street;
????????????}

????????????
set
????????????
{
????????????????street?
=?value;
????????????}

????????}



????????
public?String?City
????????
{
????????????
get
????????????
{
????????????????
return?city;
????????????}

????????????
set
????????????
{
????????????????city?
=?value;
????????????}

????????}


????????
public?String?State
????????
{
????????????
get
????????????
{
????????????????
return?state;
????????????}

????????????
set
????????????
{
????????????????state?
=?value;
????????????}

????????}


????????
public?String?Zip
????????
{
????????????
get
????????????
{
????????????????
return?zip;
????????????}

????????????
set
????????????
{
????????????????zip?
=?value;
????????????}

????????}

????}

}




1.3 呈現控件


using?System;
using?System.ComponentModel;
using?System.Web;
using?System.Web.UI;

namespace?CustomComponents
{
????
public?class?Custom:?Control
????
{
????????
private?String?name?=?null;
????????Address?address?
=?new?Address();
????????
private?Metier?metier;
????????
private?int?age?=?0;

????????
屬性#region?屬性
????????[Description(
"年齡")]
????????
public?int?Age
????????
{
????????????
get
????????????
{
????????????????
return?age;
????????????}

????????????
set
????????????
{
????????????????age?
=?value;
????????????}

????????}


????????[Description(
"姓名")]
????????
public?String?Name
????????
{
????????????
get
????????????
{
????????????????
return?name;
????????????}

????????????
set
????????????
{
????????????????name?
=?value;
????????????}

????????}


????????[Description(
"職業")]
????????
public?Metier?CustomMetier
????????
{
????????????
get
????????????
{
????????????????
return?metier;
????????????}

????????????
set
????????????
{
????????????????metier?
=?value;
????????????}

????????}

????????[Description(
"地址集合")]
????????
public?Address?CustomAddress
????????
{
????????????
get
????????????
{
????????????????
return?address;
????????????}

????????}


????????
#endregion


????????
protected?override?void?Render(HtmlTextWriter?output)
????????
{
????????????output.Write(
"姓名:?"?+?Name?+?"<br>");
????????????output.Write(
"年齡:?"?+?Age?+?"<br>");
????????????output.Write(
"職業:?"?+?CustomMetier?+?"<br>");
????????????output.Write(
"具體地址:?"?+?CustomAddress.Street?+?"<br>?城市:?"
????????????????
+?CustomAddress.City?+?"<br>?國籍:?"?+
???????????????CustomAddress.State?
+?"<br>?郵編:?"?+?CustomAddress.Zip?+?"<br>");
????????}

????}

}



1.4 在asp.net頁面定義控件,

發現問題:
屬性不是有效屬性,如下圖



打開后臺代碼,輸入如下代碼檢查屬性,發現屬性是存在的,如下圖,再打開視圖,發現控件能顯示屬性,唯一的就是不能認識屬性為有效屬性,在源視圖也無法找到這幾個屬性.



1.5 解決1.4無法顯示有效屬性的問題,(其實以上的測試已經實現復雜屬性了).

? 解決方法:請在Custom類中的CustomAddress中加入一個元數據(元數據的解釋請參考MSDN),如下

????????[Description("地址集合")]
????????[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
????????
public?Address?CustomAddress
????????
{
????????????
get
????????????
{
????????????????
return?address;
????????????}

????????}


再次打開源視圖,發現編輯器已經支持此屬性了,如下圖,這樣有點意思吧,呵呵



雖然源視圖上已經支持這個復雜屬性了,打開屬性面板,發現屬性面板并不支持這個復雜屬性(因為我們比較懶,不喜歡在源視圖里編輯屬性,想直接在屬性面板編輯屬性,下面就稱復雜屬性是CustomAddress),我們想要達到的效果,是讓CustomAddress屬性跟Font屬性一樣(可以折疊)顯示在面板上,如下圖



發現問題:屬性面板并不支持這個復雜屬性

1.6 實現CustomAddress屬性折疊效果

解決方法:
給Address類添加一個元數據,如下

[TypeConverter(typeof(ExpandableObjectConverter))]
????
public?class?Address
????
{.?}


編譯后,再次打開屬性面板,發現CustomAddress屬性已經支持折疊效果,如下圖



試著在屬性面板編輯CustomAddress的子屬性,修改好子屬性以后然后運行頁面,發現子屬性修改數據后無效

發現問題:在屬性面板編輯復雜屬性的子屬性無效

1.7 解決屬性面板編輯復雜屬性的子屬性無效的問題

解決方法:
為Address類的每個屬性加上一個元數據,如下

????????[NotifyParentProperty(true)]
????????public?String?Street
????????{
????????????
get
????????????{
????????????????
return?street;
????????????}

????????????
set
????????????
{
????????????????street?
=?value;
????????????}

????????}


編譯后,回到原asp.net的頁面,再次在屬性面板里修改子屬性,再次運行頁面.發現修改后的數據生效了.

好了,以上代碼就是連字符形式的復雜屬性的實現,我們接著繼續,我們希望把CustomAddress屬性做為內鑲屬性使用,即如下代碼的形式

????????<custom:custom?id="Custom1"?runat="server"?name="Clingingboy"?CustomMetier="教師"?Age="21">
?????????
<CustomAddress?City="杭州"?Street="不告訴你"?State="中國"?Zip="310000"?/>
?????????
</custom:custom>


發現問題:無法使用內鑲屬性

1.8 實現內鑲屬性

解決方法:在Custom類中給CustomAddress再加入一個元數據(第三個),如下

????????[Description("地址集合")]
????????[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
????????[PersistenceMode(PersistenceMode.InnerProperty)]
????????public?Address?CustomAddress
????????{
????????????
get
????????????{
????????????????
return?address;
????????????}

????????}


打開源視圖(請不要把原來的連字符屬性去掉),在控件內部加入如下代碼(編輯器已經支持此屬性了)

????????<custom:custom????
????????CustomAddress
-Zip="3100001"??CustomAddress-City="杭州1"?
????????CustomAddress
-State="中國1"?CustomAddress-Street="不告訴你1"
?????????id
="Custom1"?runat="server"?name="Clingingboy"?CustomMetier="教師"?Age="21">
?????????
<CustomAddress?City="杭州"?Street="不告訴你"?State="中國"?Zip="310000"?/>
?????????
</custom:custom>


發現問題:查看屬性面板,再次修改CustomAddress子屬性,然后運行,發現修改后無效果,而且顯示的數據仍然是連字符屬性的數據(非內鑲屬性的)

1.9 讓控件支持內鑲屬性

解決方法:
給Custom類添加元數據,如下代碼

????[ParseChildren(true)]
????
public?class?Custom:?Control
????
{??}


編譯后,再次測試發現屬性顯示的優先級發生了變化,在內鑲屬性存在的時候,顯示內鑲屬性,若其中有子屬性不存在,則顯示連字符屬性,大家可以適當更改內鑲屬性和連字符屬性測試變化.

發現問題:在屬性面板改變屬性時,仍然無法使修改后的數據生效,且修改后,數據退回初始的數據,并且導致內鑲屬性消失

1.10 解決屬性面板的問題

解決方法:
給Custom類再添加一個元數據,如下代碼

????[ParseChildren(true)]
????[PersistChildren(
false)]
????
public?class?Custom:?Control
????
{??}


編譯后再次修改屬性面板的值,發現修改的是內鑲屬性的數據,而且這次修改后數據沒有丟失,運行后也是修改后的效果.

好了,簡單的講完了.

總結下:上面剛開始到1.3為止,其實效果已經實現了,接下來都是添加元數據,添加以后給我們帶來的是方便.以上解決問題的辦法全是套用元數據.可能上面的元數據大家很熟悉,在MSDN里面字面解釋的也很清楚,但你去試驗過嗎?我相信這樣的試驗可以讓你明白的更加深刻.

這次講的雖然很簡單(難得我把這么簡單的東西變的這么復雜),主要是學習學習方法了
但我還是希望對大家有幫助,上面如果哪里講錯了還請指出來^_^.

示例代碼下載(請大家多修改):


參考文章:

ASP.NET 2.0服務器控件開發之簡單屬性

ASP.NET 2.0服務器控件開發之復雜屬性?

轉載于:https://www.cnblogs.com/mcsm/articles/1893512.html

總結

以上是生活随笔為你收集整理的ASP.NET控件开发基础5的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。