ASP.NET控件开发基础之实现控件集合属性

2009-11-27     作者:   编辑:闫蕊        点击进入论坛
关键词:ASP.NET

  集合属性相信大家都很熟悉也很常用,如DropDownList,ListBox等控件

  

  1. ﹤asp:DropDownList ID="DropDownList1" runat="server"
  2. ﹤asp:ListItem﹥测试1﹤/asp:ListItem﹥
  3. ﹤asp:ListItem﹥测试2﹤/asp:ListItem﹥
  4. ﹤asp:ListItem﹥测试3﹤/asp:ListItem﹥
  5. ﹤/asp:DropDownList﹥

  ASP.NET控件开发基础之实现控件集合属性1.实现集合属性效果

  经过前面几篇的学习,相信这一篇看起来已经相对简单了.我们要做的就是,先定义一个复杂属性,然后用迭代语句获取数组数据即可.

  如果看过前面几篇就看看下面代码吧,相信看起来很简单,我们模仿一个DropDownList,为其属性添加背景属性,代码如下

  先定义一个集合属性,如下

 

  1. public class DropItem
  2. {
  3. private string text;
  4. private string value;
  5. private Color backColor;
  6. [
  7. Category("Behavior"),
  8. DefaultValue(""),
  9. Description("项文本"),
  10. NotifyParentProperty(true),
  11. ]
  12. public String Text
  13. {
  14. get
  15. {
  16. return text;
  17. }
  18. set
  19. {
  20. text = value;
  21. }
  22. }
  23. [
  24. Category("Behavior"),
  25. DefaultValue(""),
  26. Description("项值"),
  27. NotifyParentProperty(true),
  28. ]
  29. public String Value
  30. {
  31. get
  32. {
  33. return value;
  34. }
  35. set
  36. {
  37. this.value = value;
  38. }
  39. }
  40. [
  41. Category("Behavior"),
  42. DefaultValue(""),
  43. Description("背景颜色"),
  44. NotifyParentProperty(true),
  45. ]
  46. public Color BackColor
  47. {
  48. get
  49. {
  50. return backColor;
  51. }
  52. set
  53. {
  54. backColor = value;
  55. }
  56. }
  57. }

然后自定义一个控件,输出集合属性,如下代码

  1. [ParseChildren(true, "DropItemList")]
  2. public class DropColor:WebControl
  3. {
  4. private ArrayList dropItemList;
  5. [
  6. Category("Behavior"),
  7. Description("项集合"),
  8. DesignerSerializationVisibility(
  9. DesignerSerializationVisibility.Content),
  10. PersistenceMode(PersistenceMode.InnerDefaultProperty),
  11. ]
  12. //定义集合属性
  13. public ArrayList DropItemList
  14. {
  15. get
  16. {
  17. if (dropItemList == null)
  18. {
  19. dropItemList = new ArrayList();
  20. }
  21. return dropItemList;
  22. }
  23. }
  24. //重写标签
  25. protected override HtmlTextWriterTag TagKey
  26. {
  27. get
  28. {
  29. return HtmlTextWriterTag.Select;
  30. }
  31. }
  32. protected override void RenderContents(HtmlTextWriter writer)
  33. {
  34. //输出集合属性
  35. foreach (DropItem item in dropItemList)
  36. {
  37. DropItem dr = item as DropItem;
  38. if (dropItemList != null && dropItemList.Count ﹥ 0)
  39. {
  40. //颜色转换
  41. WebColorConverter wcc = new WebColorConverter();
  42. writer.AddAttribute(HtmlTextWriterAttribute.Value, dr.Value.ToString());
  43. writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, wcc.ConvertToString(dr.BackColor));
  44. writer.RenderBeginTag(HtmlTextWriterTag.Option);
  45. writer.Write(dr.Text.ToString());
  46. writer.RenderEndTag();
  47. }
  48. }
  49. base.RenderContents(writer);
  50. }
  51. }

上面代码注意颜色类型之间的转换,以下为HTML代码

  1. ﹤custom:DropColor ID="DropColor1" runat="server" ForeColor="White"
  2. ﹤custom:DropItem BackColor="Yellow" Text="黄色" Value="yellow" /﹥
  3. ﹤custom:DropItem BackColor="Red" Text="红色" Value="red" /﹥
  4. ﹤custom:DropItem BackColor="Blue" Text="蓝色" Value="blue" /﹥
  5. ﹤custom:DropItem BackColor="Green" Text="绿色" Value="green" /﹥
  6. ﹤custom:DropItem BackColor="Black" Text="黑色" Value="Black" /﹥
  7. ﹤/custom:DropColor﹥

  输出以后的效果如下图

  效果还不错吧,而且挺实用的.

  ASP.NET控件开发基础之实现控件集合属性2.定义编辑器

  大家一般在添加集合属性的时候往往会在.net自带的编辑器中添加数据,这样可以提高效果,不用在HTML视图添加数据.如下图

  我们也可以为其添加自定义的编辑器,其实我们一直在用.net自带的编辑器,我们称之为 UI编辑器或视图编辑器,如颜色,时间,超级链接等,大家该有所体会

  其编辑器的基类为位于System.Drawing.Design命名空间的UITypeEditor,很多UI编辑器都从此类派生,有兴趣的可以去了解下这个类.

  你们如何使用使用UI编辑器呢?也跟上一篇讲的类型转换器一样,你先要定义一个UI编辑器,然后与相关属性关联起来.

  因为所定义的是一个集合类,而.net已经为我们提供了一个集合编辑器的CollectionEditor类,其已经为我们做了很多工作了,我们最简单的只需重写几个方法即可.具体其他属性和方法请参考MSDN,如下代码

  

  1. public class DropItemEditor : CollectionEditor
  2. {
  3. public DropItemEditor(Type type)
  4. : base(type)
  5. {
  6. }
  7. //一次可否选择多项
  8. protected override bool CanSelectMultipleInstances()
  9. {
  10. return false;
  11. }
  12. //获取此集合包含的数据类型
  13. protected override Type CreateCollectionItemType()
  14. {
  15. return typeof(DropItem);
  16. }
  17. }

然后把集合属性与编辑器关联起来,添加了一个EditorAttribute,第一个参数为指定的编辑器类型,第二个为基本类型

  1. Category("Behavior"),
  2. Description("项集合"),
  3. DesignerSerializationVisibility(
  4. DesignerSerializationVisibility.Content),
  5. PersistenceMode(PersistenceMode.InnerDefaultProperty),
  6. Editor(typeof(DropItemEditor), typeof(UITypeEditor)),
  7. ]
  8. //定义集合属性
  9. public ArrayList DropItemList
  10. {
  11. get
  12. {
  13. if (dropItemList == null)
  14. {
  15. dropItemList = new ArrayList();
  16. }
  17. return dropItemList;
  18. }
  19. }

  然后再来看下效果,这样就方面很多了.

  如果还不想看到编辑器里的CustomComponents的命名空间的话,你可以像上一篇一样自定义一个类型转换器,代码如下:

 

  1. public class DropItemConverter : ExpandableObjectConverter
  2. {
  3. 方法#region 方法
  4. public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
  5. {
  6. if (sourceType == typeof(string))
  7. {
  8. return true;
  9. }
  10. return base.CanConvertFrom(context, sourceType);
  11. }
  12. public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
  13. {
  14. if (destinationType == typeof(string))
  15. {
  16. return true;
  17. }
  18. return base.CanConvertTo(context, destinationType);
  19. }
  20. public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture,
  21. object value)
  22. {
  23. if (value == null)
  24. {
  25. return new DropItem();
  26. }
  27. if (value is string)
  28. {
  29. string s = (string)value;
  30. if (s.Length == 0)
  31. {
  32. return new DropItem();
  33. }
  34. return "DropItem";
  35. }
  36. return base.ConvertFrom(context, culture, value);
  37. }
  38. public override object ConvertTo(
  39. ITypeDescriptorContext context,
  40. CultureInfo culture, object value, Type destinationType)
  41. {
  42. if (value != null)
  43. {
  44. if (!(value is DropItem))
  45. {
  46. throw new ArgumentException(
  47. "Invalid DropItem", "value");
  48. }
  49. }
  50. if (destinationType == typeof(string))
  51. {
  52. if (value == null)
  53. {
  54. return String.Empty;
  55. }
  56. return "DropItem";
  57. }
  58. return base.ConvertTo(context, culture, value,
  59. destinationType);
  60. }
  61. #endregion
  62. }

然后还是照着步骤把属性与其关联起来

  1. [TypeConverter(typeof(DropItemConverter))]
  2. public class DropItem
  3. {
  4. }

   再来看下效果

  好了,这回讲的比较简单又实用,希望对大家有帮助.大家同时也可以参考MSDN里的例子,下面的示例代码下载我也加上了MSDN的例子.

  已经写了10篇了,我们应该有些基础了,我想大家该可以做出一些简单实用的控件了.

  ASP.NET控件开发基础之实现控件集合属性的相关内容就讲解到这里,希望对你了解ASP.NET控件开发基础之实现控件集合属性有所帮助。

寻找产品:
姓       名: 电   话:
公       司: E-mail:
描       述: