Question

I wanna create a server control like the following :

<%@ Register Assembly="MdsAccordionMenu" Namespace="MdsAccordionMenu" TagPrefix="cc1" %>

<cc1:MdsAccordionMenu ID="MdsAccordionMenu1" runat="server">
    <MdsAccordionMenuItem Title="Some Title">
        <MdsAccordionMenuItem Text="some text" Link="http://" IconUrl="image.png" />
        <MdsAccordionMenuItem Text="some text" Link="http://" IconUrl="image.png" />
        <MdsAccordionMenuItem Text="some text" Link="http://" IconUrl="image.png" />
        <MdsAccordionMenuItem Text="some text" Link="http://" IconUrl="image.png" />
    </MdsAccordionMenuItem>
</cc1:MdsAccordionMenu> 


I written the following c# code , but it doesn't work :

MdsAccordionMenu.cs :

namespace MdsAccordionMenu
{
    [ToolboxData("<{0}:MdsAccordionMenu runat=server></{0}:MdsAccordionMenu>")]
    [ParseChildren(true, "MdsAccordionMenuItems")]
    [DefaultProperty("MdsAccordionMenuItems")]
    [Serializable]
    public class MdsAccordionMenu : WebControl
    {
        [Description("سرعت نمایش انیمیشن")]
        [DefaultValue(500)]
        public int AnimationSpeed { get; set; }

        [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
        public List<MdsAccordionMenuItem> MdsAccordionMenuItems { get; set; }
    }
}


MdsAccordionMenuItem.cs :

namespace MdsAccordionMenu
{
    //[TypeConverter(typeof(ExpandableObjectConverter))]
    [ParseChildren(true, "MdsAccordionItems")]
    [DefaultProperty("Title")]
    [Serializable]
    public class MdsAccordionMenuItem
    {
        [Description("تیتر منو")]
        [DefaultValue("Title")]
        [NotifyParentProperty(true)]
        public string Title { get; set; }

        [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
        [NotifyParentProperty(true)]
        public List<MdsAccordionItem> MdsAccordionItems { get; set; }
    }
}


MdsAccordionItem .cs:

namespace MdsAccordionMenu
{
    [Serializable]
    public class MdsAccordionItem : INamingContainer
    {
        [NotifyParentProperty(true)]
        [Description("متن")]
        public string Text { get; set; }

        [NotifyParentProperty(true)]
        [Description("آدرس لینک منو")]
        public string Link { get; set; }

        [NotifyParentProperty(true)]
        [Description("آدرس آیکون")]
        public string ImageUrl { get; set; }
    }
}

How can I do it?

Was it helpful?

Solution 2

I could resolve the problem

MdsAccordionMenu.cs

[ToolboxData("<{0}:MdsAccordionMenu runat=server></{0}:MdsAccordionMenu>")]
[ParseChildren(true, "MdsAccordionMenuItems")]
[DefaultProperty("MdsAccordionMenuItems")]
[PersistChildren(true)]
[TypeConverter(typeof(ExpandableObjectConverter))]
[Serializable]
public sealed class MdsAccordionMenu : WebControl, INamingContainer
{
    #region Properties

    public int AnimationSpeed { get; set; }

    public string InlineStyle { get; set; }

    [Bindable(true)]
    [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public MdsAccordionMenuItemsClass MdsAccordionMenuItems
    {
        get { return _mdsAccordionMenuItem ?? new MdsAccordionMenuItemsClass(); }
        set { _mdsAccordionMenuItem = value; }
    }

    private MdsAccordionMenuItemsClass _mdsAccordionMenuItem;
}

MdsAccordionMenuItem.cs

[Serializable]
public class MdsAccordionMenuItemsClass : List<MdsAccordionMenuItem>
{

}

[ParseChildren(true, "MdsAccordionItems")]
[PersistChildren(true)]
[Serializable]
public class MdsAccordionMenuItem : INamingContainer
{
    public string Title { get; set; }

    private MdsAccordionItemsClass _mdsAccordionItems;

    [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [Bindable(true)]
    public MdsAccordionItemsClass MdsAccordionItems
    {
        get { return _mdsAccordionItems ?? new MdsAccordionItemsClass(); }
        set { _mdsAccordionItems = value; }
    }
}

MdsAccordionItem.cs

[Serializable]
public class MdsAccordionItemsClass : List<MdsAccordionItem>
{

}

[Serializable]
[ParseChildren(true, "MdsAccordionSubMenuItems")]
[PersistChildren(true)]
public class MdsAccordionItem : INamingContainer
{
    public string Text { get; set; }

    private bool _visible = true;
    public bool Visible
    {
        get { return this._visible; } 
        set { this._visible = value; }
    }

    public string Link { get; set; }

    public string ImageUrl { get; set; }

    private MdsAccordionItemsClass _mdsAccordionSubMenuItems;

    [Bindable(true)]
    [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public MdsAccordionItemsClass MdsAccordionSubMenuItems
    {
        get { return _mdsAccordionSubMenuItems ?? new MdsAccordionItemsClass(); }
        set { _mdsAccordionSubMenuItems = value; }
    }
}

Now, I can create the control in designer mode with the following code :

<cc1:MdsAccordionMenu ID="MdsAccordionMenu1" runat="server" EnableViewState="True">
    <MdsAccordionMenuItems>
        <cc1:MdsAccordionMenuItem Title="Submit">
            <MdsAccordionItems>
                <cc1:MdsAccordionItem Text="Item 01" Link="#" ImageUrl="~/style/icons/lightbulb.png" />
                <cc1:MdsAccordionItem Text="Item 02" Link="#" ImageUrl="~/style/myImages/question.png" />
                <cc1:MdsAccordionItem Text="Item 03" Link="#" ImageUrl="~/style/myImages/request-knowledge.png" />
                <cc1:MdsAccordionItem Text="Item 04" Link="#" ImageUrl="~/style/myImages/document.png" />
                <cc1:MdsAccordionItem Text="Item 05" Link="#" ImageUrl="~/style/myImages/book.png" />
                <cc1:MdsAccordionItem Text="Item 06" Link="#" ImageUrl="~/style/myImages/document1.png" />
            </MdsAccordionItems>
        </cc1:MdsAccordionMenuItem>
    </MdsAccordionMenuItems>
</cc1:MdsAccordionMenu>

OTHER TIPS

According to your c# code, the markup should be as follows...

<cc1:MdsAccordionMenu ID="MdsAccordionMenu1" runat="server">
            <MdsAccordionMenuItems>
                <cc1:MdsAccordionMenuItem Title="hello">
                    <MdsAccordionItems>
                        <cc1:MdsAccordionItem Text="Text"  Link="http://www.google.com" ImageUrl="~/Image.jpg" />
                    </MdsAccordionItems>
                </cc1:MdsAccordionMenuItem>
            </MdsAccordionMenuItems>
        </cc1:MdsAccordionMenu>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top