ASP.NET控件开发基础之类型转换器1.认识默认属性浏览器支持
站在用户的角度思考问题,与客户深入沟通,找到渭南网站设计与渭南网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:做网站、网站制作、企业官网、英文网站、手机端网站、网站推广、域名注册、网站空间、企业邮箱。业务覆盖渭南地区。
让我们再认识一下属性,大家知道每个属性都是有类型的,最熟悉就是string,int这些类型了,VS2005属性浏览器对这些属性类型进行了识别,
如下例子
(1)table控件的Height属性,当你设置属性为字符串时,则提示错误信息
(2)当属性类型为Color属性时,属性浏览器为你提供颜色选择器
(3)当属性类型为枚举类型时,属性浏览器则支持下拉框选择
(4)当类型是时间类型,属性浏览器则支持时间选择器
通过上面,我们认识到属性浏览器默认会判别属性类型,当属性值跟属性类型不符时,则会提示错误信息.这里我们还认识到属性浏览器默认为一些属性类型提供了便利
ASP.NET控件开发基础之类型转换器2.属性表现形式的多样性
在定义控件属性时,可以直接这样定义,属性都为字符串形式
- ﹤asp:TextBox ID="TextBox1" runat="server"
- Height="11" BackColor="Blue"
- ForeColor="#FF8000"﹥测试﹤/asp:TextBox﹥
用代码表示则是这样,在后台代码中定义的属性类型必须相对应,BackColor必须为Color类型,否则则会出错,当在页面呈现时,则以字符串形式呈现.
- protected void Page_Load(object sender, EventArgs e)
- //TextBox1.BackColor = "blue";
- TextBox1.BackColor = System.Drawing.Color.Red;
- TextBox1.BackColor = System.Drawing.Color.FromName("blue");
通过上面,我们认识到属性类型需要转换,这里便要引出我们所要讲的话题,类型转换器.
例如,当BackColor="Blue" 时,则会激活一个类型转换器实例将字符串值转换成声明的类型(即将"blue"转换成Color类型,然后赋给BackColor.
.net类库中的基本类型和许多类型都有与其相关联的类型转换器.
一般常用的类型有String,Int,Boolean,DateTime,Enum等类型,其类型已默认与其相对应的类型转换器关联起来.
如
Color类默认关联的类型转换器System.Drawing.ColorConverter
FontInto类默认关联的类型转换器System.Drawing.FontConverter
类型转换器的基类为System.ComponentModel.TypeConverter,所有的类型转换器都从其派生.
下面我们再来看一个例子,
我们先定义一个复杂属性,用于测试
示例一
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace CustomComponents
- {
- public class Name
- {
- private string firstName;
- private string lastName;
- public String FirstName
- {
- get
- {
- return firstName;
- }
- set
- {
- firstName = value;
- }
- }
- public String LastName
- {
- get
- {
- return lastName;
- }
- set
- {
- lastName = value;
- }
- }
- }
- }
再看aspx文件
其中我们输出了Label的几个属性,包括FontInfo这个复杂属性,并且实例化了上面定义的Name类
- ﹤%@ Page Language="C#" %﹥
- ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥
- ﹤script runat="server"﹥
- void Page_Load(object sender, EventArgs e)
- {
- myLabel.Font.Bold = true;
- myLabel.Font.Italic = false;
- myLabel.Font.Name = "verdana";
- myLabel.Font.Overline = false;
- myLabel.Font.Size = 10;
- myLabel.Font.Strikeout = false;
- myLabel.Font.Underline = true;
- Response.Write(myLabel.Font + "﹤br﹥");
- Response.Write(Label1.Width);
- Response.Write(Label1.BackColor+"﹤br﹥");
- Response.Write(Label1.ForeColor + "﹤br﹥");
- CustomComponents.Name n = new CustomComponents.Name();
- n.FirstName = "张";
- n.LastName = "三";
- Response.Write(n);
- }
- ﹤/script﹥
- ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥
- ﹤head id="Head1" runat="server"﹥
- ﹤title﹥FontInfo Example﹤/title﹥
- ﹤/head﹥
- ﹤body﹥
- ﹤form id="form1" runat="server"﹥
- ﹤h3﹥FontInfo Example﹤/h3﹥
- ﹤asp:Label id="myLabel"
- runat="server" ﹥
- ﹤/asp:Label﹥
- ﹤br /﹥
- ﹤br /﹥
- ﹤asp:Label ID="Label1" Width="200px" runat="server"
- BackColor="#FF8080" Text="Label" ForeColor="Red"﹥
- ﹤/asp:Label﹥
- ﹤/form﹥
- ﹤/body﹥
- ﹤/html﹥
下面看看输出结果,如下图
结果是将FontInfo属性和Color属性转换成字符串形式呈现,而我们自定义的Name属性只以其类型呈现,并未呈现其子属性值.
再来看看***点默认属性浏览器支持和第五篇我们所定义的一个复杂属性CustomComponents.Address,
CustomComponents.Address属性同样存在着这样的问题,再对比一下FontInfo属性在属性浏览器的支持,如下图
---------------------------------------------------------------------------
复杂属性CustomComponents.Address无法编辑,只读,而且显示的是其属性类型.
复杂属性Font则默认显示了子其属性的值(其默认只显示Names值和Size值,且为只读)
问题来了,我们要根据需要为自定义属性实现类型转换器.
ASP.NET控件开发基础之类型转换器3.自定义属性类型转换器
上面已经说明问题所在了,实现类型转换器,可以将属性类型和字符串类型之间相互转换.
下面我们就为解决这个问题而来了解类型转换器,我们还是以第五篇的那个例子来学习
在说第二点属性表现形式的多样性的时候已经说过了
类型转换器的基类为System.ComponentModel.TypeConverter,所有的类型转换器都从其派生.
下面以第五篇时的例子为基础
我们为Address实现了一个类型转换器,其实现了复杂属性代码的折叠,如下代码
- [TypeConverter(typeof(ExpandableObjectConverter))]
- public class Address
- {
- }
System.ComponentModel.ExpandableObjectConverter 类也是从TypeConverter类派生
所以当自定义复杂类型的类型转换器时,则可从ExpandableObjectConverter 类派生
如果你定义的属性不是复杂属性,则可以直接从TypeConverter类派生
(1) 值翻译的类型转换器
从TypeConverter类派生的自定义类型转换器则需要重写TypeConverter类几个方法,主要目的就是实现自定义属性类型与字符串值之间的转换.
你需要了解以下几个方法,这里我们就以Address属性为例子,这样来解释以下方法更好理解.
其实可以理解成一来一去的关系,Form,To,相互之间的转换,如下代码:
TypeDescriptor类的方法为静态方法,通过GetConverter方法获取类型转换器
然后通过TypeConverter类的ConvertFromString方法和ConvertToString相互转换类型.
示例二
- public class AddressConverter : ExpandableObjectConverter
- {
- 方法#region 方法
- // 返回值能否将String类型转换为Address类型
- //sourceType表示要转换的类型
- public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
- {
- if (sourceType == typeof(string))
- {
- return true;
- }
- return base.CanConvertFrom(context, sourceType);
- }
- // 返回值能否将Address类型转换为String类型
- //sourceType表示要转换到的类型
- public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
- {
- if (destinationType == typeof(string))
- {
- return true;
- }
- return base.CanConvertTo(context, destinationType);
- }
- //将String类型转换为Address类型
- //value为要转换的类型
- public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture,
- object value)
- {
- if (value == null)
- {
- return new Address();
- }
- if (value is string)
- {
- string s = (string)value;
- if (s.Length == 0)
- {
- return new Address();
- }
- string[] parts = s.Split(culture.TextInfo.ListSeparator[0]);
- if (parts.Length != 4)
- {
- throw new ArgumentException("Invalid Address", "value");
- }
- //返回指定类型转换器
- TypeConverter stringConverter = TypeDescriptor.GetConverter(typeof(string));
- return new Address((string)stringConverter.ConvertFromString(context, culture, parts[0]),
- (string)stringConverter.ConvertFromString(context, culture, parts[1]),
- (string)stringConverter.ConvertFromString(context, culture, parts[2]),
- (string)stringConverter.ConvertFromString(context, culture, parts[3]));
- }
- return base.ConvertFrom(context, culture, value);
- }
- //将Address类型转换为String类型
- //value为要转换的类型
- public override object ConvertTo(
- ITypeDescriptorContext context,
- CultureInfo culture, object value, Type destinationType)
- {
- if (value != null)
- {
- if (!(value is Address))
- {
- throw new ArgumentException(
- "Invalid Address", "value");
- }
- }
- if (destinationType == typeof(string))
- {
- if (value == null)
- {
- return String.Empty;
- }
- Address ad = (Address)value;
- TypeConverter stringConverter = TypeDescriptor.GetConverter(typeof(string));
- return String.Join(culture.TextInfo.ListSeparator,
- new string[] {
- stringConverter.ConvertToString(context, culture, ad.Street),
- stringConverter.ConvertToString(context, culture, ad.City),
- stringConverter.ConvertToString(context, culture, ad.State),
- stringConverter.ConvertToString(context, culture, ad.Zip)
- });
- }
- return base.ConvertTo(context, culture, value,
- destinationType);
- }
- #endregion
- }
自定义好类型转换器后,要与属性相关联起来
- [TypeConverter(typeof(AddressConverter))]
- public class Address
- {
- public Address()
- :
- this(String.Empty, String.Empty,
- String.Empty, String.Empty)
- { }
- public Address(string street, string city,
- string state, string zip)
- {
- this.street = street;
- this.city = city;
- this.state = state;
- this.zip = zip;
- }
- .......
- }
下面来看下效果,如下图,属性编辑器显示的CustomAddress不再显示其类型了,已将其转化为字符串形式了,如果你设置CustomAddress可写的话,就可以直接编辑CustomAddress属性,但其只有四个子属性,所以当大于5个时就会出错,且格式也不可以乱改,一般情况下都设置其只读.
为了在页面上显示这个CustomAddress属性,还需要为Address类重写一下ToString方法,如下代码
- #region方法
- public override string ToString()
- {
- return ToString(CultureInfo.CurrentCulture);
- }
- public virtual string ToString(CultureInfo culture)
- {
- return TypeDescriptor.GetConverter(typeof(Address)).ConvertToString(null, culture, this);
- }
- #endregion
通过上面重写ToString方法后,输出的CustomAddress属性将不再是其类型,而是以字符串形式呈现,以下以
Response.Write方法输出Custom1.CustomAddress输出,如下图
上面讲了最基本的值翻译类型转换器,希望对大家有帮助
(2)向“属性”窗口提供标准值列表的类型转换器
像省份这样的属性,为了方便用户填写,我们往往做成下拉框形式,一个省份里面又有城市,我们往往列出一部分,如果其中数据不符合用户要求的话,用户还可以自己输入,使用类型转换器转换器也可以做到这一点.
实现这一效果你需要重写以下方法,我们添加一个属性喜欢的游戏的名称
因为属性为String类型,可以直接从StringConverter 派生
示例三
- public class GameConverter : StringConverter
- {
- //返回此对象是否支持可以从列表中选取的标准值集
- public override bool GetStandardValuesSupported(
- ITypeDescriptorContext context)
- {
- return true;
- }
- //返回下拉框集合类
- public override StandardValuesCollection
- GetStandardValues(ITypeDescriptorContext context)
- {
- return new StandardValuesCollection(new string[]{"传奇",
- "魔兽世界",
- "龙与地下城"});
- }
- //标准值的集合是否为独占列表
- //默认为flase,为true则表示无法修改列表值
- public override bool GetStandardValuesExclusive(
- ITypeDescriptorContext context)
- {
- return false;
- }
- }
然后与相关属性关联起来
- [TypeConverter(typeof(GameConverter))]
- [Description("喜欢的游戏")]
- public String Game
- {
- get
- {
- return game;
- }
- set
- {
- game = value;
- }
- }
好了,.下面我们看一下效果,如下图,你可以选择下拉框的值,也可以自己手动输入,跟枚举类型很相似,但枚举类型无法自己修改值.
这一篇主要介绍了类型转换器的基本使用,希望对大家有所帮助,在写的同时我也学到了很多,讲的比较基础,什么时候我懂了可以再补充,水平有限呀.这一篇就写到这里,很高兴,我已经写到第9篇了,我会继续写下去的,也希望大家喜欢.
ASP.NET控件开发基础之类型转换器的相关内容就向你介绍到这里,希望对你了解ASP.NET控件开发基础之类型转换器有所帮助。
网站名称:ASP.NET控件开发基础之类型转换器浅析
文章位置:http://www.mswzjz.cn/qtweb/news16/232366.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能