ASP.NET自定义控件属性介绍自定义控件简单属性和复杂属性:
主题是是ASP.NET自定义控件属性,只当分享经验,希望对大家有帮助
我们根据属性的不同表现形式,把其区分为简单属性和复杂属性
下面来看下属性的表现形式
ASP.NET自定义控件属性之简单属性表现形式如下,
asp:TextBox ID="TextBox1" Text="textbox控件" runat="server"/asp:TextBox
属性中含有子属性,称之为复杂对象,如Font属性
ASP.NET自定义控件属性之复杂属性的表现形式如下,
(1)连字符的表现形式
asp:TextBox ID="TextBox1" Text="textbox控件" runat="server" Font-Bold="True"/asp:TextBox
(2)内镶属性的表现形式,如定义样式
asp:DataList ID="DataList1" runat="server" SelectedItemStyle / EditItemStyle / /asp:DataList
(3)内镶集合属性的表现形式,如DropDownList (先不介绍,大家可看MSDN)
asp:DropDownList ID="DropDownList1" runat="server" asp:ListItemx/asp:ListItem asp:ListItemxx/asp:ListItem asp:ListItemxxx/asp:ListItem /asp:DropDownList
下面得好好看
1,ASP.NET自定义控件属性之复杂属性基本使用方法
请看我是怎么做的,关于下面看到了一些元数据,如果你不熟悉,请参考MSDN.
下面一段代码记录一个custom的信息.
1.1 定义枚举
-
usingSystem;
-
-
namespaceCustomComponents
-
{
-
///
summary
-
-
-
publicenumMetier
-
{
-
教师,程序员,作家
-
}
-
}
1.2定义复杂属性
-
usingSystem;
-
usingSystem.ComponentModel;
-
-
namespaceCustomComponents
-
{
-
-
-
///
summary
-
-
-
publicclassAddress
-
{
-
privateString street =null;
-
privateString city =null;
-
privateString state =null;
-
privateString zip =null;
-
-
publicString Street
-
{
-
get
-
{
-
returnstreet;
-
}
-
set
-
{
-
street = value;
-
}
-
}
-
-
-
publicString City
-
{
-
get
-
{
-
returncity;
-
}
-
set
-
{
-
city = value;
-
}
-
}
-
-
publicString State
-
{
-
get
-
{
-
returnstate;
-
}
-
set
-
{
-
state = value;
-
}
-
}
-
-
publicString Zip
-
{
-
get
-
{
-
returnzip;
-
}
-
set
-
{
-
zip = value;
-
}
-
}
-
}
-
}
1.3 呈现控件
-
usingSystem;
-
usingSystem.ComponentModel;
-
usingSystem.Web;
-
usingSystem.Web.UI;
-
-
namespaceCustomComponents
-
{
-
publicclassCustom: Control
-
{
-
privateString name =null;
-
Address address =newAddress();
-
privateMetier metier;
-
privateintage = 0;
-
-
属性#region 属性
-
[Description("年龄")]
-
publicintAge
-
{
-
get
-
{
-
returnage;
-
}
-
set
-
{
-
age = value;
-
}
-
}
-
-
[Description("姓名")]
-
publicString Name
-
{
-
get
-
{
-
returnname;
-
}
-
set
-
{
-
name = value;
-
}
-
}
-
-
[Description("职业")]
-
publicMetier CustomMetier
-
{
-
get
-
{
-
returnmetier;
-
}
-
set
-
{
-
metier = value;
-
}
-
}
-
[Description("地址集合")]
-
publicAddress CustomAddress
-
{
-
get
-
{
-
returnaddress;
-
}
-
}
-
-
#endregion
-
-
protectedoverridevoidRender(HtmlTextWriter
output)
-
{
-
output.Write("姓名: "+ Name +"br");
-
output.Write("年龄: "+ Age +"br");
-
output.Write("职业: "+ CustomMetier +"br");
-
output.Write("具体地址: "+ CustomAddress.Street +"br 城市: "
-
+ CustomAddress.City +"br 国籍: "+
-
CustomAddress.State +"br 邮编: "+ CustomAddress.Zip +"br");
-
}
-
}
-
}
1.4 在ASP.NET页面定义控件,
发现问题:属性不是有效属性,如下图
打开后台代码,输入如下代码检查属性,发现属性是存在的,如下图,再打开视图,发现控件能显示属性,唯一的就是不能认识属性为有效属性,在源视图也无法找到这几个属性.
1.5 解决1.4无法显示有效属性的问题,(其实以上的测试已经实现复杂属性了).
解决方法:请在Custom类中的CustomAddress中加入一个元数据(元数据的解释请参考MSDN),如下
-
[Description("地址集合")]
-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
-
publicAddress CustomAddress
-
{
-
get
-
{
-
returnaddress;
-
}
-
}
再次打开源视图,发现编辑器已经支持此属性了,如下图,这样有点意思吧,呵呵
虽然源视图上已经支持这个复杂属性了,打开属性面板,发现属性面板并不支持这个复杂属性(因为我们比较懒,不喜欢在源视图里编辑属性,想直接在属性面板编辑属性,下面就称复杂属性是CustomAddress),我们想要达到的效果,是让CustomAddress属性跟Font属性一样(可以折叠)显示在面板上,如下图
发现问题:属性面板并不支持这个复杂属性
1.6 实现CustomAddress属性折叠效果
解决方法:给Address类添加一个元数据,如下
-
[TypeConverter(typeof(ExpandableObjectConverter))]
-
publicclassAddress
-
{. }
编译后,再次打开属性面板,发现CustomAddress属性已经支持折叠效果,如下图
试着在属性面板编辑CustomAddress的子属性,修改好子属性以后然后运行页面,发现子属性修改数据后无效
发现问题:在属性面板编辑复杂属性的子属性无效
1.7 解决属性面板编辑复杂属性的子属性无效的问题
解决方法:为Address类的每个属性加上一个元数据,如下
-
[NotifyParentProperty(true)]
-
publicString Street
-
{
-
get
-
{
-
returnstreet;
-
}
-
set
-
{
-
street = value;
-
}
-
}
编译后,回到原asp.net的页面,再次在属性面板里修改子属性,再次运行页面.发现修改后的数据生效了.
好了,以上代码就是连字符形式的复杂属性的实现,我们接着继续,我们希望把CustomAddress属性做为内镶属性使用,即如下代码的形式
-
custom:custom id="Custom1"runat="server"name="Clingingboy"CustomMetier="教师"Age="21"
-
CustomAddress City="杭州"Street="不告诉你"State="中国"Zip="310000"/
-
/custom:custom
发现问题:无法使用内镶属性
1.8 实现内镶属性
解决方法:在Custom类中给CustomAddress再加入一个元数据(第三个),如下
-
[Description("地址集合")]
-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
-
[PersistenceMode(PersistenceMode.InnerProperty)]
-
publicAddress CustomAddress
-
{
-
get
-
{
-
returnaddress;
-
}
-
}
打开源视图(请不要把原来的连字符属性去掉),在控件内部加入如下代码(编辑器已经支持此属性了)
-
custom:custom
-
CustomAddress-Zip="3100001"CustomAddress-City="杭州1"
-
CustomAddress-State="中国1"CustomAddress-Street="不告诉你1"
-
id="Custom1"runat="server"name="Clingingboy"CustomMetier="教师"Age="21"
-
CustomAddress City="杭州"Street="不告诉你"State="中国"Zip="310000"/
-
/custom:custom
发现问题:查看属性面板,再次修改CustomAddress子属性,然后运行,发现修改后无效果,而且显示的数据仍然是连字符属性的数据(非内镶属性的)
1.9 让ASP.NET控件支持内镶属性
解决方法:给Custom类添加元数据,如下代码
[ParseChildren(true)] public class Custom: Control { }
编译后,再次测试发现属性显示的优先级发生了变化,在内镶属性存在的时候,显示内镶属性,若其中有子属性不存在,则显示连字符属性,大家可以适当更改内镶属性和连字符属性测试变化.
发现问题:在属性面板改变属性时,仍然无法使修改后的数据生效,且修改后,数据退回初始的数据,并且导致内镶属性消失
1.10 解决属性面板的问题
解决方法:给Custom类再添加一个元数据,如下代码
[ParseChildren(true)] [PersistChildren(false)] public class Custom: Control { }
编译后再次修改属性面板的值,发现修改的是内镶属性的数据,而且这次修改后数据没有丢失,运行后也是修改后的效果.
好了,简单的讲完了.
总结下:上面刚开始到1.3为止,其实效果已经实现了,接下来都是添加元数据,添加以后给我们带来的是方便.以上解决问题的办法全是套用元数据.可能上面的元数据大家很熟悉,在MSDN里面字面解释的也很清楚,但你去试验过吗?我相信这样的试验可以让你明白的更加深刻.
这次讲的虽然很简单(难得我把这么简单的东西变的这么复杂),主要是学习学习方法了但我还是希望对大家有帮助,上面如果哪里讲错了还请指出来^_^.
ASP.NET自定义控件属性的相关内容就向你介绍到这里,希望对你了解ASP.NET自定义控件属性有所帮助。
相关推荐
asp.net 自定义控件 上图文件控件 带有进度和时间 高效率
ASP.NET自定义控件开发实例教程,通过一系列具体的例子展示了如何创建从简单的到复杂的数据绑定控件
ASP.NET自定义控件实例教程.pdf
一段ASP.NET自定义控件源代码,里面是一个简单的自定义控件,包含源代码.
asp.net 自定义控件 抽屉控件asp.net 自定义控件 抽屉控件
asp.net c#自定义控件 代码例子
一款自定义的控件,通过操作txt,html格式的文件达到repeater控件的效果,在CSS使用方面比repeater控件更易于操作,输出到页面后完全是html的标签,如果想在输出过程中加入服务器控件的话,改案例还无法达到要求,...
自定义等待服务器控件,提示和确认控件,进度条控件等.
ASP.NET自定义控件系列文章 前言 第一天 简单的星级控件 第二天 带有自定义样式的星级控件 第三天 使用控件状态的星级控件 第四天 折叠面板自定义控件 第五天 可以评分的星级控件 第六天 可以绑定数据源的...
ASP.NET自定义控件 真正可以评分的星级控件,实现动态评分的效果
asp.net 自定义控件 CalendarTextBox
ASP.NET自定义控件组件开发 ASP.NET自定义控件组件开发 ASP.NET自定义控件组件开发
ASP.NET自定义控件教程.pdf
纯属个人作品。供ASP.NET爱好者学习之用。请勿用于商业用途。这是一个简易版的提示消息控件。。
ASP.NET自定义控件教程 介绍了什么是 自定义控件
asp.net自定义控件EeekSoft.Web.PopupWin.zip能够帮你更好的做好网站不必自己写
asp.net GridView自定义控件源码,美化控件。
asp.net 自定义控件中的嵌入脚本图片等资源的一些总结 asp.net 自定义控件中的嵌入脚本图片等资源的一些总结