3 自定义控件之复杂属性-连字符形式属性
2010-11-18 11:22
162 查看
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 效果
属性编辑器中的效果:
连字符形式的复杂属性:通过"复杂属性名称-子属性" 字符串格式提供追加到主控件的属性。
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)] | ||||||||||||||
在属性编辑后在值只在内存中而没有持久化到页面上。 |
相关文章推荐
- asp.net控件开发基础(5) ----------简单介绍自定义控件简单属性和复杂属性
- 4 自定义控件之复杂属性-内部嵌套复杂属性
- 5 自定义控件之复杂属性-内部嵌套默认属性
- 为字符属性定义选项[web自定义控件]
- ASP.NET自定义控件复杂属性声明持久性浅析
- ASP.NET自定义控件复杂属性声明持久性浅析
- ASP.NET自定义控件复杂属性声明持久性浅析
- asp.net控件开发基础(5) ----------简单介绍自定义控件简单属性和复杂属性
- ASP.NET自定义控件复杂属性声明持久性浅析
- 自定义控件,自定义视图状态,复杂属性
- 处理,输出指定标签的指定属性的属性值,字符组形式
- 如何在自定义控件里添加复杂属性(struct,class等)
- 4.4.2 复杂属性的几种标记形式
- Asp.net 2.0 自定义控件开发专题讲解[为用户控件增加DataSource属性, 能够自动识别不同数据源](示例代码下载)
- C# 如何定义让PropertyGrid控件显示[...]按钮,并且点击后以下拉框形式显示自定义控件编辑属性值
- Mybatis 示例之 复杂(complex)属性(property)
- android 自定义控件的几种形式
- 自定义控件 ----- 属性与组合控件
- TStrings可以存储L(Label)V(Value)形式的数据,用NameValueSeparator属性设置分隔符
- Android 自定义控件 自定义属性 总结