注册 登录
编程论坛 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
wwbook2008-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
wwbook2008-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