3 自定义控件之复杂属性-连字符形式属性
1 连字符形式的复杂属性
连字符形式的复杂属性:通过"复杂属性名称-子属性" 字符串格式提供追加到主控件的属性。
2 相关特性
2.1 PersistenceMod
持久化模式
Attribute
InnerProperty :
InnerDefaultProperty :
EncodedInnerDefaultProperty:
2.2 DesignerSerializationVisibility
Hidden:代码生成器不生成对象的代码。
Visible:代码生成器生成对象的代码。
Content:代码生成器产生对象内容的代码,而不是对象本身的代码。
2.3 TypeConverter
类型转化器
2.4 [NotifyParentProperty(true)]
子属性改变是否通父属性。
3 示例:
3.1 类代码
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace AspnetEssential.CustomerControl
{
/// <summary>
/// Person
/// </summary>
/// <remarks>
/// 复杂属性
/// TypeConverter指定属性转换器
/// </remarks>
[TypeConverter(typeof(ExpandableObjectConverter) )]
public class Person
{
private string _name;
private int _age;
/// <summary>
/// 姓名
/// </summary>
/// <remarks>
/// NotifyParentProperty:当子属性更改时通知父属性
/// </remarks>
[NotifyParentProperty(true)]
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
/// <summary>
/// 年龄
/// </summary>
[NotifyParentProperty(true)]
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
}
}
3.2 控件代码
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Web;
using System.Web.UI;
using System.ComponentModel;
namespace AspnetEssential.CustomerControl.ControlProperty
{
/// <summary>
/// PersonPropertyControl
/// </summary>
/// <remarks>
/// 连字符形式的复杂标记
/// </remarks>
public class PersonPropertyControl : Control
{
private Person _person;
public PersonPropertyControl()
{
_person = new Person();
_person.Name = "姓名";
_person.Age = 20;
}
[Category("复杂属性")]
[Description("复杂属性")]
public Person Person
{
get
{
return _person;
}
}
/// <summary>
/// PersonPro
/// </summary>
/// <remarks>
/// 指定PersistenceMode属性
/// 指定DesignerSerializationVisibility属性
/// </remarks>
[Category("复杂属性")]
[Description("复杂属性")]
[PersistenceMode(PersistenceMode.Attribute)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Person PersonPro
{
get
{
return _person;
}
}
/// <summary>
/// Render
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, "solid");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor, "blue");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "1px");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
string text = string.Format("Name:{0} Age:{1}", _person.Name, _person.Age);
writer.Write(text);
writer.RenderEndTag();
}
}
}
3.3 效果
属性编辑器中的效果:
当编辑PersonPro的Age与Name后,切换到代码视图,会看到持久化的字符串PersonPro-Age,PersonPro_Name。虽然Person也可以指定子属性 | ||||||||||||||
但是它没有指定[PersistenceMode(PersistenceMode.Attribute)] | ||||||||||||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] | ||||||||||||||
在属性编辑后在值只在内存中而没有持久化到页面上。 |