按我们的思路,应该是先有一个Font对象或结构体,然后其下又有一些属性.恩.试试.
不对呀,那样写出来的不成了 Button1.Font.Bold 或 Button1.Font.Names
那怎么做到和简单属性那样:Button1.Text 或 Button1.Font-Bold呢?
我已经开题了.今天就是讲这个.当然我们有更伟大的目标.那就看下去吧.
现在我们就来做这种类型的控件 目标:
<cc1:properitycomponent id="ProperityComponent1" runat="server"
University="闽江学院"
UniversityAddress-Provinces="福建"
UniversityAddress-City="福州">
</cc1:properitycomponent>
实现代码:
using
System;
using
System.ComponentModel;
using
System.Web.UI;
namespace
WebComponent
//
大学所在地址类
public
class
Address
public
Address()
private
string
_provinces;
//
所在省份
private
string
_city;
//
所在城市
public
string
Provinces
return
_provinces;
_provinces
=
value;
public
string
City
return
_city;
_city
=
value;
public
class
ProperityComponent : Control
private
string
_university;
//
大学名称
private
Address _universityAddress
=
new
Address();
//
大学地址
public
string
University
return
_university;
_university
=
value;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public
Address UniversityAddress
return
_universityAddress;
protected
override
void
Render(HtmlTextWriter writer)
System.Text.StringBuilder sb
=
new
System.Text.StringBuilder();
sb.Append(
"
大学名称:
"
+
University
+
"
<br />
"
);
sb.Append(
"
所在省份:
"
+
UniversityAddress.Provinces
+
"
<br />
"
);
sb.Append(
"
所在城市:
"
+
UniversityAddress.City);
writer.Write(sb.ToString());
//
base.Render(writer);
唯一与以前做的有差别的地方,就是在UniversityAddress属性的前面加了个标签.
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public
Address UniversityAddress
return
_universityAddress;
这个标签有什么作用呢?
它表示代码生成器将序列化属性的子属性而不是它本身,怎么理解呢?
就是说Button控件的Font属性中的Bold和Underline子属性
将被序列化为(Font-Underline="True" Font-Bold="True)这种形式.
这个控件中就是将 ProperityComponent控件中的UniversityAddress属性中的Provinces和City子属性.
序列化为(UniversityAddress-Provinces="福建"和UniversityAddress-City="福州")这种形式.
到这里成功第一步了.
接下来,我们想得到属性编辑器的更多帮助
我们也想像Font属性那样,可以展开.点下就能修改,多方便
那么在UniversityAdress属性前再加上TypeConverter(typeof(ExpandableObjectConverter))
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[TypeConverter(
typeof
(ExpandableObjectConverter))]
public
Address UniversityAddress
return
_universityAddress;
这个标签有什么作用呢?
就是将UniversityAddress这个属性 TypeConverter 类型转化为 Expandable 可展开的类型
就是完成图片上的功能.
这里需要说明一下:属性编辑器的默认类型都是文本框. 就像City的后面,只能输入文本.
为了加深对TypeConverter的理解.我们为上面的控件加上一个功能.
即大学的主题颜色,一听到这个.
大家脑子中会不会有一个念头,不会要我输入颜色的值#ffffff吧,那我可不干.
对呀,那要是也像Button中的BackColor那种属性多好,点一下,就可以出来颜色选择框.
对这就是我们的目标.
using
System;
using
System.Drawing;
using
System.ComponentModel;
using
System.Web.UI;
namespace
WebComponent
//
大学所在地址类
public
class
Address
public
Address()
private
string
_provinces;
//
所在省份
private
string
_city;
//
所在城市
public
string
Provinces
return
_provinces;
_provinces
=
value;
public
string
City
return
_city;
_city
=
value;
public
class
ProperityComponent : Control
private
string
_university;
//
大学名称
private
Address _universityAddress
=
new
Address();
private
Color _color;
//
大学的主题颜色
public
string
University
return
_university;
_university
=
value;
[TypeConverter(
typeof
(System.Web.UI.WebControls.WebColorConverter))]
public
Color Color
return
_color;
_color
=
value;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[TypeConverter(
typeof
(ExpandableObjectConverter))]
public
Address UniversityAddress
return
_universityAddress;
protected
override
void
Render(HtmlTextWriter writer)
System.Text.StringBuilder sb
=
new
System.Text.StringBuilder();
sb.Append(
"
大学名称:
"
+
University
+
"
<br />
"
);
sb.Append(
"
大学主题颜色:
"
+
Color.ToString()
+
"
<br />
"
);
sb.Append(
"
所在省份:
"
+
UniversityAddress.Provinces
+
"
<br />
"
);
sb.Append(
"
所在城市:
"
+
UniversityAddress.City);
writer.Write(sb.ToString());
//
base.Render(writer);
大家注意到了没有.在Color属性上面我们做了些什么呢?
[TypeConverter(typeof(
System.Web.UI.WebControls.WebColorConverter
))]
将Color属性转化为 WebColorConverter.这些什么Converter
都是从System.ComponentModel.TypeConverter派生来的.所以后面都会加个Converter
就是它让我们实现了下面这张这么神奇的东西
试着在属性面板编辑
City和Provinces,
修改好后然后运行页面,发现并没有显示出我们修改后的值.
这就怪了.哪里出问题了?
在那两个子属性上方加上[NotifyParentProperty(
true)].然后再运行试试.