All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
ajax和asp.net的配置文件_.net资料_编程技术
用C#对DBF数据库的操作_[Asp.Net教程]
HTML教程-收集的常用的HTML标签(4)_[Html教程]
C#教程:读取注册表信息
Linux系统上把PHP编译进Apache静态内核_php资料_编程技术
非常实用的效果:用JS计算剩余可用字数_JavaScript技术_编程技术
编写对SEO友好的ASP.NET程序_[Asp.Net教程]
两台Sql,server数据同步_[SQL,Server教程]
Asp.net实例:实现图片上传_[Asp.Net教程]
MIS开发中.net,Framework的打印功能_[Asp.Net教程]
Reading number is top 10 pictures
Ashlynn Brooke a group sexy photo2
Average female college students2
湖边的风景
赵惟依写真1
9.3阅兵全景图1-抗战老兵和英雄连队梯队
A man's favorite things14
天安门景物系列(一)
Absolutely shocked. National geographic 50 animal photographys8
The little girl with long hair1
Beautiful Japanese beauty(漂亮的日本美女)2
Download software ranking
Professional killers2 for Android
Eclipse 4.2.2 For Win64
matrix1
C#高级编程(第4版)
Twenty piece of palm leaf
Prostitutes diary
Unix video tutorial17
Tram sex maniac 2 (H) rar bag18
I for your crazy
The Bermuda triangle3
归海一刀 published in(发表于) 2014/1/30 1:06:08 Edit(编辑)
Web基础控件开发--属性(续)_[Asp.Net教程]

Web基础控件开发--属性(续)_[Asp.Net教程]

Web基础控件开发--属性(续)_[Asp.Net教程]

主题
关于控件属性的元数据的使用方法
开篇语
上一章中,简单的介绍了属性的分类,如果忘记了,可以返回上一章看看
其实,话又说回来,有的东西,只要知道她是怎么回事就行,没必要硬是给她盖个名字,易或弄个定义,为“定义而定义”,倒是显得有点迂腐
开始了
为了说明属性的一些基本元数据的使用方法,在这里做一个显示name,age,address的自定义People控件,然后我们一一给这些属性加上她们的元数据


1.1定义People的枚举类型职业


using System;


namespace CustomPeople
{
/**////


/// 职业
///

public enum Metier
{
农场主,运动员,程序设计员
}
}



其实,我不喜欢做程序设计员,倒是想做农场主,放放羊,摘摘葡萄,傍晚拥美女入梦,呵呵,做梦罢了:)
1.2定义People的住址(就是自定义类型的复杂属性)

Code
using System;
using System.ComponentModel;


namespace CustomPeople
{
[TypeConverter(typeof(ExpandableObjectConverter))]
public class Address
{
private String street = null;
private String city = null;
private String state = null;
private String zip = null;


[NotifyParentProperty(true)]
public String Street
{
get
{
return street;
}
set
{
street = value;
}
}


[
Category("Behavior"),
DefaultValue(""),
Description("城市"),
NotifyParentProperty(true),
]
public String City
{
get
{
return city;
}
set
{
city = value;
}
}


[
Category("Behavior"),
DefaultValue(""),
Description("国籍"),
NotifyParentProperty(true),
]


public String State
{
get
{
return state;
}
set
{
state = value;
}
}


[
Category("Behavior"),
DefaultValue(""),
Description("邮编"),
NotifyParentProperty(true)
]
public String Zip
{
get
{
return zip;
}
set
{
zip = value;
}
}
}
}



这年头,做人难,做男人更难,要结婚吧,女方硬是要买房子。北京,上海的房子想都不敢想,所以选了湖南,长沙,河西麓谷,这个小地方

1.3呈现People

Code
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;


namespace CustomPeople
{
[ParseChildren(true)]
[PersistChildren(false)]
public class People : Control
{
private String name = null;
Address address = new Address();
private Metier metier;
private int age = 0;
private String family = null;


属性#region 属性
[Description("年龄")]

public int Age
{
get
{
return age;
}
set
{
age = value;
}
}


[Description("姓名")]

public String Name
{
get
{
return name;
}
set
{
name = value;
}
}


[Description("是否成家")]


public String Family
{
get
{
return family;
}
set
{
family = value;
}
}


[Description("职业")]
public Metier CustomMetier
{
get
{
return metier;
}
set
{
metier = value;
}
}
[Description("地址集合")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[PersistenceMode(PersistenceMode.InnerProperty)]
public Address CustomAddress
{
get
{
return address;
}
}


#endregion


protected override void Render(HtmlTextWriter output)
{
output.Write("姓名: " + Name + "
");
output.Write("年龄: " + Age + "
");
output.Write("是否成家: " + Family + "
");
output.Write("职业: " + CustomMetier + "
");
output.Write("具体地址: " + CustomAddress.Street + "
城市: "
+ CustomAddress.City + "
国籍: " +
CustomAddress.State + "
邮编: " + CustomAddress.Zip + "
");
}
}
}


这年头,做技术的,25,26结婚的少,再过两年吧
预备工作都做好了,那么一个个来看元数据

1.4 在设计时要用到的DesignerSerializationVisibility
当设置为Hidden时,你会发现右边可视窗口中的属性,在“源”中,没有生成对应的标记
这是怎么回事呢?当设置为Content时,你会惊奇的发现,生成了对应的标记,哈哈,记住,她的作用就是生成对应的标记,不要想多了
1.5 解决自定义类型相互转换的TypeConverter
当屏蔽掉[TypeConverter(typeof(ExpandableObjectConverter))]的时候,你会发现Address这个复杂属性中的子属性不见了




没错,可能你已经想到了,自定义类型需要转换成String,Int,或者其他...,她就是起这么个作用
虽然,ExpandableObjectConverter类型已经替我们做一些转换工作,但是有时候,我们可以定义自己的ObjectConverter,后面的章节再讲
1.6 还记得事件”冒泡“吗?NotifyParentProperty(true)刚好派上用场
当屏蔽掉复杂属性的每个子属性的NotifyParentProperty(true)时,你会发现,修改复杂属性中的某项时,压根修改不了,又是怎么回事呢?
记得事件冒泡的原理是,把复合控件中的子对象的事件,一层一层向容器,或者说向外传递。复杂属性也是这个“道道”,当我们修改子属性,要想(父亲)复杂属性知道,我们还得标记一下Notify父Property。
1.7 编译生成


结果生成连字符形式的复杂属性


customaddress-street="河西麓谷" customaddress-zip="413000" family="未婚" name="王孟军">
这样就行了吗?当然不是,这只是我们看到的“连字符”形式的复杂属性,我们来想办法做成“内镶属性”,以方便阅读标记


1.8 内镶复杂属性


设置Address属性[PersistenceMode(PersistenceMode.InnerProperty)]


设置People类型


[ParseChildren(true)]
[PersistChildren(false)]


再次编译运行,你会发现






Address变成了内镶属性,呵呵


来看看是怎么生成的,PersistenceMode是一个“属性级别”的元数据,想做成内镶属性,设置为InnerProperty就行,不要去看MSDN上的解释,什么持久化,把人都搞晕!


[ParseChildren(true)]和[PersistChildren(false)]都是“类型级别”的元数据,因为Address属性是要解析成属性,而不是解析成子控件,所以我们Pasee Children as Attribute is true(应该这样翻译,解析子对象作为属性,Yes),而PersistChildren意思刚好相反。


总结


简单的讲了一下,两种复杂属性的实现方法,以及常用的元数据的使用,在下一章,将继续讲自定义类型属性的状态保存,和自定义类型转换,有不妥之处,望大家指点,thanks



demo下载


参考
道不远人
Developing Microsoft ASP.NET Server Controls and Components Microsoft

来源:http://www.cnblogs.com/wmj







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.