编程论坛
注册
登录
编程论坛
→
ASP.NET技术论坛
请高手帮忙:如何处理封装控件的属性问题
wwbook
发布于 2008-10-21 08:56, 987 次点击
问题描述:
自己封装控件的一个属性,例如TextAtt,在这个属性下想要以属性展开的形式(就想Font带+号展现的形式)增加一个Name属性,怎么实现?
4 回复
#2
铲铲
2008-10-21 11:12
在属性工具栏内显示加号,这种“复合属性”实际上就是一个对象。
Font属性获取一个Font对象,该对象包含有Size、FontFamily等等属性,因此其表现在属性框中就变成可以展开的。
你可以把TextAtt封装为一个类,该类包含若干属性,如Text,在控件中,属性TextAtt获取TextAtt类实例化对象,在属性工具栏中即显示为加号,展开获得Text属性
#3
wwbook
2008-10-21 12:08
关键的问题是按照这种方法,WinForm下好用,WebForm下能显示出来,但是设计界面所设置的值保存不上呀
#4
铲铲
2008-10-22 09:42
若要在中保存一个属性的状态(值),必须借用ViewState。
众所周知,HTTP是一个无状态协议,一次一连接,互相独立。不能跟踪用户和形成会话。因此才会有诸如Cookie和Session机制来跟踪用户形成会话。
一张网页,当客户端发出请求时,才开始具体的初始化对象操作,当网页被发送到客户端且连接关闭以后,即释放对象,进入销毁程序。下一次用户请求时,再次初始化对象。而上一次初始化所保存的任何状态和值都不复存在,除非你使用ViewState。
ViewState被携带发送到客户端,并且随提交再次返回服务器,这时,虽然先前对象已不存在,但本次提交请求初始化对象以后,会利用ViewState重建对象状态。
因此,你在写属性时,应当将属性保存在ViewState集合里,如果你自己新建类,也应想办法将父类(Page、自定义控件)的ViewState引入你自己的类中,并将属性保存进去。
如:
public string Title
{
get
{
if (this.ViewState["Title"] != null)
{
return (string)this.ViewState["Title"];
}
return "[无标题]";
}
set
{
this.ViewState["Title"] = value;
}
}
#5
wwbook
2008-10-23 08:22
bool dataBindings;
string BindSource;
//增加绑定属性的扩展
[TypeConverter(typeof(ExpandableObjectConverter))]
public class BindAttriClass
{
public BindAttriClass()
{
}
private string Ptext = "";
private string Ptext1 = "";
private string Ptext2 = "";
//属性类中属性的属性,修改时通知父
[NotifyParentProperty(true),]
//描述增加的方法QMSDOSet:集合;QMDisplayField:显示的内容;QMValueField:存储的内容
public string QMSDOSet
{
get { return Ptext; }
set { Ptext = value; }
}
[NotifyParentProperty(true),]
public string QMDisplayField
{
get { return Ptext1; }
set { Ptext1 = value; }
}
[NotifyParentProperty(true),]
public string QMValueField
{
get { return Ptext2; }
set { Ptext2 = value; }
}
}
public bool QMDataBindings
{
get { return dataBindings; }
set { dataBindings = value; }
}
public string QMBindSource
{
get { return BindSource; }
set { BindSource = value; }
}
public BindAttriClass qMBindAtts = new BindAttriClass();
[PersistenceMode(PersistenceMode.InnerProperty), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
//PersistenceMode.InnerProperty理解为,这个属性是在aspx中标记为嵌套标记
//DesignerSerializationVisibility.Content,代码生成器产生对象内容的代码,而不是对象本身的代码。
public BindAttriClass QMBindAtts
{
get { return qMBindAtts; }
set
{
qMBindAtts = value;
}
}
}
1