ASP.NET控件開發(fā)基礎(chǔ)之實(shí)現(xiàn)控件集合屬性
集合屬性相信大家都很熟悉也很常用,如DropDownList,ListBox等控件
- ﹤asp:DropDownList ID="DropDownList1" runat="server"﹥
- ﹤asp:ListItem﹥測試1﹤/asp:ListItem﹥
- ﹤asp:ListItem﹥測試2﹤/asp:ListItem﹥
- ﹤asp:ListItem﹥測試3﹤/asp:ListItem﹥
- ﹤/asp:DropDownList﹥
ASP.NET控件開發(fā)基礎(chǔ)之實(shí)現(xiàn)控件集合屬性1.實(shí)現(xiàn)集合屬性效果
經(jīng)過前面幾篇的學(xué)習(xí),相信這一篇看起來已經(jīng)相對簡單了.我們要做的就是,先定義一個(gè)復(fù)雜屬性,然后用迭代語句獲取數(shù)組數(shù)據(jù)即可.
如果看過前面幾篇就看看下面代碼吧,相信看起來很簡單,我們模仿一個(gè)DropDownList,為其屬性添加背景屬性,代碼如下
先定義一個(gè)集合屬性,如下
- public class DropItem
- {
- private string text;
- private string value;
- private Color backColor;
- [
- Category("Behavior"),
- DefaultValue(""),
- Description("項(xiàng)文本"),
- NotifyParentProperty(true),
- ]
- public String Text
- {
- get
- {
- return text;
- }
- set
- {
- text = value;
- }
- }
- [
- Category("Behavior"),
- DefaultValue(""),
- Description("項(xiàng)值"),
- NotifyParentProperty(true),
- ]
- public String Value
- {
- get
- {
- return value;
- }
- set
- {
- this.value = value;
- }
- }
- [
- Category("Behavior"),
- DefaultValue(""),
- Description("背景顏色"),
- NotifyParentProperty(true),
- ]
- public Color BackColor
- {
- get
- {
- return backColor;
- }
- set
- {
- backColor = value;
- }
- }
- }
然后自定義一個(gè)控件,輸出集合屬性,如下代碼
- [ParseChildren(true, "DropItemList")]
- public class DropColor:WebControl
- {
- private ArrayList dropItemList;
- [
- Category("Behavior"),
- Description("項(xiàng)集合"),
- DesignerSerializationVisibility(
- DesignerSerializationVisibility.Content),
- PersistenceMode(PersistenceMode.InnerDefaultProperty),
- ]
- //定義集合屬性
- public ArrayList DropItemList
- {
- get
- {
- if (dropItemList == null)
- {
- dropItemList = new ArrayList();
- }
- return dropItemList;
- }
- }
- //重寫標(biāo)簽
- protected override HtmlTextWriterTag TagKey
- {
- get
- {
- return HtmlTextWriterTag.Select;
- }
- }
- protected override void RenderContents(HtmlTextWriter writer)
- {
- //輸出集合屬性
- foreach (DropItem item in dropItemList)
- {
- DropItem dr = item as DropItem;
- if (dropItemList != null && dropItemList.Count ﹥ 0)
- {
- //顏色轉(zhuǎn)換
- WebColorConverter wcc = new WebColorConverter();
- writer.AddAttribute(HtmlTextWriterAttribute.Value, dr.Value.ToString());
- writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, wcc.ConvertToString(dr.BackColor));
- writer.RenderBeginTag(HtmlTextWriterTag.Option);
- writer.Write(dr.Text.ToString());
- writer.RenderEndTag();
- }
- }
- base.RenderContents(writer);
- }
- }
上面代碼注意顏色類型之間的轉(zhuǎn)換,以下為HTML代碼
- ﹤custom:DropColor ID="DropColor1" runat="server" ForeColor="White"﹥
- ﹤custom:DropItem BackColor="Yellow" Text="黃色" Value="yellow" /﹥
- ﹤custom:DropItem BackColor="Red" Text="紅色" Value="red" /﹥
- ﹤custom:DropItem BackColor="Blue" Text="藍(lán)色" Value="blue" /﹥
- ﹤custom:DropItem BackColor="Green" Text="綠色" Value="green" /﹥
- ﹤custom:DropItem BackColor="Black" Text="黑色" Value="Black" /﹥
- ﹤/custom:DropColor﹥
輸出以后的效果如下圖
效果還不錯(cuò)吧,而且挺實(shí)用的.
ASP.NET控件開發(fā)基礎(chǔ)之實(shí)現(xiàn)控件集合屬性2.定義編輯器
大家一般在添加集合屬性的時(shí)候往往會在.net自帶的編輯器中添加數(shù)據(jù),這樣可以提高效果,不用在HTML視圖添加數(shù)據(jù).如下圖
我們也可以為其添加自定義的編輯器,其實(shí)我們一直在用.net自帶的編輯器,我們稱之為 UI編輯器或視圖編輯器,如顏色,時(shí)間,超級鏈接等,大家該有所體會
其編輯器的基類為位于System.Drawing.Design命名空間的UITypeEditor,很多UI編輯器都從此類派生,有興趣的可以去了解下這個(gè)類.
你們?nèi)绾问褂檬褂肬I編輯器呢?也跟上一篇講的類型轉(zhuǎn)換器一樣,你先要定義一個(gè)UI編輯器,然后與相關(guān)屬性關(guān)聯(lián)起來.
因?yàn)樗x的是一個(gè)集合類,而.net已經(jīng)為我們提供了一個(gè)集合編輯器的CollectionEditor類,其已經(jīng)為我們做了很多工作了,我們最簡單的只需重寫幾個(gè)方法即可.具體其他屬性和方法請參考MSDN,如下代碼
- public class DropItemEditor : CollectionEditor
- {
- public DropItemEditor(Type type)
- : base(type)
- {
- }
- //一次可否選擇多項(xiàng)
- protected override bool CanSelectMultipleInstances()
- {
- return false;
- }
- //獲取此集合包含的數(shù)據(jù)類型
- protected override Type CreateCollectionItemType()
- {
- return typeof(DropItem);
- }
- }
然后把集合屬性與編輯器關(guān)聯(lián)起來,添加了一個(gè)EditorAttribute,第一個(gè)參數(shù)為指定的編輯器類型,第二個(gè)為基本類型
- Category("Behavior"),
- Description("項(xiàng)集合"),
- DesignerSerializationVisibility(
- DesignerSerializationVisibility.Content),
- PersistenceMode(PersistenceMode.InnerDefaultProperty),
- Editor(typeof(DropItemEditor), typeof(UITypeEditor)),
- ]
- //定義集合屬性
- public ArrayList DropItemList
- {
- get
- {
- if (dropItemList == null)
- {
- dropItemList = new ArrayList();
- }
- return dropItemList;
- }
- }
然后再來看下效果,這樣就方面很多了.
如果還不想看到編輯器里的CustomComponents的命名空間的話,你可以像上一篇一樣自定義一個(gè)類型轉(zhuǎn)換器,代碼如下:
- public class DropItemConverter : ExpandableObjectConverter
- {
- 方法#region 方法
- public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
- {
- if (sourceType == typeof(string))
- {
- return true;
- }
- return base.CanConvertFrom(context, sourceType);
- }
- public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
- {
- if (destinationType == typeof(string))
- {
- return true;
- }
- return base.CanConvertTo(context, destinationType);
- }
- public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture,
- object value)
- {
- if (value == null)
- {
- return new DropItem();
- }
- if (value is string)
- {
- string s = (string)value;
- if (s.Length == 0)
- {
- return new DropItem();
- }
- return "DropItem";
- }
- return base.ConvertFrom(context, culture, value);
- }
- public override object ConvertTo(
- ITypeDescriptorContext context,
- CultureInfo culture, object value, Type destinationType)
- {
- if (value != null)
- {
- if (!(value is DropItem))
- {
- throw new ArgumentException(
- "Invalid DropItem", "value");
- }
- }
- if (destinationType == typeof(string))
- {
- if (value == null)
- {
- return String.Empty;
- }
- return "DropItem";
- }
- return base.ConvertTo(context, culture, value,
- destinationType);
- }
- #endregion
- }
然后還是照著步驟把屬性與其關(guān)聯(lián)起來
- [TypeConverter(typeof(DropItemConverter))]
- public class DropItem
- {
- }
再來看下效果
好了,這回講的比較簡單又實(shí)用,希望對大家有幫助.大家同時(shí)也可以參考MSDN里的例子,下面的示例代碼下載我也加上了MSDN的例子.
已經(jīng)寫了10篇了,我們應(yīng)該有些基礎(chǔ)了,我想大家該可以做出一些簡單實(shí)用的控件了.
ASP.NET控件開發(fā)基礎(chǔ)之實(shí)現(xiàn)控件集合屬性的相關(guān)內(nèi)容就講解到這里,希望對你了解ASP.NET控件開發(fā)基礎(chǔ)之實(shí)現(xiàn)控件集合屬性有所幫助。
【編輯推薦】