WebControl with Collection Property in Design Time

Discussion in 'ASP .Net Web Controls' started by Mirek Endys, Nov 2, 2005.

  1. Mirek Endys

    Mirek Endys Guest

    Hallo,

    I need to create WebControl, that stores List of Hyperlinks.
    I have problem in design-time.
    When I add an hyperlinks, they are rendered in contents, hyperlinks are
    vsible on page.
    In case I switch into source and then back into design, the control says:

    Error Creating Control - WebNavigation1
    'cc1:WebNavigation' could not be set on property 'Hyperlinks'.

    Im wrong, but I dont know where. Could you help me? Source is bellow.

    using System;

    using System.IO;

    using System.Collections.Generic;

    using System.Collections;

    using System.Drawing.Design;

    using System.ComponentModel;

    using System.Text;

    using System.Web;

    using System.Web.UI;

    using System.Web.UI.Design;

    using System.Web.UI.WebControls;

    namespace WebNavigation

    {

    public class WebNavigationDesigner : System.Web.UI.Design.ControlDesigner

    {

    public override string GetDesignTimeHtml ()

    {

    WebNavigation wn = (WebNavigation) Component;

    StringWriter sw = new StringWriter ();

    HtmlTextWriter tw = new HtmlTextWriter ( sw );


    foreach ( HyperLink hl in wn.Hyperlinks )

    {

    hl.RenderControl ( tw );

    }

    return sw.ToString ();


    }

    }

    //[DefaultProperty ( "Hyperlinks" )]

    [ToolboxData ( "<{0}:WebNavigation runat=server></{0}:WebNavigation>" )]

    [Designer ( "WebNavigation.WebNavigationDesigner, WebNavigation" )]

    [ParseChildren(true, "Hyperlinks")]

    public class WebNavigation : WebControl

    {


    [DefaultValue(100)]

    [Browsable(true)]

    [Bindable ( true )]

    public override Unit Width

    {

    get

    {

    return base.Width;

    }

    set

    {

    base.Width = value;

    }

    }

    [Bindable ( true )]

    [Category ( "Appearance" )]

    [DefaultValue ( "" )]

    [Localizable ( true )]

    public string Caption

    {

    get

    {

    String s = (String) ViewState["Caption"];

    return ( ( s == null ) ? String.Empty : s );

    }

    set

    {

    ViewState["Caption"] = value;

    }

    }


    protected override void RenderContents ( HtmlTextWriter writer )

    {

    foreach ( HyperLink hl in _Hyperlinks )

    this.Controls.Add ( hl );

    base.RenderContents ( writer);

    }

    private List<HyperLink> _Hyperlinks;

    //[Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]

    [DesignerSerializationVisibility ( DesignerSerializationVisibility.Content)]

    [PersistenceMode ( PersistenceMode.InnerDefaultProperty)]

    public List<HyperLink> Hyperlinks

    {

    get

    {

    if ( _Hyperlinks == null )

    _Hyperlinks = new List<HyperLink> ();

    return _Hyperlinks;

    }

    set

    {

    foreach(HyperLink hl in value)

    this.Controls.Add(hl);

    _Hyperlinks = value;

    }

    }


    protected override void AddedControl ( Control control, int index )

    {

    base.AddedControl ( control, index );

    }

    }

    }
     
    Mirek Endys, Nov 2, 2005
    #1
    1. Advertising

  2. Hi Mirek,

    Welcome to ASPNET newsgroup.
    From you description, you're developing a custom web server control (in
    asp.net 2.0) which contains a collection property and you found that the
    control always throw out "could not be set on property" error when
    swtiching between HTML view and design-view in VS.NET IDE(2005) , YES?

    Based on my experience, this problem is caused by our Collection property's
    declaration. For Collection property in .NET Custom Control, we can only
    provide getter accessor for it, in other world it should be defined as
    readonly. Like:
    ===========
    public List<HyperLink> Hyperlinks
    {

    get
    {

    if ( _Hyperlinks == null )

    _Hyperlinks = new List<HyperLink> ();

    return _Hyperlinks;

    }

    //no setter needed

    }
    ==============

    For Collection property, we just need to add/remove items from it, do not
    need to modify the Collection reference itself. Also, we can find that
    those collection property in ASP.NET buildin controls are just defined as
    readonly(Getter only...). So you can remove the setter accessor in your
    control's Hyperlinks property.

    Hope helps. Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! www.microsoft.com/security
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)







    --------------------
    | From: "Mirek Endys" <>
    | Subject: WebControl with Collection Property in Design Time
    | Date: Wed, 2 Nov 2005 12:54:02 +0100
    | Lines: 209
    | X-Priority: 3
    | X-MSMail-Priority: Normal
    | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    | X-RFC2646: Format=Flowed; Original
    | Message-ID: <#>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    | Xref: TK2MSFTNGXA01.phx.gbl
    microsoft.public.dotnet.framework.aspnet.webcontrols:11628
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    |
    | Hallo,
    |
    | I need to create WebControl, that stores List of Hyperlinks.
    | I have problem in design-time.
    | When I add an hyperlinks, they are rendered in contents, hyperlinks are
    | vsible on page.
    | In case I switch into source and then back into design, the control says:
    |
    | Error Creating Control - WebNavigation1
    | 'cc1:WebNavigation' could not be set on property 'Hyperlinks'.
    |
    | Im wrong, but I dont know where. Could you help me? Source is bellow.
    |
    | using System;
    |
    | using System.IO;
    |
    | using System.Collections.Generic;
    |
    | using System.Collections;
    |
    | using System.Drawing.Design;
    |
    | using System.ComponentModel;
    |
    | using System.Text;
    |
    | using System.Web;
    |
    | using System.Web.UI;
    |
    | using System.Web.UI.Design;
    |
    | using System.Web.UI.WebControls;
    |
    | namespace WebNavigation
    |
    | {
    |
    | public class WebNavigationDesigner : System.Web.UI.Design.ControlDesigner
    |
    | {
    |
    | public override string GetDesignTimeHtml ()
    |
    | {
    |
    | WebNavigation wn = (WebNavigation) Component;
    |
    | StringWriter sw = new StringWriter ();
    |
    | HtmlTextWriter tw = new HtmlTextWriter ( sw );
    |
    |
    | foreach ( HyperLink hl in wn.Hyperlinks )
    |
    | {
    |
    | hl.RenderControl ( tw );
    |
    | }
    |
    | return sw.ToString ();
    |
    |
    | }
    |
    | }
    |
    | //[DefaultProperty ( "Hyperlinks" )]
    |
    | [ToolboxData ( "<{0}:WebNavigation runat=server></{0}:WebNavigation>" )]
    |
    | [Designer ( "WebNavigation.WebNavigationDesigner, WebNavigation" )]
    |
    | [ParseChildren(true, "Hyperlinks")]
    |
    | public class WebNavigation : WebControl
    |
    | {
    |
    |
    | [DefaultValue(100)]
    |
    | [Browsable(true)]
    |
    | [Bindable ( true )]
    |
    | public override Unit Width
    |
    | {
    |
    | get
    |
    | {
    |
    | return base.Width;
    |
    | }
    |
    | set
    |
    | {
    |
    | base.Width = value;
    |
    | }
    |
    | }
    |
    | [Bindable ( true )]
    |
    | [Category ( "Appearance" )]
    |
    | [DefaultValue ( "" )]
    |
    | [Localizable ( true )]
    |
    | public string Caption
    |
    | {
    |
    | get
    |
    | {
    |
    | String s = (String) ViewState["Caption"];
    |
    | return ( ( s == null ) ? String.Empty : s );
    |
    | }
    |
    | set
    |
    | {
    |
    | ViewState["Caption"] = value;
    |
    | }
    |
    | }
    |
    |
    | protected override void RenderContents ( HtmlTextWriter writer )
    |
    | {
    |
    | foreach ( HyperLink hl in _Hyperlinks )
    |
    | this.Controls.Add ( hl );
    |
    | base.RenderContents ( writer);
    |
    | }
    |
    | private List<HyperLink> _Hyperlinks;
    |
    | //[Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    |
    | [DesignerSerializationVisibility (
    DesignerSerializationVisibility.Content)]
    |
    | [PersistenceMode ( PersistenceMode.InnerDefaultProperty)]
    |
    | public List<HyperLink> Hyperlinks
    |
    | {
    |
    | get
    |
    | {
    |
    | if ( _Hyperlinks == null )
    |
    | _Hyperlinks = new List<HyperLink> ();
    |
    | return _Hyperlinks;
    |
    | }
    |
    | set
    |
    | {
    |
    | foreach(HyperLink hl in value)
    |
    | this.Controls.Add(hl);
    |
    | _Hyperlinks = value;
    |
    | }
    |
    | }
    |
    |
    | protected override void AddedControl ( Control control, int index )
    |
    | {
    |
    | base.AddedControl ( control, index );
    |
    | }
    |
    | }
    |
    | }
    |
    |
    |
    |
    |
     
    Steven Cheng[MSFT], Nov 3, 2005
    #2
    1. Advertising

  3. Hi Mirek,

    How are you doing on this issue. Does the suggestions in my last reply
    helps you resolve the problem? if there're anything else we can help,
    please feel free to post here. Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! www.microsoft.com/security
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)



    --------------------
    | X-Tomcat-ID: 120657561
    | References: <#>
    | MIME-Version: 1.0
    | Content-Type: text/plain
    | Content-Transfer-Encoding: 7bit
    | From: (Steven Cheng[MSFT])
    | Organization: Microsoft
    | Date: Thu, 03 Nov 2005 06:57:47 GMT
    | Subject: RE: WebControl with Collection Property in Design Time
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    | Message-ID: <lYD#>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | Lines: 133
    | Path: TK2MSFTNGXA01.phx.gbl
    | Xref: TK2MSFTNGXA01.phx.gbl
    microsoft.public.dotnet.framework.aspnet.webcontrols:11644
    | NNTP-Posting-Host: TOMCATIMPORT1 10.201.218.122
    |
    | Hi Mirek,
    |
    | Welcome to ASPNET newsgroup.
    | From you description, you're developing a custom web server control (in
    | asp.net 2.0) which contains a collection property and you found that the
    | control always throw out "could not be set on property" error when
    | swtiching between HTML view and design-view in VS.NET IDE(2005) , YES?
    |
    | Based on my experience, this problem is caused by our Collection
    property's
    | declaration. For Collection property in .NET Custom Control, we can only
    | provide getter accessor for it, in other world it should be defined as
    | readonly. Like:
    | ===========
    | public List<HyperLink> Hyperlinks
    | {
    |
    | get
    | {
    |
    | if ( _Hyperlinks == null )
    |
    | _Hyperlinks = new List<HyperLink> ();
    |
    | return _Hyperlinks;
    |
    | }
    |
    | //no setter needed
    |
    | }
    | ==============
    |
    | For Collection property, we just need to add/remove items from it, do not
    | need to modify the Collection reference itself. Also, we can find that
    | those collection property in ASP.NET buildin controls are just defined as
    | readonly(Getter only...). So you can remove the setter accessor in your
    | control's Hyperlinks property.
    |
    | Hope helps. Thanks,
    |
    | Steven Cheng
    | Microsoft Online Support
    |
    | Get Secure! www.microsoft.com/security
    | (This posting is provided "AS IS", with no warranties, and confers no
    | rights.)
    |
    |
    |
    |
    |
    |
    |
    | --------------------
    | | From: "Mirek Endys" <>
    | | Subject: WebControl with Collection Property in Design Time
    | | Date: Wed, 2 Nov 2005 12:54:02 +0100
    | | Lines: 209
    | | X-Priority: 3
    | | X-MSMail-Priority: Normal
    | | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    | | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    | | X-RFC2646: Format=Flowed; Original
    | | Message-ID: <#>
    | | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    | | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    | | Xref: TK2MSFTNGXA01.phx.gbl
    | microsoft.public.dotnet.framework.aspnet.webcontrols:11628
    | | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    | |
    | | Hallo,
    | |
    | | I need to create WebControl, that stores List of Hyperlinks.
    | | I have problem in design-time.
    | | When I add an hyperlinks, they are rendered in contents, hyperlinks are
    | | vsible on page.
    | | In case I switch into source and then back into design, the control
    says:
    | |
    | | Error Creating Control - WebNavigation1
    | | 'cc1:WebNavigation' could not be set on property 'Hyperlinks'.
    | |
    | | Im wrong, but I dont know where. Could you help me? Source is bellow.
    | |
    | | using System;
    | |
    | | using System.IO;
    | |
    | | using System.Collections.Generic;
    | |
    | | using System.Collections;
    | |
    | | using System.Drawing.Design;
    | |
    | | using System.ComponentModel;
    | |
    | | using System.Text;
    | |
    | | using System.Web;
    | |
    | | using System.Web.UI;
    | |
    | | using System.Web.UI.Design;
    | |
    | | using System.Web.UI.WebControls;
    | |
    | | namespace WebNavigation
    | |
    | | {
    | |
    | | public class WebNavigationDesigner :
    System.Web.UI.Design.ControlDesigner
    | |
    | | {
    | |
    | | public override string GetDesignTimeHtml ()
    | |
    | | {
    | |
    | | WebNavigation wn = (WebNavigation) Component;
    | |
    | | StringWriter sw = new StringWriter ();
    | |
    | | HtmlTextWriter tw = new HtmlTextWriter ( sw );
    | |
    | |
    | | foreach ( HyperLink hl in wn.Hyperlinks )
    | |
    | | {
    | |
    | | hl.RenderControl ( tw );
    | |
    | | }
    | |
    | | return sw.ToString ();
    | |
    | |
    | | }
    | |
    | | }
    | |
    | | //[DefaultProperty ( "Hyperlinks" )]
    | |
    | | [ToolboxData ( "<{0}:WebNavigation runat=server></{0}:WebNavigation>" )]
    | |
    | | [Designer ( "WebNavigation.WebNavigationDesigner, WebNavigation" )]
    | |
    | | [ParseChildren(true, "Hyperlinks")]
    | |
    | | public class WebNavigation : WebControl
    | |
    | | {
    | |
    | |
    | | [DefaultValue(100)]
    | |
    | | [Browsable(true)]
    | |
    | | [Bindable ( true )]
    | |
    | | public override Unit Width
    | |
    | | {
    | |
    | | get
    | |
    | | {
    | |
    | | return base.Width;
    | |
    | | }
    | |
    | | set
    | |
    | | {
    | |
    | | base.Width = value;
    | |
    | | }
    | |
    | | }
    | |
    | | [Bindable ( true )]
    | |
    | | [Category ( "Appearance" )]
    | |
    | | [DefaultValue ( "" )]
    | |
    | | [Localizable ( true )]
    | |
    | | public string Caption
    | |
    | | {
    | |
    | | get
    | |
    | | {
    | |
    | | String s = (String) ViewState["Caption"];
    | |
    | | return ( ( s == null ) ? String.Empty : s );
    | |
    | | }
    | |
    | | set
    | |
    | | {
    | |
    | | ViewState["Caption"] = value;
    | |
    | | }
    | |
    | | }
    | |
    | |
    | | protected override void RenderContents ( HtmlTextWriter writer )
    | |
    | | {
    | |
    | | foreach ( HyperLink hl in _Hyperlinks )
    | |
    | | this.Controls.Add ( hl );
    | |
    | | base.RenderContents ( writer);
    | |
    | | }
    | |
    | | private List<HyperLink> _Hyperlinks;
    | |
    | | //[Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    | |
    | | [DesignerSerializationVisibility (
    | DesignerSerializationVisibility.Content)]
    | |
    | | [PersistenceMode ( PersistenceMode.InnerDefaultProperty)]
    | |
    | | public List<HyperLink> Hyperlinks
    | |
    | | {
    | |
    | | get
    | |
    | | {
    | |
    | | if ( _Hyperlinks == null )
    | |
    | | _Hyperlinks = new List<HyperLink> ();
    | |
    | | return _Hyperlinks;
    | |
    | | }
    | |
    | | set
    | |
    | | {
    | |
    | | foreach(HyperLink hl in value)
    | |
    | | this.Controls.Add(hl);
    | |
    | | _Hyperlinks = value;
    | |
    | | }
    | |
    | | }
    | |
    | |
    | | protected override void AddedControl ( Control control, int index )
    | |
    | | {
    | |
    | | base.AddedControl ( control, index );
    | |
    | | }
    | |
    | | }
    | |
    | | }
    | |
    | |
    | |
    | |
    | |
    |
    |
     
    Steven Cheng[MSFT], Nov 7, 2005
    #3
  4. Mirek Endys

    Mirek Endys Guest

    No, it is not working. I will try to explain it again.
    What I need
    ------------------------------------------------------
    I need to create my own Web Server Control.
    This control will contain a count of HyperLink controls.
    I need this control has design-time support:
    - I will add hyperlinks by design-time property toolbox.
    - This properties (including hyperlinks) will be stored and will be
    editable (add/remove)
    whole design time by property toolbox.
    - This control and its style will be displayed in design-time on the web
    page


    My control was able to edit hyperlinks, by property toolbox (collection
    editor)
    in designtime, but I can only add the HyperLinks but the second time
    I open the property collection editor, the hyperlinks are gone.
    Thats because they arent stored.

    I think, that the control must working by this way:
    - in case HyperLinks are edited (added, removed) they must be
    parsed from/to the page (or into the control) in design time.
    I was able (but not now) to parse them to page in design time, but not FROM
    page
    into property toolbox (collection editor)

    Well, and now, what I did
    --------------------------------------
    public class WebNavigationDesigner : ControlDesigner
    {
    public override string GetDesignTimeHtml()
    {
    WebNavigation wNavigation = (WebNavigation)Component;
    StringWriter sWriter = new StringWriter();
    HtmlTextWriter htWriter = new HtmlTextWriter(sWriter);
    foreach(HyperLink hyperlink in wNavigation.Hyperlinks)
    hyperlink.RenderControl(htWriter);

    return sWriter.ToString();
    }
    }

    [DefaultProperty("Hyperlinks")]
    [ToolboxData("<{0}:WebNavigation runat=server></{0}:WebNavigation>")]
    [Designer("WebNavigationDesigner", "WebNavigation")]
    [ParseChildren(true, "Hyperlinks")]
    public class WebNavigation : WebControl
    {
    private List<HyperLink> _Hyperlinks = null;

    protected override void RenderContents(HtmlTextWriter output)
    {
    foreach(HyperLink hLink in _Hyperlinks)
    hLink.RenderControl(output);
    }
    [Bindable(true)]
    [Category("Data")]
    [Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public List<HyperLink> Hyperlinks
    {
    get
    {
    if(_Hyperlinks == null)
    _Hyperlinks = new List<HyperLink>();
    return _Hyperlinks;
    }
    }
    }

    ==============================================================
    Thats simplified problem, please help me to get this simple
    control to life.

    Thanks

    Mirek
    --------------------------------------------------------------

    "Steven Cheng[MSFT]" <> wrote in message
    news:...
    > Hi Mirek,
    >
    > How are you doing on this issue. Does the suggestions in my last reply
    > helps you resolve the problem? if there're anything else we can help,
    > please feel free to post here. Thanks,
    >
    > Steven Cheng
    > Microsoft Online Support
    >
    > Get Secure! www.microsoft.com/security
    > (This posting is provided "AS IS", with no warranties, and confers no
    > rights.)
    >
    >
    >
    > --------------------
    > | X-Tomcat-ID: 120657561
    > | References: <#>
    > | MIME-Version: 1.0
    > | Content-Type: text/plain
    > | Content-Transfer-Encoding: 7bit
    > | From: (Steven Cheng[MSFT])
    > | Organization: Microsoft
    > | Date: Thu, 03 Nov 2005 06:57:47 GMT
    > | Subject: RE: WebControl with Collection Property in Design Time
    > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | Message-ID: <lYD#>
    > | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | Lines: 133
    > | Path: TK2MSFTNGXA01.phx.gbl
    > | Xref: TK2MSFTNGXA01.phx.gbl
    > microsoft.public.dotnet.framework.aspnet.webcontrols:11644
    > | NNTP-Posting-Host: TOMCATIMPORT1 10.201.218.122
    > |
    > | Hi Mirek,
    > |
    > | Welcome to ASPNET newsgroup.
    > | From you description, you're developing a custom web server control (in
    > | asp.net 2.0) which contains a collection property and you found that the
    > | control always throw out "could not be set on property" error when
    > | swtiching between HTML view and design-view in VS.NET IDE(2005) , YES?
    > |
    > | Based on my experience, this problem is caused by our Collection
    > property's
    > | declaration. For Collection property in .NET Custom Control, we can only
    > | provide getter accessor for it, in other world it should be defined as
    > | readonly. Like:
    > | ===========
    > | public List<HyperLink> Hyperlinks
    > | {
    > |
    > | get
    > | {
    > |
    > | if ( _Hyperlinks == null )
    > |
    > | _Hyperlinks = new List<HyperLink> ();
    > |
    > | return _Hyperlinks;
    > |
    > | }
    > |
    > | //no setter needed
    > |
    > | }
    > | ==============
    > |
    > | For Collection property, we just need to add/remove items from it, do
    > not
    > | need to modify the Collection reference itself. Also, we can find that
    > | those collection property in ASP.NET buildin controls are just defined
    > as
    > | readonly(Getter only...). So you can remove the setter accessor in your
    > | control's Hyperlinks property.
    > |
    > | Hope helps. Thanks,
    > |
    > | Steven Cheng
    > | Microsoft Online Support
    > |
    > | Get Secure! www.microsoft.com/security
    > | (This posting is provided "AS IS", with no warranties, and confers no
    > | rights.)
    > |
    > |
    > |
    > |
    > |
    > |
    > |
    > | --------------------
    > | | From: "Mirek Endys" <>
    > | | Subject: WebControl with Collection Property in Design Time
    > | | Date: Wed, 2 Nov 2005 12:54:02 +0100
    > | | Lines: 209
    > | | X-Priority: 3
    > | | X-MSMail-Priority: Normal
    > | | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    > | | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    > | | X-RFC2646: Format=Flowed; Original
    > | | Message-ID: <#>
    > | | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    > | | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    > | | Xref: TK2MSFTNGXA01.phx.gbl
    > | microsoft.public.dotnet.framework.aspnet.webcontrols:11628
    > | | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | |
    > | | Hallo,
    > | |
    > | | I need to create WebControl, that stores List of Hyperlinks.
    > | | I have problem in design-time.
    > | | When I add an hyperlinks, they are rendered in contents, hyperlinks
    > are
    > | | vsible on page.
    > | | In case I switch into source and then back into design, the control
    > says:
    > | |
    > | | Error Creating Control - WebNavigation1
    > | | 'cc1:WebNavigation' could not be set on property 'Hyperlinks'.
    > | |
    > | | Im wrong, but I dont know where. Could you help me? Source is bellow.
    > | |
    > | | using System;
    > | |
    > | | using System.IO;
    > | |
    > | | using System.Collections.Generic;
    > | |
    > | | using System.Collections;
    > | |
    > | | using System.Drawing.Design;
    > | |
    > | | using System.ComponentModel;
    > | |
    > | | using System.Text;
    > | |
    > | | using System.Web;
    > | |
    > | | using System.Web.UI;
    > | |
    > | | using System.Web.UI.Design;
    > | |
    > | | using System.Web.UI.WebControls;
    > | |
    > | | namespace WebNavigation
    > | |
    > | | {
    > | |
    > | | public class WebNavigationDesigner :
    > System.Web.UI.Design.ControlDesigner
    > | |
    > | | {
    > | |
    > | | public override string GetDesignTimeHtml ()
    > | |
    > | | {
    > | |
    > | | WebNavigation wn = (WebNavigation) Component;
    > | |
    > | | StringWriter sw = new StringWriter ();
    > | |
    > | | HtmlTextWriter tw = new HtmlTextWriter ( sw );
    > | |
    > | |
    > | | foreach ( HyperLink hl in wn.Hyperlinks )
    > | |
    > | | {
    > | |
    > | | hl.RenderControl ( tw );
    > | |
    > | | }
    > | |
    > | | return sw.ToString ();
    > | |
    > | |
    > | | }
    > | |
    > | | }
    > | |
    > | | //[DefaultProperty ( "Hyperlinks" )]
    > | |
    > | | [ToolboxData ( "<{0}:WebNavigation
    > runat=server></{0}:WebNavigation>" )]
    > | |
    > | | [Designer ( "WebNavigation.WebNavigationDesigner, WebNavigation" )]
    > | |
    > | | [ParseChildren(true, "Hyperlinks")]
    > | |
    > | | public class WebNavigation : WebControl
    > | |
    > | | {
    > | |
    > | |
    > | | [DefaultValue(100)]
    > | |
    > | | [Browsable(true)]
    > | |
    > | | [Bindable ( true )]
    > | |
    > | | public override Unit Width
    > | |
    > | | {
    > | |
    > | | get
    > | |
    > | | {
    > | |
    > | | return base.Width;
    > | |
    > | | }
    > | |
    > | | set
    > | |
    > | | {
    > | |
    > | | base.Width = value;
    > | |
    > | | }
    > | |
    > | | }
    > | |
    > | | [Bindable ( true )]
    > | |
    > | | [Category ( "Appearance" )]
    > | |
    > | | [DefaultValue ( "" )]
    > | |
    > | | [Localizable ( true )]
    > | |
    > | | public string Caption
    > | |
    > | | {
    > | |
    > | | get
    > | |
    > | | {
    > | |
    > | | String s = (String) ViewState["Caption"];
    > | |
    > | | return ( ( s == null ) ? String.Empty : s );
    > | |
    > | | }
    > | |
    > | | set
    > | |
    > | | {
    > | |
    > | | ViewState["Caption"] = value;
    > | |
    > | | }
    > | |
    > | | }
    > | |
    > | |
    > | | protected override void RenderContents ( HtmlTextWriter writer )
    > | |
    > | | {
    > | |
    > | | foreach ( HyperLink hl in _Hyperlinks )
    > | |
    > | | this.Controls.Add ( hl );
    > | |
    > | | base.RenderContents ( writer);
    > | |
    > | | }
    > | |
    > | | private List<HyperLink> _Hyperlinks;
    > | |
    > | | //[Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    > | |
    > | | [DesignerSerializationVisibility (
    > | DesignerSerializationVisibility.Content)]
    > | |
    > | | [PersistenceMode ( PersistenceMode.InnerDefaultProperty)]
    > | |
    > | | public List<HyperLink> Hyperlinks
    > | |
    > | | {
    > | |
    > | | get
    > | |
    > | | {
    > | |
    > | | if ( _Hyperlinks == null )
    > | |
    > | | _Hyperlinks = new List<HyperLink> ();
    > | |
    > | | return _Hyperlinks;
    > | |
    > | | }
    > | |
    > | | set
    > | |
    > | | {
    > | |
    > | | foreach(HyperLink hl in value)
    > | |
    > | | this.Controls.Add(hl);
    > | |
    > | | _Hyperlinks = value;
    > | |
    > | | }
    > | |
    > | | }
    > | |
    > | |
    > | | protected override void AddedControl ( Control control, int index )
    > | |
    > | | {
    > | |
    > | | base.AddedControl ( control, index );
    > | |
    > | | }
    > | |
    > | | }
    > | |
    > | | }
    > | |
    > | |
    > | |
    > | |
    > | |
    > |
    > |
    >
     
    Mirek Endys, Nov 11, 2005
    #4
  5. Hey Mirek,

    Thanks for getting back to me.
    I've just add your code to my VS.NET 2005 IDE and seems it report error
    when I just drag this control onto a form. Here the two things I found in
    the code you pasted:


    1. I think we should put some checking code to ensure that the collection
    is not empty. like:
    if (_Hyperlinks != null && _Hyperlinks.Count > 0)
    { ....}else{...}


    2. Why do you put the following Attribute on the HyperLinks property?

    [Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]

    Since HyperLink is buildin control types, the IDE can correctly use the
    property edit for it. Also, even if you use it, you should assign a valid
    Control Editor's typename rather than

    typeof(List<HyperLink> (this is a Class type , not Editor type....)


    After adjusting the above two things, here is the final code I got working
    correctly on myside. I can drag the control from ToolBox onto webform.
    Then, Edit the "HyperLinks" collection through property Grid( a Collection
    Editor) , and I can add /remove HyperLinks in the Collection and apply
    styles to each of the HyperLinks in the Collection. In addition, when I
    switch between DesignView and Html View, I can see the HyperLinnks has been
    persisted in HTML correctly. e.g:

    =================
    <cc1:WebNavigation ID="WebNavigation1" runat="server"
    Hyperlinks-Capacity="4">
    <asp:HyperLink runat="server" BackColor="Blue"
    BorderColor="#FFFF80" BorderStyle="Solid"
    BorderWidth="1px" ForeColor="Fuchsia"
    NavigateUrl="sdfsfdsfdsfdsfdsfsdfd"
    >HyperLink1</asp:HyperLink>

    <asp:HyperLink runat="server" NavigateUrl="sdfdsfdsfdsfsd"
    BackColor="Black" ForeColor="White" BorderStyle="Solid"
    BorderWidth="1px"
    BorderColor="Yellow">HyperLink2</asp:HyperLink>
    <asp:HyperLink runat="server"
    NavigateUrl="fdsfdsfdf">HyperLink3</asp:HyperLink>
    <asp:HyperLink runat="server" NavigateUrl="fdsfsdfsdfsf"
    BackColor="#FFFFC0" BorderColor="Purple" BorderStyle="Dashed"
    BorderWidth="2px" ForeColor="Navy">HyperLink4</asp:HyperLink>
    </cc1:WebNavigation>
    ====================


    Here is the modified code, you can have a try on your side. If you still
    get any problem on working on it at runtime or design-time, I think we have
    to do some further throubleshooting on environment specific issue. BTW, I'm
    using VS.NET 2005 Professional edition RTM.


    ===============================================
    namespace CustomControl
    {
    public class WebNavigationDesigner : ControlDesigner
    {
    public override string GetDesignTimeHtml()
    {
    WebNavigation wNavigation = (WebNavigation)Component;

    if (wNavigation.Hyperlinks != null &&
    wNavigation.Hyperlinks.Count > 0)
    {
    StringBuilder sb = new StringBuilder();
    StringWriter sWriter = new StringWriter(sb);
    HtmlTextWriter htWriter = new HtmlTextWriter(sWriter);
    foreach (HyperLink hyperlink in wNavigation.Hyperlinks)
    hyperlink.RenderControl(htWriter);

    return sWriter.ToString();
    }
    else
    {
    return "<font size='30'>Empty Collection.</font>";
    }
    }
    }

    [DefaultProperty("Hyperlinks")]
    [ToolboxData("<{0}:WebNavigation runat=server></{0}:WebNavigation>")]
    [Designer("WebNavigationDesigner", "WebNavigation")]
    [ParseChildren(true, "Hyperlinks")]
    public class WebNavigation : WebControl
    {
    private List<HyperLink> _Hyperlinks = null;

    protected override void RenderContents(HtmlTextWriter output)
    {
    if (_Hyperlinks != null && _Hyperlinks.Count > 0)
    {
    foreach (HyperLink hLink in _Hyperlinks)
    hLink.RenderControl(output);
    }
    else
    {
    Label lbl = new Label();
    lbl.ID = "lblMessage";
    lbl.Text = "Empty Collection.";
    lbl.RenderControl(output);
    }
    }
    [Bindable(true)]
    [Category("Data")]

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public List<HyperLink> Hyperlinks
    {
    get
    {
    if (_Hyperlinks == null)
    _Hyperlinks = new List<HyperLink>();

    return _Hyperlinks;
    }
    }
    }
    }
    ========================================================

    Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! www.microsoft.com/security
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)
    --------------------
    | From: "Mirek Endys" <>
    | References: <#>
    <lYD#>
    <>
    | Subject: Re: WebControl with Collection Property in Design Time
    | Date: Fri, 11 Nov 2005 09:33:52 +0100
    | Lines: 411
    | X-Priority: 3
    | X-MSMail-Priority: Normal
    | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    | X-RFC2646: Format=Flowed; Original
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    | Message-ID: <>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    | Xref: TK2MSFTNGXA02.phx.gbl
    microsoft.public.dotnet.framework.aspnet.webcontrols:31079
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    |
    | No, it is not working. I will try to explain it again.
    | What I need
    | ------------------------------------------------------
    | I need to create my own Web Server Control.
    | This control will contain a count of HyperLink controls.
    | I need this control has design-time support:
    | - I will add hyperlinks by design-time property toolbox.
    | - This properties (including hyperlinks) will be stored and will be
    | editable (add/remove)
    | whole design time by property toolbox.
    | - This control and its style will be displayed in design-time on the web
    | page
    |
    |
    | My control was able to edit hyperlinks, by property toolbox (collection
    | editor)
    | in designtime, but I can only add the HyperLinks but the second time
    | I open the property collection editor, the hyperlinks are gone.
    | Thats because they arent stored.
    |
    | I think, that the control must working by this way:
    | - in case HyperLinks are edited (added, removed) they must be
    | parsed from/to the page (or into the control) in design time.
    | I was able (but not now) to parse them to page in design time, but not
    FROM
    | page
    | into property toolbox (collection editor)
    |
    | Well, and now, what I did
    | --------------------------------------
    | public class WebNavigationDesigner : ControlDesigner
    | {
    | public override string GetDesignTimeHtml()
    | {
    | WebNavigation wNavigation = (WebNavigation)Component;
    | StringWriter sWriter = new StringWriter();
    | HtmlTextWriter htWriter = new HtmlTextWriter(sWriter);
    | foreach(HyperLink hyperlink in wNavigation.Hyperlinks)
    | hyperlink.RenderControl(htWriter);
    |
    | return sWriter.ToString();
    | }
    | }
    |
    | [DefaultProperty("Hyperlinks")]
    | [ToolboxData("<{0}:WebNavigation runat=server></{0}:WebNavigation>")]
    | [Designer("WebNavigationDesigner", "WebNavigation")]
    | [ParseChildren(true, "Hyperlinks")]
    | public class WebNavigation : WebControl
    | {
    | private List<HyperLink> _Hyperlinks = null;
    |
    | protected override void RenderContents(HtmlTextWriter output)
    | {
    | foreach(HyperLink hLink in _Hyperlinks)
    | hLink.RenderControl(output);
    | }
    | [Bindable(true)]
    | [Category("Data")]
    | [Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    |
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    | [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    | public List<HyperLink> Hyperlinks
    | {
    | get
    | {
    | if(_Hyperlinks == null)
    | _Hyperlinks = new List<HyperLink>();
    | return _Hyperlinks;
    | }
    | }
    | }
    |
    | ==============================================================
    | Thats simplified problem, please help me to get this simple
    | control to life.
    |
    | Thanks
    |
    | Mirek
    | --------------------------------------------------------------
    |
    | "Steven Cheng[MSFT]" <> wrote in message
    | news:...
    | > Hi Mirek,
    | >
    | > How are you doing on this issue. Does the suggestions in my last reply
    | > helps you resolve the problem? if there're anything else we can help,
    | > please feel free to post here. Thanks,
    | >
    | > Steven Cheng
    | > Microsoft Online Support
    | >
    | > Get Secure! www.microsoft.com/security
    | > (This posting is provided "AS IS", with no warranties, and confers no
    | > rights.)
    | >
    | >
    | >
    | > --------------------
    | > | X-Tomcat-ID: 120657561
    | > | References: <#>
    | > | MIME-Version: 1.0
    | > | Content-Type: text/plain
    | > | Content-Transfer-Encoding: 7bit
    | > | From: (Steven Cheng[MSFT])
    | > | Organization: Microsoft
    | > | Date: Thu, 03 Nov 2005 06:57:47 GMT
    | > | Subject: RE: WebControl with Collection Property in Design Time
    | > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | Message-ID: <lYD#>
    | > | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | Lines: 133
    | > | Path: TK2MSFTNGXA01.phx.gbl
    | > | Xref: TK2MSFTNGXA01.phx.gbl
    | > microsoft.public.dotnet.framework.aspnet.webcontrols:11644
    | > | NNTP-Posting-Host: TOMCATIMPORT1 10.201.218.122
    | > |
    | > | Hi Mirek,
    | > |
    | > | Welcome to ASPNET newsgroup.
    | > | From you description, you're developing a custom web server control
    (in
    | > | asp.net 2.0) which contains a collection property and you found that
    the
    | > | control always throw out "could not be set on property" error when
    | > | swtiching between HTML view and design-view in VS.NET IDE(2005) , YES?
    | > |
    | > | Based on my experience, this problem is caused by our Collection
    | > property's
    | > | declaration. For Collection property in .NET Custom Control, we can
    only
    | > | provide getter accessor for it, in other world it should be defined as
    | > | readonly. Like:
    | > | ===========
    | > | public List<HyperLink> Hyperlinks
    | > | {
    | > |
    | > | get
    | > | {
    | > |
    | > | if ( _Hyperlinks == null )
    | > |
    | > | _Hyperlinks = new List<HyperLink> ();
    | > |
    | > | return _Hyperlinks;
    | > |
    | > | }
    | > |
    | > | //no setter needed
    | > |
    | > | }
    | > | ==============
    | > |
    | > | For Collection property, we just need to add/remove items from it, do
    | > not
    | > | need to modify the Collection reference itself. Also, we can find that
    | > | those collection property in ASP.NET buildin controls are just
    defined
    | > as
    | > | readonly(Getter only...). So you can remove the setter accessor in
    your
    | > | control's Hyperlinks property.
    | > |
    | > | Hope helps. Thanks,
    | > |
    | > | Steven Cheng
    | > | Microsoft Online Support
    | > |
    | > | Get Secure! www.microsoft.com/security
    | > | (This posting is provided "AS IS", with no warranties, and confers no
    | > | rights.)
    | > |
    | > |
    | > |
    | > |
    | > |
    | > |
    | > |
    | > | --------------------
    | > | | From: "Mirek Endys" <>
    | > | | Subject: WebControl with Collection Property in Design Time
    | > | | Date: Wed, 2 Nov 2005 12:54:02 +0100
    | > | | Lines: 209
    | > | | X-Priority: 3
    | > | | X-MSMail-Priority: Normal
    | > | | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    | > | | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    | > | | X-RFC2646: Format=Flowed; Original
    | > | | Message-ID: <#>
    | > | | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    | > | | Path:
    TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    | > | | Xref: TK2MSFTNGXA01.phx.gbl
    | > | microsoft.public.dotnet.framework.aspnet.webcontrols:11628
    | > | | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | |
    | > | | Hallo,
    | > | |
    | > | | I need to create WebControl, that stores List of Hyperlinks.
    | > | | I have problem in design-time.
    | > | | When I add an hyperlinks, they are rendered in contents, hyperlinks
    | > are
    | > | | vsible on page.
    | > | | In case I switch into source and then back into design, the control
    | > says:
    | > | |
    | > | | Error Creating Control - WebNavigation1
    | > | | 'cc1:WebNavigation' could not be set on property 'Hyperlinks'.
    | > | |
    | > | | Im wrong, but I dont know where. Could you help me? Source is
    bellow.
    | > | |
    | > | | using System;
    | > | |
    | > | | using System.IO;
    | > | |
    | > | | using System.Collections.Generic;
    | > | |
    | > | | using System.Collections;
    | > | |
    | > | | using System.Drawing.Design;
    | > | |
    | > | | using System.ComponentModel;
    | > | |
    | > | | using System.Text;
    | > | |
    | > | | using System.Web;
    | > | |
    | > | | using System.Web.UI;
    | > | |
    | > | | using System.Web.UI.Design;
    | > | |
    | > | | using System.Web.UI.WebControls;
    | > | |
    | > | | namespace WebNavigation
    | > | |
    | > | | {
    | > | |
    | > | | public class WebNavigationDesigner :
    | > System.Web.UI.Design.ControlDesigner
    | > | |
    | > | | {
    | > | |
    | > | | public override string GetDesignTimeHtml ()
    | > | |
    | > | | {
    | > | |
    | > | | WebNavigation wn = (WebNavigation) Component;
    | > | |
    | > | | StringWriter sw = new StringWriter ();
    | > | |
    | > | | HtmlTextWriter tw = new HtmlTextWriter ( sw );
    | > | |
    | > | |
    | > | | foreach ( HyperLink hl in wn.Hyperlinks )
    | > | |
    | > | | {
    | > | |
    | > | | hl.RenderControl ( tw );
    | > | |
    | > | | }
    | > | |
    | > | | return sw.ToString ();
    | > | |
    | > | |
    | > | | }
    | > | |
    | > | | }
    | > | |
    | > | | //[DefaultProperty ( "Hyperlinks" )]
    | > | |
    | > | | [ToolboxData ( "<{0}:WebNavigation
    | > runat=server></{0}:WebNavigation>" )]
    | > | |
    | > | | [Designer ( "WebNavigation.WebNavigationDesigner, WebNavigation" )]
    | > | |
    | > | | [ParseChildren(true, "Hyperlinks")]
    | > | |
    | > | | public class WebNavigation : WebControl
    | > | |
    | > | | {
    | > | |
    | > | |
    | > | | [DefaultValue(100)]
    | > | |
    | > | | [Browsable(true)]
    | > | |
    | > | | [Bindable ( true )]
    | > | |
    | > | | public override Unit Width
    | > | |
    | > | | {
    | > | |
    | > | | get
    | > | |
    | > | | {
    | > | |
    | > | | return base.Width;
    | > | |
    | > | | }
    | > | |
    | > | | set
    | > | |
    | > | | {
    | > | |
    | > | | base.Width = value;
    | > | |
    | > | | }
    | > | |
    | > | | }
    | > | |
    | > | | [Bindable ( true )]
    | > | |
    | > | | [Category ( "Appearance" )]
    | > | |
    | > | | [DefaultValue ( "" )]
    | > | |
    | > | | [Localizable ( true )]
    | > | |
    | > | | public string Caption
    | > | |
    | > | | {
    | > | |
    | > | | get
    | > | |
    | > | | {
    | > | |
    | > | | String s = (String) ViewState["Caption"];
    | > | |
    | > | | return ( ( s == null ) ? String.Empty : s );
    | > | |
    | > | | }
    | > | |
    | > | | set
    | > | |
    | > | | {
    | > | |
    | > | | ViewState["Caption"] = value;
    | > | |
    | > | | }
    | > | |
    | > | | }
    | > | |
    | > | |
    | > | | protected override void RenderContents ( HtmlTextWriter writer )
    | > | |
    | > | | {
    | > | |
    | > | | foreach ( HyperLink hl in _Hyperlinks )
    | > | |
    | > | | this.Controls.Add ( hl );
    | > | |
    | > | | base.RenderContents ( writer);
    | > | |
    | > | | }
    | > | |
    | > | | private List<HyperLink> _Hyperlinks;
    | > | |
    | > | | //[Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    | > | |
    | > | | [DesignerSerializationVisibility (
    | > | DesignerSerializationVisibility.Content)]
    | > | |
    | > | | [PersistenceMode ( PersistenceMode.InnerDefaultProperty)]
    | > | |
    | > | | public List<HyperLink> Hyperlinks
    | > | |
    | > | | {
    | > | |
    | > | | get
    | > | |
    | > | | {
    | > | |
    | > | | if ( _Hyperlinks == null )
    | > | |
    | > | | _Hyperlinks = new List<HyperLink> ();
    | > | |
    | > | | return _Hyperlinks;
    | > | |
    | > | | }
    | > | |
    | > | | set
    | > | |
    | > | | {
    | > | |
    | > | | foreach(HyperLink hl in value)
    | > | |
    | > | | this.Controls.Add(hl);
    | > | |
    | > | | _Hyperlinks = value;
    | > | |
    | > | | }
    | > | |
    | > | | }
    | > | |
    | > | |
    | > | | protected override void AddedControl ( Control control, int index )
    | > | |
    | > | | {
    | > | |
    | > | | base.AddedControl ( control, index );
    | > | |
    | > | | }
    | > | |
    | > | | }
    | > | |
    | > | | }
    | > | |
    | > | |
    | > | |
    | > | |
    | > | |
    | > |
    | > |
    | >
    |
    |
    |
     
    Steven Cheng[MSFT], Nov 11, 2005
    #5
  6. Mirek Endys

    Mirek Endys Guest

    Great, you helped me a lot!!! These infos open me next door.
    Many thanks to you.


    "Steven Cheng[MSFT]" <> wrote in message
    news:...
    > Hey Mirek,
    >
    > Thanks for getting back to me.
    > I've just add your code to my VS.NET 2005 IDE and seems it report error
    > when I just drag this control onto a form. Here the two things I found in
    > the code you pasted:
    >
    >
    > 1. I think we should put some checking code to ensure that the collection
    > is not empty. like:
    > if (_Hyperlinks != null && _Hyperlinks.Count > 0)
    > { ....}else{...}
    >
    >
    > 2. Why do you put the following Attribute on the HyperLinks property?
    >
    > [Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    >
    > Since HyperLink is buildin control types, the IDE can correctly use the
    > property edit for it. Also, even if you use it, you should assign a valid
    > Control Editor's typename rather than
    >
    > typeof(List<HyperLink> (this is a Class type , not Editor type....)
    >
    >
    > After adjusting the above two things, here is the final code I got working
    > correctly on myside. I can drag the control from ToolBox onto webform.
    > Then, Edit the "HyperLinks" collection through property Grid( a Collection
    > Editor) , and I can add /remove HyperLinks in the Collection and apply
    > styles to each of the HyperLinks in the Collection. In addition, when I
    > switch between DesignView and Html View, I can see the HyperLinnks has
    > been
    > persisted in HTML correctly. e.g:
    >
    > =================
    > <cc1:WebNavigation ID="WebNavigation1" runat="server"
    > Hyperlinks-Capacity="4">
    > <asp:HyperLink runat="server" BackColor="Blue"
    > BorderColor="#FFFF80" BorderStyle="Solid"
    > BorderWidth="1px" ForeColor="Fuchsia"
    > NavigateUrl="sdfsfdsfdsfdsfdsfsdfd"
    > >HyperLink1</asp:HyperLink>

    > <asp:HyperLink runat="server" NavigateUrl="sdfdsfdsfdsfsd"
    > BackColor="Black" ForeColor="White" BorderStyle="Solid"
    > BorderWidth="1px"
    > BorderColor="Yellow">HyperLink2</asp:HyperLink>
    > <asp:HyperLink runat="server"
    > NavigateUrl="fdsfdsfdf">HyperLink3</asp:HyperLink>
    > <asp:HyperLink runat="server" NavigateUrl="fdsfsdfsdfsf"
    > BackColor="#FFFFC0" BorderColor="Purple" BorderStyle="Dashed"
    > BorderWidth="2px" ForeColor="Navy">HyperLink4</asp:HyperLink>
    > </cc1:WebNavigation>
    > ====================
    >
    >
    > Here is the modified code, you can have a try on your side. If you still
    > get any problem on working on it at runtime or design-time, I think we
    > have
    > to do some further throubleshooting on environment specific issue. BTW,
    > I'm
    > using VS.NET 2005 Professional edition RTM.
    >
    >
    > ===============================================
    > namespace CustomControl
    > {
    > public class WebNavigationDesigner : ControlDesigner
    > {
    > public override string GetDesignTimeHtml()
    > {
    > WebNavigation wNavigation = (WebNavigation)Component;
    >
    > if (wNavigation.Hyperlinks != null &&
    > wNavigation.Hyperlinks.Count > 0)
    > {
    > StringBuilder sb = new StringBuilder();
    > StringWriter sWriter = new StringWriter(sb);
    > HtmlTextWriter htWriter = new HtmlTextWriter(sWriter);
    > foreach (HyperLink hyperlink in wNavigation.Hyperlinks)
    > hyperlink.RenderControl(htWriter);
    >
    > return sWriter.ToString();
    > }
    > else
    > {
    > return "<font size='30'>Empty Collection.</font>";
    > }
    > }
    > }
    >
    > [DefaultProperty("Hyperlinks")]
    > [ToolboxData("<{0}:WebNavigation runat=server></{0}:WebNavigation>")]
    > [Designer("WebNavigationDesigner", "WebNavigation")]
    > [ParseChildren(true, "Hyperlinks")]
    > public class WebNavigation : WebControl
    > {
    > private List<HyperLink> _Hyperlinks = null;
    >
    > protected override void RenderContents(HtmlTextWriter output)
    > {
    > if (_Hyperlinks != null && _Hyperlinks.Count > 0)
    > {
    > foreach (HyperLink hLink in _Hyperlinks)
    > hLink.RenderControl(output);
    > }
    > else
    > {
    > Label lbl = new Label();
    > lbl.ID = "lblMessage";
    > lbl.Text = "Empty Collection.";
    > lbl.RenderControl(output);
    > }
    > }
    > [Bindable(true)]
    > [Category("Data")]
    >
    > [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    > [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    > public List<HyperLink> Hyperlinks
    > {
    > get
    > {
    > if (_Hyperlinks == null)
    > _Hyperlinks = new List<HyperLink>();
    >
    > return _Hyperlinks;
    > }
    > }
    > }
    > }
    > ========================================================
    >
    > Thanks,
    >
    > Steven Cheng
    > Microsoft Online Support
    >
    > Get Secure! www.microsoft.com/security
    > (This posting is provided "AS IS", with no warranties, and confers no
    > rights.)
    > --------------------
    > | From: "Mirek Endys" <>
    > | References: <#>
    > <lYD#>
    > <>
    > | Subject: Re: WebControl with Collection Property in Design Time
    > | Date: Fri, 11 Nov 2005 09:33:52 +0100
    > | Lines: 411
    > | X-Priority: 3
    > | X-MSMail-Priority: Normal
    > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    > | X-RFC2646: Format=Flowed; Original
    > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    > | Message-ID: <>
    > | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    > | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    > | Xref: TK2MSFTNGXA02.phx.gbl
    > microsoft.public.dotnet.framework.aspnet.webcontrols:31079
    > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    > |
    > | No, it is not working. I will try to explain it again.
    > | What I need
    > | ------------------------------------------------------
    > | I need to create my own Web Server Control.
    > | This control will contain a count of HyperLink controls.
    > | I need this control has design-time support:
    > | - I will add hyperlinks by design-time property toolbox.
    > | - This properties (including hyperlinks) will be stored and will be
    > | editable (add/remove)
    > | whole design time by property toolbox.
    > | - This control and its style will be displayed in design-time on the
    > web
    > | page
    > |
    > |
    > | My control was able to edit hyperlinks, by property toolbox (collection
    > | editor)
    > | in designtime, but I can only add the HyperLinks but the second time
    > | I open the property collection editor, the hyperlinks are gone.
    > | Thats because they arent stored.
    > |
    > | I think, that the control must working by this way:
    > | - in case HyperLinks are edited (added, removed) they must be
    > | parsed from/to the page (or into the control) in design time.
    > | I was able (but not now) to parse them to page in design time, but not
    > FROM
    > | page
    > | into property toolbox (collection editor)
    > |
    > | Well, and now, what I did
    > | --------------------------------------
    > | public class WebNavigationDesigner : ControlDesigner
    > | {
    > | public override string GetDesignTimeHtml()
    > | {
    > | WebNavigation wNavigation = (WebNavigation)Component;
    > | StringWriter sWriter = new StringWriter();
    > | HtmlTextWriter htWriter = new HtmlTextWriter(sWriter);
    > | foreach(HyperLink hyperlink in wNavigation.Hyperlinks)
    > | hyperlink.RenderControl(htWriter);
    > |
    > | return sWriter.ToString();
    > | }
    > | }
    > |
    > | [DefaultProperty("Hyperlinks")]
    > | [ToolboxData("<{0}:WebNavigation runat=server></{0}:WebNavigation>")]
    > | [Designer("WebNavigationDesigner", "WebNavigation")]
    > | [ParseChildren(true, "Hyperlinks")]
    > | public class WebNavigation : WebControl
    > | {
    > | private List<HyperLink> _Hyperlinks = null;
    > |
    > | protected override void RenderContents(HtmlTextWriter output)
    > | {
    > | foreach(HyperLink hLink in _Hyperlinks)
    > | hLink.RenderControl(output);
    > | }
    > | [Bindable(true)]
    > | [Category("Data")]
    > | [Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    > |
    > [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    > | [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    > | public List<HyperLink> Hyperlinks
    > | {
    > | get
    > | {
    > | if(_Hyperlinks == null)
    > | _Hyperlinks = new List<HyperLink>();
    > | return _Hyperlinks;
    > | }
    > | }
    > | }
    > |
    > | ==============================================================
    > | Thats simplified problem, please help me to get this simple
    > | control to life.
    > |
    > | Thanks
    > |
    > | Mirek
    > | --------------------------------------------------------------
    > |
    > | "Steven Cheng[MSFT]" <> wrote in message
    > | news:...
    > | > Hi Mirek,
    > | >
    > | > How are you doing on this issue. Does the suggestions in my last reply
    > | > helps you resolve the problem? if there're anything else we can help,
    > | > please feel free to post here. Thanks,
    > | >
    > | > Steven Cheng
    > | > Microsoft Online Support
    > | >
    > | > Get Secure! www.microsoft.com/security
    > | > (This posting is provided "AS IS", with no warranties, and confers no
    > | > rights.)
    > | >
    > | >
    > | >
    > | > --------------------
    > | > | X-Tomcat-ID: 120657561
    > | > | References: <#>
    > | > | MIME-Version: 1.0
    > | > | Content-Type: text/plain
    > | > | Content-Transfer-Encoding: 7bit
    > | > | From: (Steven Cheng[MSFT])
    > | > | Organization: Microsoft
    > | > | Date: Thu, 03 Nov 2005 06:57:47 GMT
    > | > | Subject: RE: WebControl with Collection Property in Design Time
    > | > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | > | Message-ID: <lYD#>
    > | > | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | > | Lines: 133
    > | > | Path: TK2MSFTNGXA01.phx.gbl
    > | > | Xref: TK2MSFTNGXA01.phx.gbl
    > | > microsoft.public.dotnet.framework.aspnet.webcontrols:11644
    > | > | NNTP-Posting-Host: TOMCATIMPORT1 10.201.218.122
    > | > |
    > | > | Hi Mirek,
    > | > |
    > | > | Welcome to ASPNET newsgroup.
    > | > | From you description, you're developing a custom web server control
    > (in
    > | > | asp.net 2.0) which contains a collection property and you found that
    > the
    > | > | control always throw out "could not be set on property" error when
    > | > | swtiching between HTML view and design-view in VS.NET IDE(2005) ,
    > YES?
    > | > |
    > | > | Based on my experience, this problem is caused by our Collection
    > | > property's
    > | > | declaration. For Collection property in .NET Custom Control, we can
    > only
    > | > | provide getter accessor for it, in other world it should be defined
    > as
    > | > | readonly. Like:
    > | > | ===========
    > | > | public List<HyperLink> Hyperlinks
    > | > | {
    > | > |
    > | > | get
    > | > | {
    > | > |
    > | > | if ( _Hyperlinks == null )
    > | > |
    > | > | _Hyperlinks = new List<HyperLink> ();
    > | > |
    > | > | return _Hyperlinks;
    > | > |
    > | > | }
    > | > |
    > | > | //no setter needed
    > | > |
    > | > | }
    > | > | ==============
    > | > |
    > | > | For Collection property, we just need to add/remove items from it,
    > do
    > | > not
    > | > | need to modify the Collection reference itself. Also, we can find
    > that
    > | > | those collection property in ASP.NET buildin controls are just
    > defined
    > | > as
    > | > | readonly(Getter only...). So you can remove the setter accessor in
    > your
    > | > | control's Hyperlinks property.
    > | > |
    > | > | Hope helps. Thanks,
    > | > |
    > | > | Steven Cheng
    > | > | Microsoft Online Support
    > | > |
    > | > | Get Secure! www.microsoft.com/security
    > | > | (This posting is provided "AS IS", with no warranties, and confers
    > no
    > | > | rights.)
    > | > |
    > | > |
    > | > |
    > | > |
    > | > |
    > | > |
    > | > |
    > | > | --------------------
    > | > | | From: "Mirek Endys" <>
    > | > | | Subject: WebControl with Collection Property in Design Time
    > | > | | Date: Wed, 2 Nov 2005 12:54:02 +0100
    > | > | | Lines: 209
    > | > | | X-Priority: 3
    > | > | | X-MSMail-Priority: Normal
    > | > | | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    > | > | | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    > | > | | X-RFC2646: Format=Flowed; Original
    > | > | | Message-ID: <#>
    > | > | | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | > | | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    > | > | | Path:
    > TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    > | > | | Xref: TK2MSFTNGXA01.phx.gbl
    > | > | microsoft.public.dotnet.framework.aspnet.webcontrols:11628
    > | > | | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    > | > | |
    > | > | | Hallo,
    > | > | |
    > | > | | I need to create WebControl, that stores List of Hyperlinks.
    > | > | | I have problem in design-time.
    > | > | | When I add an hyperlinks, they are rendered in contents,
    > hyperlinks
    > | > are
    > | > | | vsible on page.
    > | > | | In case I switch into source and then back into design, the
    > control
    > | > says:
    > | > | |
    > | > | | Error Creating Control - WebNavigation1
    > | > | | 'cc1:WebNavigation' could not be set on property 'Hyperlinks'.
    > | > | |
    > | > | | Im wrong, but I dont know where. Could you help me? Source is
    > bellow.
    > | > | |
    > | > | | using System;
    > | > | |
    > | > | | using System.IO;
    > | > | |
    > | > | | using System.Collections.Generic;
    > | > | |
    > | > | | using System.Collections;
    > | > | |
    > | > | | using System.Drawing.Design;
    > | > | |
    > | > | | using System.ComponentModel;
    > | > | |
    > | > | | using System.Text;
    > | > | |
    > | > | | using System.Web;
    > | > | |
    > | > | | using System.Web.UI;
    > | > | |
    > | > | | using System.Web.UI.Design;
    > | > | |
    > | > | | using System.Web.UI.WebControls;
    > | > | |
    > | > | | namespace WebNavigation
    > | > | |
    > | > | | {
    > | > | |
    > | > | | public class WebNavigationDesigner :
    > | > System.Web.UI.Design.ControlDesigner
    > | > | |
    > | > | | {
    > | > | |
    > | > | | public override string GetDesignTimeHtml ()
    > | > | |
    > | > | | {
    > | > | |
    > | > | | WebNavigation wn = (WebNavigation) Component;
    > | > | |
    > | > | | StringWriter sw = new StringWriter ();
    > | > | |
    > | > | | HtmlTextWriter tw = new HtmlTextWriter ( sw );
    > | > | |
    > | > | |
    > | > | | foreach ( HyperLink hl in wn.Hyperlinks )
    > | > | |
    > | > | | {
    > | > | |
    > | > | | hl.RenderControl ( tw );
    > | > | |
    > | > | | }
    > | > | |
    > | > | | return sw.ToString ();
    > | > | |
    > | > | |
    > | > | | }
    > | > | |
    > | > | | }
    > | > | |
    > | > | | //[DefaultProperty ( "Hyperlinks" )]
    > | > | |
    > | > | | [ToolboxData ( "<{0}:WebNavigation
    > | > runat=server></{0}:WebNavigation>" )]
    > | > | |
    > | > | | [Designer ( "WebNavigation.WebNavigationDesigner,
    > WebNavigation" )]
    > | > | |
    > | > | | [ParseChildren(true, "Hyperlinks")]
    > | > | |
    > | > | | public class WebNavigation : WebControl
    > | > | |
    > | > | | {
    > | > | |
    > | > | |
    > | > | | [DefaultValue(100)]
    > | > | |
    > | > | | [Browsable(true)]
    > | > | |
    > | > | | [Bindable ( true )]
    > | > | |
    > | > | | public override Unit Width
    > | > | |
    > | > | | {
    > | > | |
    > | > | | get
    > | > | |
    > | > | | {
    > | > | |
    > | > | | return base.Width;
    > | > | |
    > | > | | }
    > | > | |
    > | > | | set
    > | > | |
    > | > | | {
    > | > | |
    > | > | | base.Width = value;
    > | > | |
    > | > | | }
    > | > | |
    > | > | | }
    > | > | |
    > | > | | [Bindable ( true )]
    > | > | |
    > | > | | [Category ( "Appearance" )]
    > | > | |
    > | > | | [DefaultValue ( "" )]
    > | > | |
    > | > | | [Localizable ( true )]
    > | > | |
    > | > | | public string Caption
    > | > | |
    > | > | | {
    > | > | |
    > | > | | get
    > | > | |
    > | > | | {
    > | > | |
    > | > | | String s = (String) ViewState["Caption"];
    > | > | |
    > | > | | return ( ( s == null ) ? String.Empty : s );
    > | > | |
    > | > | | }
    > | > | |
    > | > | | set
    > | > | |
    > | > | | {
    > | > | |
    > | > | | ViewState["Caption"] = value;
    > | > | |
    > | > | | }
    > | > | |
    > | > | | }
    > | > | |
    > | > | |
    > | > | | protected override void RenderContents ( HtmlTextWriter writer )
    > | > | |
    > | > | | {
    > | > | |
    > | > | | foreach ( HyperLink hl in _Hyperlinks )
    > | > | |
    > | > | | this.Controls.Add ( hl );
    > | > | |
    > | > | | base.RenderContents ( writer);
    > | > | |
    > | > | | }
    > | > | |
    > | > | | private List<HyperLink> _Hyperlinks;
    > | > | |
    > | > | | //[Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    > | > | |
    > | > | | [DesignerSerializationVisibility (
    > | > | DesignerSerializationVisibility.Content)]
    > | > | |
    > | > | | [PersistenceMode ( PersistenceMode.InnerDefaultProperty)]
    > | > | |
    > | > | | public List<HyperLink> Hyperlinks
    > | > | |
    > | > | | {
    > | > | |
    > | > | | get
    > | > | |
    > | > | | {
    > | > | |
    > | > | | if ( _Hyperlinks == null )
    > | > | |
    > | > | | _Hyperlinks = new List<HyperLink> ();
    > | > | |
    > | > | | return _Hyperlinks;
    > | > | |
    > | > | | }
    > | > | |
    > | > | | set
    > | > | |
    > | > | | {
    > | > | |
    > | > | | foreach(HyperLink hl in value)
    > | > | |
    > | > | | this.Controls.Add(hl);
    > | > | |
    > | > | | _Hyperlinks = value;
    > | > | |
    > | > | | }
    > | > | |
    > | > | | }
    > | > | |
    > | > | |
    > | > | | protected override void AddedControl ( Control control, int
    > index )
    > | > | |
    > | > | | {
    > | > | |
    > | > | | base.AddedControl ( control, index );
    > | > | |
    > | > | | }
    > | > | |
    > | > | | }
    > | > | |
    > | > | | }
    > | > | |
    > | > | |
    > | > | |
    > | > | |
    > | > | |
    > | > |
    > | > |
    > | >
    > |
    > |
    > |
    >
     
    Mirek Endys, Nov 11, 2005
    #6
  7. You're welcome Mirek,

    Regards,

    Steven Cheng
    Microsoft Online Support

    Get Secure! www.microsoft.com/security
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)
    --------------------
    | From: "Mirek Endys" <>
    | References: <#>
    <lYD#>
    <>
    <>
    <>
    | Subject: Re: WebControl with Collection Property in Design Time
    | Date: Fri, 11 Nov 2005 11:10:38 +0100
    | Lines: 601
    | X-Priority: 3
    | X-MSMail-Priority: Normal
    | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    | X-RFC2646: Format=Flowed; Original
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    | Message-ID: <>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
    | Xref: TK2MSFTNGXA02.phx.gbl
    microsoft.public.dotnet.framework.aspnet.webcontrols:31081
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    |
    | Great, you helped me a lot!!! These infos open me next door.
    | Many thanks to you.
    |
    |
    | "Steven Cheng[MSFT]" <> wrote in message
    | news:...
    | > Hey Mirek,
    | >
    | > Thanks for getting back to me.
    | > I've just add your code to my VS.NET 2005 IDE and seems it report error
    | > when I just drag this control onto a form. Here the two things I found
    in
    | > the code you pasted:
    | >
    | >
    | > 1. I think we should put some checking code to ensure that the
    collection
    | > is not empty. like:
    | > if (_Hyperlinks != null && _Hyperlinks.Count > 0)
    | > { ....}else{...}
    | >
    | >
    | > 2. Why do you put the following Attribute on the HyperLinks property?
    | >
    | > [Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    | >
    | > Since HyperLink is buildin control types, the IDE can correctly use the
    | > property edit for it. Also, even if you use it, you should assign a
    valid
    | > Control Editor's typename rather than
    | >
    | > typeof(List<HyperLink> (this is a Class type , not Editor type....)
    | >
    | >
    | > After adjusting the above two things, here is the final code I got
    working
    | > correctly on myside. I can drag the control from ToolBox onto webform.
    | > Then, Edit the "HyperLinks" collection through property Grid( a
    Collection
    | > Editor) , and I can add /remove HyperLinks in the Collection and apply
    | > styles to each of the HyperLinks in the Collection. In addition, when I
    | > switch between DesignView and Html View, I can see the HyperLinnks has
    | > been
    | > persisted in HTML correctly. e.g:
    | >
    | > =================
    | > <cc1:WebNavigation ID="WebNavigation1" runat="server"
    | > Hyperlinks-Capacity="4">
    | > <asp:HyperLink runat="server" BackColor="Blue"
    | > BorderColor="#FFFF80" BorderStyle="Solid"
    | > BorderWidth="1px" ForeColor="Fuchsia"
    | > NavigateUrl="sdfsfdsfdsfdsfdsfsdfd"
    | > >HyperLink1</asp:HyperLink>
    | > <asp:HyperLink runat="server" NavigateUrl="sdfdsfdsfdsfsd"
    | > BackColor="Black" ForeColor="White" BorderStyle="Solid"
    | > BorderWidth="1px"
    | > BorderColor="Yellow">HyperLink2</asp:HyperLink>
    | > <asp:HyperLink runat="server"
    | > NavigateUrl="fdsfdsfdf">HyperLink3</asp:HyperLink>
    | > <asp:HyperLink runat="server" NavigateUrl="fdsfsdfsdfsf"
    | > BackColor="#FFFFC0" BorderColor="Purple" BorderStyle="Dashed"
    | > BorderWidth="2px" ForeColor="Navy">HyperLink4</asp:HyperLink>
    | > </cc1:WebNavigation>
    | > ====================
    | >
    | >
    | > Here is the modified code, you can have a try on your side. If you
    still
    | > get any problem on working on it at runtime or design-time, I think we
    | > have
    | > to do some further throubleshooting on environment specific issue. BTW,
    | > I'm
    | > using VS.NET 2005 Professional edition RTM.
    | >
    | >
    | > ===============================================
    | > namespace CustomControl
    | > {
    | > public class WebNavigationDesigner : ControlDesigner
    | > {
    | > public override string GetDesignTimeHtml()
    | > {
    | > WebNavigation wNavigation = (WebNavigation)Component;
    | >
    | > if (wNavigation.Hyperlinks != null &&
    | > wNavigation.Hyperlinks.Count > 0)
    | > {
    | > StringBuilder sb = new StringBuilder();
    | > StringWriter sWriter = new StringWriter(sb);
    | > HtmlTextWriter htWriter = new HtmlTextWriter(sWriter);
    | > foreach (HyperLink hyperlink in wNavigation.Hyperlinks)
    | > hyperlink.RenderControl(htWriter);
    | >
    | > return sWriter.ToString();
    | > }
    | > else
    | > {
    | > return "<font size='30'>Empty Collection.</font>";
    | > }
    | > }
    | > }
    | >
    | > [DefaultProperty("Hyperlinks")]
    | > [ToolboxData("<{0}:WebNavigation runat=server></{0}:WebNavigation>")]
    | > [Designer("WebNavigationDesigner", "WebNavigation")]
    | > [ParseChildren(true, "Hyperlinks")]
    | > public class WebNavigation : WebControl
    | > {
    | > private List<HyperLink> _Hyperlinks = null;
    | >
    | > protected override void RenderContents(HtmlTextWriter output)
    | > {
    | > if (_Hyperlinks != null && _Hyperlinks.Count > 0)
    | > {
    | > foreach (HyperLink hLink in _Hyperlinks)
    | > hLink.RenderControl(output);
    | > }
    | > else
    | > {
    | > Label lbl = new Label();
    | > lbl.ID = "lblMessage";
    | > lbl.Text = "Empty Collection.";
    | > lbl.RenderControl(output);
    | > }
    | > }
    | > [Bindable(true)]
    | > [Category("Data")]
    | >
    | >
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    | > [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    | > public List<HyperLink> Hyperlinks
    | > {
    | > get
    | > {
    | > if (_Hyperlinks == null)
    | > _Hyperlinks = new List<HyperLink>();
    | >
    | > return _Hyperlinks;
    | > }
    | > }
    | > }
    | > }
    | > ========================================================
    | >
    | > Thanks,
    | >
    | > Steven Cheng
    | > Microsoft Online Support
    | >
    | > Get Secure! www.microsoft.com/security
    | > (This posting is provided "AS IS", with no warranties, and confers no
    | > rights.)
    | > --------------------
    | > | From: "Mirek Endys" <>
    | > | References: <#>
    | > <lYD#>
    | > <>
    | > | Subject: Re: WebControl with Collection Property in Design Time
    | > | Date: Fri, 11 Nov 2005 09:33:52 +0100
    | > | Lines: 411
    | > | X-Priority: 3
    | > | X-MSMail-Priority: Normal
    | > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    | > | X-RFC2646: Format=Flowed; Original
    | > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    | > | Message-ID: <>
    | > | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    | > | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    | > | Xref: TK2MSFTNGXA02.phx.gbl
    | > microsoft.public.dotnet.framework.aspnet.webcontrols:31079
    | > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > |
    | > | No, it is not working. I will try to explain it again.
    | > | What I need
    | > | ------------------------------------------------------
    | > | I need to create my own Web Server Control.
    | > | This control will contain a count of HyperLink controls.
    | > | I need this control has design-time support:
    | > | - I will add hyperlinks by design-time property toolbox.
    | > | - This properties (including hyperlinks) will be stored and will be
    | > | editable (add/remove)
    | > | whole design time by property toolbox.
    | > | - This control and its style will be displayed in design-time on the
    | > web
    | > | page
    | > |
    | > |
    | > | My control was able to edit hyperlinks, by property toolbox
    (collection
    | > | editor)
    | > | in designtime, but I can only add the HyperLinks but the second time
    | > | I open the property collection editor, the hyperlinks are gone.
    | > | Thats because they arent stored.
    | > |
    | > | I think, that the control must working by this way:
    | > | - in case HyperLinks are edited (added, removed) they must be
    | > | parsed from/to the page (or into the control) in design time.
    | > | I was able (but not now) to parse them to page in design time, but not
    | > FROM
    | > | page
    | > | into property toolbox (collection editor)
    | > |
    | > | Well, and now, what I did
    | > | --------------------------------------
    | > | public class WebNavigationDesigner : ControlDesigner
    | > | {
    | > | public override string GetDesignTimeHtml()
    | > | {
    | > | WebNavigation wNavigation = (WebNavigation)Component;
    | > | StringWriter sWriter = new StringWriter();
    | > | HtmlTextWriter htWriter = new HtmlTextWriter(sWriter);
    | > | foreach(HyperLink hyperlink in wNavigation.Hyperlinks)
    | > | hyperlink.RenderControl(htWriter);
    | > |
    | > | return sWriter.ToString();
    | > | }
    | > | }
    | > |
    | > | [DefaultProperty("Hyperlinks")]
    | > | [ToolboxData("<{0}:WebNavigation runat=server></{0}:WebNavigation>")]
    | > | [Designer("WebNavigationDesigner", "WebNavigation")]
    | > | [ParseChildren(true, "Hyperlinks")]
    | > | public class WebNavigation : WebControl
    | > | {
    | > | private List<HyperLink> _Hyperlinks = null;
    | > |
    | > | protected override void RenderContents(HtmlTextWriter output)
    | > | {
    | > | foreach(HyperLink hLink in _Hyperlinks)
    | > | hLink.RenderControl(output);
    | > | }
    | > | [Bindable(true)]
    | > | [Category("Data")]
    | > | [Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    | > |
    | >
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    | > | [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    | > | public List<HyperLink> Hyperlinks
    | > | {
    | > | get
    | > | {
    | > | if(_Hyperlinks == null)
    | > | _Hyperlinks = new List<HyperLink>();
    | > | return _Hyperlinks;
    | > | }
    | > | }
    | > | }
    | > |
    | > | ==============================================================
    | > | Thats simplified problem, please help me to get this simple
    | > | control to life.
    | > |
    | > | Thanks
    | > |
    | > | Mirek
    | > | --------------------------------------------------------------
    | > |
    | > | "Steven Cheng[MSFT]" <> wrote in message
    | > | news:...
    | > | > Hi Mirek,
    | > | >
    | > | > How are you doing on this issue. Does the suggestions in my last
    reply
    | > | > helps you resolve the problem? if there're anything else we can
    help,
    | > | > please feel free to post here. Thanks,
    | > | >
    | > | > Steven Cheng
    | > | > Microsoft Online Support
    | > | >
    | > | > Get Secure! www.microsoft.com/security
    | > | > (This posting is provided "AS IS", with no warranties, and confers
    no
    | > | > rights.)
    | > | >
    | > | >
    | > | >
    | > | > --------------------
    | > | > | X-Tomcat-ID: 120657561
    | > | > | References: <#>
    | > | > | MIME-Version: 1.0
    | > | > | Content-Type: text/plain
    | > | > | Content-Transfer-Encoding: 7bit
    | > | > | From: (Steven Cheng[MSFT])
    | > | > | Organization: Microsoft
    | > | > | Date: Thu, 03 Nov 2005 06:57:47 GMT
    | > | > | Subject: RE: WebControl with Collection Property in Design Time
    | > | > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | > | Message-ID: <lYD#>
    | > | > | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | > | Lines: 133
    | > | > | Path: TK2MSFTNGXA01.phx.gbl
    | > | > | Xref: TK2MSFTNGXA01.phx.gbl
    | > | > microsoft.public.dotnet.framework.aspnet.webcontrols:11644
    | > | > | NNTP-Posting-Host: TOMCATIMPORT1 10.201.218.122
    | > | > |
    | > | > | Hi Mirek,
    | > | > |
    | > | > | Welcome to ASPNET newsgroup.
    | > | > | From you description, you're developing a custom web server
    control
    | > (in
    | > | > | asp.net 2.0) which contains a collection property and you found
    that
    | > the
    | > | > | control always throw out "could not be set on property" error when
    | > | > | swtiching between HTML view and design-view in VS.NET IDE(2005) ,
    | > YES?
    | > | > |
    | > | > | Based on my experience, this problem is caused by our Collection
    | > | > property's
    | > | > | declaration. For Collection property in .NET Custom Control, we
    can
    | > only
    | > | > | provide getter accessor for it, in other world it should be
    defined
    | > as
    | > | > | readonly. Like:
    | > | > | ===========
    | > | > | public List<HyperLink> Hyperlinks
    | > | > | {
    | > | > |
    | > | > | get
    | > | > | {
    | > | > |
    | > | > | if ( _Hyperlinks == null )
    | > | > |
    | > | > | _Hyperlinks = new List<HyperLink> ();
    | > | > |
    | > | > | return _Hyperlinks;
    | > | > |
    | > | > | }
    | > | > |
    | > | > | //no setter needed
    | > | > |
    | > | > | }
    | > | > | ==============
    | > | > |
    | > | > | For Collection property, we just need to add/remove items from
    it,
    | > do
    | > | > not
    | > | > | need to modify the Collection reference itself. Also, we can find
    | > that
    | > | > | those collection property in ASP.NET buildin controls are just
    | > defined
    | > | > as
    | > | > | readonly(Getter only...). So you can remove the setter accessor in
    | > your
    | > | > | control's Hyperlinks property.
    | > | > |
    | > | > | Hope helps. Thanks,
    | > | > |
    | > | > | Steven Cheng
    | > | > | Microsoft Online Support
    | > | > |
    | > | > | Get Secure! www.microsoft.com/security
    | > | > | (This posting is provided "AS IS", with no warranties, and
    confers
    | > no
    | > | > | rights.)
    | > | > |
    | > | > |
    | > | > |
    | > | > |
    | > | > |
    | > | > |
    | > | > |
    | > | > | --------------------
    | > | > | | From: "Mirek Endys" <>
    | > | > | | Subject: WebControl with Collection Property in Design Time
    | > | > | | Date: Wed, 2 Nov 2005 12:54:02 +0100
    | > | > | | Lines: 209
    | > | > | | X-Priority: 3
    | > | > | | X-MSMail-Priority: Normal
    | > | > | | X-Newsreader: Microsoft Outlook Express 6.00.2900.2670
    | > | > | | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
    | > | > | | X-RFC2646: Format=Flowed; Original
    | > | > | | Message-ID: <#>
    | > | > | | Newsgroups: microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | > | | NNTP-Posting-Host: gw.coty.cz 195.47.52.129
    | > | > | | Path:
    | > TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
    | > | > | | Xref: TK2MSFTNGXA01.phx.gbl
    | > | > | microsoft.public.dotnet.framework.aspnet.webcontrols:11628
    | > | > | | X-Tomcat-NG:
    microsoft.public.dotnet.framework.aspnet.webcontrols
    | > | > | |
    | > | > | | Hallo,
    | > | > | |
    | > | > | | I need to create WebControl, that stores List of Hyperlinks.
    | > | > | | I have problem in design-time.
    | > | > | | When I add an hyperlinks, they are rendered in contents,
    | > hyperlinks
    | > | > are
    | > | > | | vsible on page.
    | > | > | | In case I switch into source and then back into design, the
    | > control
    | > | > says:
    | > | > | |
    | > | > | | Error Creating Control - WebNavigation1
    | > | > | | 'cc1:WebNavigation' could not be set on property 'Hyperlinks'.
    | > | > | |
    | > | > | | Im wrong, but I dont know where. Could you help me? Source is
    | > bellow.
    | > | > | |
    | > | > | | using System;
    | > | > | |
    | > | > | | using System.IO;
    | > | > | |
    | > | > | | using System.Collections.Generic;
    | > | > | |
    | > | > | | using System.Collections;
    | > | > | |
    | > | > | | using System.Drawing.Design;
    | > | > | |
    | > | > | | using System.ComponentModel;
    | > | > | |
    | > | > | | using System.Text;
    | > | > | |
    | > | > | | using System.Web;
    | > | > | |
    | > | > | | using System.Web.UI;
    | > | > | |
    | > | > | | using System.Web.UI.Design;
    | > | > | |
    | > | > | | using System.Web.UI.WebControls;
    | > | > | |
    | > | > | | namespace WebNavigation
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | public class WebNavigationDesigner :
    | > | > System.Web.UI.Design.ControlDesigner
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | public override string GetDesignTimeHtml ()
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | WebNavigation wn = (WebNavigation) Component;
    | > | > | |
    | > | > | | StringWriter sw = new StringWriter ();
    | > | > | |
    | > | > | | HtmlTextWriter tw = new HtmlTextWriter ( sw );
    | > | > | |
    | > | > | |
    | > | > | | foreach ( HyperLink hl in wn.Hyperlinks )
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | hl.RenderControl ( tw );
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | return sw.ToString ();
    | > | > | |
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | //[DefaultProperty ( "Hyperlinks" )]
    | > | > | |
    | > | > | | [ToolboxData ( "<{0}:WebNavigation
    | > | > runat=server></{0}:WebNavigation>" )]
    | > | > | |
    | > | > | | [Designer ( "WebNavigation.WebNavigationDesigner,
    | > WebNavigation" )]
    | > | > | |
    | > | > | | [ParseChildren(true, "Hyperlinks")]
    | > | > | |
    | > | > | | public class WebNavigation : WebControl
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | |
    | > | > | | [DefaultValue(100)]
    | > | > | |
    | > | > | | [Browsable(true)]
    | > | > | |
    | > | > | | [Bindable ( true )]
    | > | > | |
    | > | > | | public override Unit Width
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | get
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | return base.Width;
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | set
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | base.Width = value;
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | [Bindable ( true )]
    | > | > | |
    | > | > | | [Category ( "Appearance" )]
    | > | > | |
    | > | > | | [DefaultValue ( "" )]
    | > | > | |
    | > | > | | [Localizable ( true )]
    | > | > | |
    | > | > | | public string Caption
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | get
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | String s = (String) ViewState["Caption"];
    | > | > | |
    | > | > | | return ( ( s == null ) ? String.Empty : s );
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | set
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | ViewState["Caption"] = value;
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | |
    | > | > | | protected override void RenderContents ( HtmlTextWriter writer )
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | foreach ( HyperLink hl in _Hyperlinks )
    | > | > | |
    | > | > | | this.Controls.Add ( hl );
    | > | > | |
    | > | > | | base.RenderContents ( writer);
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | private List<HyperLink> _Hyperlinks;
    | > | > | |
    | > | > | | //[Editor(typeof(List<HyperLink>), typeof(UITypeEditor))]
    | > | > | |
    | > | > | | [DesignerSerializationVisibility (
    | > | > | DesignerSerializationVisibility.Content)]
    | > | > | |
    | > | > | | [PersistenceMode ( PersistenceMode.InnerDefaultProperty)]
    | > | > | |
    | > | > | | public List<HyperLink> Hyperlinks
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | get
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | if ( _Hyperlinks == null )
    | > | > | |
    | > | > | | _Hyperlinks = new List<HyperLink> ();
    | > | > | |
    | > | > | | return _Hyperlinks;
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | set
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | foreach(HyperLink hl in value)
    | > | > | |
    | > | > | | this.Controls.Add(hl);
    | > | > | |
    | > | > | | _Hyperlinks = value;
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | |
    | > | > | | protected override void AddedControl ( Control control, int
    | > index )
    | > | > | |
    | > | > | | {
    | > | > | |
    | > | > | | base.AddedControl ( control, index );
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | | }
    | > | > | |
    | > | > | |
    | > | > | |
    | > | > | |
    | > | > | |
    | > | > |
    | > | > |
    | > | >
    | > |
    | > |
    | > |
    | >
    |
    |
    |
     
    Steven Cheng[MSFT], Nov 11, 2005
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Øyvind Isaksen
    Replies:
    1
    Views:
    1,013
    Øyvind Isaksen
    May 18, 2007
  2. Bob Brunton
    Replies:
    9
    Views:
    220
    Alessandro Zifiglio
    Feb 16, 2004
  3. Replies:
    1
    Views:
    313
    Tim Dot NoSpam
    May 19, 2006
  4. Peter Morris [Air Software Ltd]

    WebControl with non-WebControl property

    Peter Morris [Air Software Ltd], Dec 7, 2004, in forum: ASP .Net Web Controls
    Replies:
    1
    Views:
    144
    Peter Morris [Air Software Ltd]
    Dec 7, 2004
  5. Replies:
    3
    Views:
    150
    Brock Allen
    Mar 16, 2005
Loading...

Share This Page