none
WebFrom 自定义控件问题 RRS feed

  • 问题

  • 我自己写了一个控件, 其中有一个公开的控件属性(比如:classA), 这个属性是某类控件的基类。  我的问题是怎么在前端HTML设计器中编写HTML代码时直接用子类给这个属性赋值。(通过C#代码肯定可以的。但怎么上HTML设计器也支持呢。)

     


    谢谢,谢谢。
    2012年1月9日 14:24

答案

  • 注意:以后希望你一次性问题问清楚,不然既浪费你的时间,同时也浪费他人的时间,呵呵!

    既然你B已经继承了A,那么A中全部非private的属性自然被B继承啊,比如:

        [ParseChildren(true),PersistChildren(true)]
        public class MyControl:Control
        {
            [PersistenceMode(PersistenceMode.InnerProperty)]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
            public A A
            {
                get
                {
                    return ViewState["a"as A;
                }
                set
                {
                    ViewState["a"= value;
                }
            }

            [PersistenceMode(PersistenceMode.InnerProperty)]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
            public B B
            {
                get
                {
                    return ViewState["b"as B;
                }
                set
                {
                    ViewState["a"= value;
                }
            }
        }

    然后后台代码效果(自己会感知出来B的Text属性的,而不是A,因为是继承关系,不是包含关系!)

     <cc1:MyControl ID="MyControl1" runat="server">
            <B Id=1 Name="1" Text=1 />
    </cc1:MyControl>


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2012年1月12日 1:09

全部回复

  • 我自己写了一个控件, 其中有一个公开的控件属性(比如:classA), 这个属性是某类控件的基类。  我的问题是怎么在前端HTML设计器中编写HTML代码时直接用子类给这个属性赋值。(通过C#代码肯定可以的。但怎么上HTML设计器也支持呢。)

    自定义控件必须告知系统哪些属性,以及如何在页面上呈现出来,我举例子:

    1)创建一个A.cs文件,代码如下——其中TypeConverter告知把整个A类通过某种系统设定的转化可以在属性面板上展示出来,而NotifyParentProperty则腔调属性面板中的数据修改必须和html中同步。

    namespace WebCSharp
    {
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public class A
        {
           [NotifyParentProperty(true)]
            public int Id { getset; }
            [NotifyParentProperty(true)]
            public string Name { getset; }
        }
    }

    2)创建一个继承System.Web.Control类的cs文件,代码如下:

    ParseChildren:在页面视图上把内部控件标记解析为子控件。

    PersistChildren:指定设计器把控件标记中的内容保存为属性还是子控件,该属性值设置为false ,表示保存为属性。

    PersistenceMode:解析为嵌套的属性。

    DesignSerializationVisibility:枚举复杂属性包含的全部子属性。

    namespace WebCSharp
    {
        [ParseChildren(true),PersistChildren(false)]
        public class MyControl:Control
        {
            [PersistenceMode(PersistenceMode.InnerProperty)]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
            public A A
            {
                get
                {
                    return ViewState["a"as A;
                }
                set
                {
                    ViewState["a"= value;
                }
            }
        }
    }

    3)编译控件,拖拽到页面,此时你可以发现VS有智能感知了:

     <cc1:MyControl ID="MyControl1" runat="server">
            <A Id="1" Name="b" />
     </cc1:MyControl>


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 小小恋 2012年1月11日 13:59
    • 取消答案标记 小小恋 2012年1月11日 14:09
    2012年1月10日 2:13
  • 您好, 谢谢您的答复。 我问具体点,谢谢你。
     从您给我的实例中, 假如再添加一个类B 继承之A类。 类B有一个自己的公开属性Text。 如下:
     
     
    namespace WebCSharp
    {   
        [TypeConverter(typeof(ExpandableObjectConverter))]  
        public class B:A 
        {     
              [NotifyParentProperty(true)]     
              public int Text{ get; set; }    
       
         }   
    }
    
    
     其他代码不变。
      这个时候怎么 上Html设计器中的:
    <cc1:MyControl ID="MyControl1" runat="server">
           <A Id="1" Name="b" Text="T" />
    </cc1:MyControl>
          或者:
    其他形式的HTML 代码都可以。
    通过呢。支持呢。 我想要的就是这个。 当然在后台用C#代码给控件属 
     性A赋值是可以的。 基类可以指向子类的引用。  
     
        谢谢, 请帮助解决。
     
    2012年1月11日 13:58
  • 注意:以后希望你一次性问题问清楚,不然既浪费你的时间,同时也浪费他人的时间,呵呵!

    既然你B已经继承了A,那么A中全部非private的属性自然被B继承啊,比如:

        [ParseChildren(true),PersistChildren(true)]
        public class MyControl:Control
        {
            [PersistenceMode(PersistenceMode.InnerProperty)]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
            public A A
            {
                get
                {
                    return ViewState["a"as A;
                }
                set
                {
                    ViewState["a"= value;
                }
            }

            [PersistenceMode(PersistenceMode.InnerProperty)]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
            public B B
            {
                get
                {
                    return ViewState["b"as B;
                }
                set
                {
                    ViewState["a"= value;
                }
            }
        }

    然后后台代码效果(自己会感知出来B的Text属性的,而不是A,因为是继承关系,不是包含关系!)

     <cc1:MyControl ID="MyControl1" runat="server">
            <B Id=1 Name="1" Text=1 />
    </cc1:MyControl>


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2012年1月12日 1:09