简单的网站架构,wordpress+大附件,惠州seo博客报价,网络推广平台加盟控件在WEB开发时经常要用到#xff0c;虽然有部分已经存在工具箱里#xff0c;但有时总需要根据自己的要求#xff0c;开发一些合适自己的控件。接上一节,已经说过了控件的属性, 例如#xff0c;我们需要一组属性的集合时#xff0c;这时我们需要用到的就是复杂属性了虽然有部分已经存在工具箱里但有时总需要根据自己的要求开发一些合适自己的控件。接上一节,已经说过了控件的属性, 例如我们需要一组属性的集合时这时我们需要用到的就是复杂属性了简单的属性满足不了我们的要求例如大家熟悉的字体信息设置那栏。下面为大家介绍一下实现的几种代码与注意细节 一、连字符形式的复杂属性标记asp:Button IDButton1 runatserver Font-BoldTrue Font-ItalicTrue Font-NamesArial Font-OverlineTrue Font-Size20pt TextButton /例如上面就是一个Font的复杂属性通过这个属性可以设置一系列相关的值。在ServerControl中添加一个类ComplexAttribute然后输入下面代码 Codeusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.ComponentModel;namespace ServerControl{ [DefaultProperty(Text)] [ToolboxData({0}:ComplexAttribute runatserver/{0}:ComplexAttribute)] public class ComplexAttribute: WebControl { private Student _student; public ComplexAttribute() { _student new Student(); } [Description(Student属性)] [Category(Student属性)] [PersistenceMode(PersistenceMode.Attribute)] //指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性 [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] //指定属性是否以及如何在代码中序列化 [TypeConverter(typeof(ExpandableObjectConverter))] //指定用作此特性所绑定到的对象的转换器的类型 [NotifyParentProperty(true)] public Student Student { get { if (_student null) { _student new Student(); } return _student; } } /// summary /// 输出控件 /// /summary /// param namewriter/param protected override void Render(HtmlTextWriter writer) { writer.Write(姓名); writer.Write(_student.Name); writer.WriteBreak(); writer.Write(年龄); writer.Write(_student.Age.ToString()); writer.WriteBreak(); writer.Write(分数); writer.Write(_student.Cost.ToString()); writer.WriteBreak(); } } /// summary /// 密封类封装文本的字体属性。无法继承此类。 /// /summary public sealed class Student { private string _Name Name; private int _Age 0; private int _Cost 0; [NotifyParentProperty(true)] //这个是为了实现在属性窗口中更新属性值时将通知其父属性,不然修改了属性窗口的值,但不通知你属性,等于没修改 public string Name { get { return _Name; } set { _Name value; } } [NotifyParentProperty(true)] public int Age { get { return _Age; } set { _Age value; } } [NotifyParentProperty(true)] public int Cost { get { return _Cost; } set { _Cost value; } } }} 注意细节不然你会感觉到很多地方不明白1、Student类在设计时最好封装起来添加密封限制让这个类无法继承。2、Student类的属性添加特性[NotifyParentProperty(true)]3、构造函数ComplexAttribute时初始化Student类不然设计器中你的控件会出现未引用对象的错误提示。4、ComplexAttribute类的属性添加特性[PersistenceMode(PersistenceMode.Attribute)] //指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性5、ComplexAttribute类的属性添加特性[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] //指定属性是否以及如何在代码中序列化6、ComplexAttribute类的属性添加特性[TypeConverter(typeof(ExpandableObjectConverter))] //指定用作此特性所绑定到的对象的转换器的类型7、ComplexAttribute类的属性添加特性[NotifyParentProperty(true)] PersistenceMode详解指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性共存在4种枚举设置方式 1、PersistenceModePersistenceMode.Attribute指定属性或事件保持为属性 2、PersistenceModePersistenceMode.EncodedInnerDefaultProperty指定属性作为服务器控件的唯一内部文本如果属性值是HTML编码的只能对字符串作这种指定 3、PersistenceModePersistenceMode.InnerDefaultProperty指定属性在服务器控件中保持为内部文本还指示将该属性定义为元素的默认属性只能指定一个属性为默认属性 4、PersistenceModePersistenceMode.InnerProperty指定属性在服务器控件中保持为嵌套标记通常用于复杂对象它们具有自己的持久性属性。 DesignerSerializationVisibility详解指定属性是否以及如何在代码中序列化其值为DesignerSerializationVisibility的枚举值存在3种设置方式 1、DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)指定序列化程序不应该序列化属性值 2、DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)指定应该允许序列化程序序列化属性的值 3、DesignerSerializationVisibility(DesignerSerializationVisibility.Content)指定序列化程序应该序列化属性的内容而不是属性本身。此字段为只读。Visible为其默认值。 编译在页面上拖进控件再看一下属性窗口你自己定义的属性就在里面了如下图:设置Student属性,到页面代码视图,就会出现下面的代码: cc1:ComplexAttribute IDComplexAttribute1 runatserver Student-Age10 Student-Cost95 Student-NameASP.NET / 二、内部嵌套复杂属性标记 asp:GridView IDGridView1 runatserver RowStyle BackColor#EFF3FB //asp:GridView例如上面的代码BackColor属性RowStyle是内部嵌套。在ServerControl中添加一个类InRowAttribute然后输入下面代码 Codeusing System;using System.Collections.Generic;using System.Drawing;using System.Linq;using System.Text;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.ComponentModel;namespace ServerControl{ [DefaultProperty(Text)] [ToolboxData({0}:InRowAttribute runatserver/{0}:InRowAttribute)] [ParseChildren(true), PersistChildren(false)] public class InRowAttribute : CompositeControl { private Style _Style; public InRowAttribute() { _Style new Style(); } [PersistenceMode(PersistenceMode.InnerProperty)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [NotifyParentProperty(true)] [Category(复杂属性)] [Description(复杂属性——内部嵌套形式)] public Style BackColorStyle { get { if (_Style null) { _Style new Style(); } return _Style; } } /// summary /// 输出控件 /// /summary /// param namewriter/param protected override void Render(HtmlTextWriter writer) { writer.Write(_Style.BackColor.ToString()); } } [TypeConverter(typeof(ExpandableObjectConverter))] public class Style { private Color _BackColor; [NotifyParentProperty(true)] public Color BackColor { get { return _BackColor; } set { _BackColor value; } } }} 编译后在设计器中拖进这个控件在属性窗口设置值在代码视图中可以看到下面的代码cc1:InRowAttribute IDInRowAttribute1 runatserver BackColorStyle BackColorActiveBorder/BackColorStyle/cc1:InRowAttribute属性定定义方面还有好多类型例如我们常用的ListItem组合 CheckBox组合 或自己需要时定义的边框线条边框大小颜色等等这些都是大家在开发中慢慢摸索举一反百吧如果大家有好的控件不防也与我分享一下。 转载于:https://www.cnblogs.com/whtydn/archive/2009/09/15/1566818.html