Need help persisting arraylist property.

Discussion in 'ASP .Net Building Controls' started by Jeremy Chapman, Feb 18, 2006.

  1. I have included below virtually all the code to a control I'm trying to
    build. My issue is that an array list property in my control does not get
    persisted properly to the aspx page code in design time. If I type the code
    in the aspx manually it does get parsed correctly though.

    This is an example of the aspx code that gets parsed correctly. For some
    reason, if I changed update the Tab property of the control through the GUI
    at design time, the changes are not persisted in the aspx page. As well,
    if I change one of the other properties of the TabList control itself, all
    the inner html of the control is removed from the aspx page. My control
    consists of an arraylist property called tabs which contains instances of
    TabListItem objects. The TabListItem object can contain various web
    controls as child controls in it's Controls property. Any help here would
    be greatly appreciated. Thanks.

    <myasp:TabList id="TabList2g" runat="server" Width="328px" Height="48px"
    BorderWidth="4px" CssClass="test23">
    <myasp:TabListItem>
    <asp:Button ID="test1" Text="Tab 1" Font-Bold="True"></asp:Button>
    </myasp:TabListItem>
    <myasp:TabListItem>
    <asp:Button ID="test2" Text="Tab 2"></asp:Button>
    </myasp:TabListItem>
    <myasp:TabListItem>
    <asp:Button ID="test3" Text="Tab 3 part1"></asp:Button>
    <asp:Button ID="test4" Text="Tab 3 part2"></asp:Button>
    </myasp:TabListItem>
    <myasp:TabListItem>
    <asp:Button ID="test5" Text="Tab 4 part1"></asp:Button>
    <asp:Button ID="test6" Text="Tab 4 part2"></asp:Button>
    </myasp:TabListItem>
    </myasp:TabList>


    using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ComponentModel;
    using System.Collections;
    using System.Security;

    [assembly: System.Web.UI.TagPrefix("MyDotNet.Web.UI.WebControls", "myasp")]
    namespace MyDotNet.Web.UI.WebControls
    {
    public class TabListBuilder : ControlBuilder
    {
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,
    Name="FullTrust")]
    public override Type GetChildControlType(string tagName,
    System.Collections.IDictionary attribs)
    {
    if (tagName.ToLower().EndsWith("tablistitem"))
    {
    return typeof(TabListItem);
    }
    return null;
    }

    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,
    Name="FullTrust")]
    public override void AppendLiteralString(string s)
    {
    //Ignore
    }
    }

    public class TabListItemBuilder : ControlBuilder
    {
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,
    Name="FullTrust")]
    public override Type GetChildControlType(string tagName,
    System.Collections.IDictionary attribs)
    {
    if (tagName.ToLower().EndsWith("label"))
    {
    return typeof(Label);
    }
    else if (tagName.ToLower().EndsWith("button"))
    {
    return typeof(Button);
    }
    else if (tagName.ToLower().EndsWith("linkbutton"))
    {
    return typeof(LinkButton);
    }
    else if (tagName.ToLower().EndsWith("imagebutton"))
    {
    return typeof(ImageButton);
    }
    else if (tagName.ToLower().EndsWith("hyperlink"))
    {
    return typeof(HyperLink);
    }
    else if (tagName.ToLower().EndsWith("image"))
    {
    return typeof(Image);
    }
    else if (tagName.ToLower().EndsWith("literal"))
    {
    return typeof(Literal);
    }

    return null;
    }

    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,
    Name="FullTrust")]
    public override void AppendLiteralString(string s)
    {
    //Ignore
    }
    }


    [//ControlBuilderAttribute(typeof(TabListBuilder)), /*TabListBuilder will
    parse child controls */
    ParseChildren(true, "Tabs"),/*true - child elements are parsed as
    properties, not controls*/
    PersistChildren(false) /*false - persist child controls only as child
    elements*/]
    public class TabList : WebControl, INamingContainer
    {
    const string strCATEGORY_TABS = "Tabs";
    const string strCATEGORY_APPEARANCE = "Appearance";

    private Table pTable_m;
    private ArrayList pTabs_m = new ArrayList();

    private int iSelectedTabIndex_m = -1;

    [EditorAttribute(typeof(TabListItemArrayListEditor),
    typeof(System.Drawing.Design.UITypeEditor)), /*Custom editor for the
    TabListItem objects in the ArrayList */
    PersistenceMode(PersistenceMode.InnerProperty),
    MergableProperty(false),
    DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content)]
    public ArrayList Tabs
    {
    get
    {
    return pTabs_m;
    }
    }

    [Bindable(true),
    Category(strCATEGORY_TABS),
    DefaultValue(-1)]
    public int SelectedTabIndex
    {
    get
    {
    return iSelectedTabIndex_m;
    }
    set
    {
    iSelectedTabIndex_m = value;
    }
    }

    // Called at runtime when a child object is added to the collection.
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,
    Name="FullTrust")]
    protected override void AddParsedSubObject(object obj)
    {
    TabListItem pItem = obj as TabListItem;
    if (pItem != null)
    {
    pTabs_m.Add(pItem);
    }
    }

    protected override void CreateChildControls()
    {
    pTable_m = new Table();
    pTable_m.Rows.Add(new TableRow());
    foreach(TabListItem pItem in pTabs_m)
    {
    TableCell pCell = new TableCell();
    pTable_m.Rows[0].Cells.Add(pCell);

    pCell.Controls.Add(pItem);
    }
    Controls.Clear();
    Controls.Add(pTable_m);
    }
    }

    /// <summary>
    /// Represents 1 tab in the TabList control
    /// </summary>
    [ControlBuilderAttribute(typeof(TabListItemBuilder)),/*TabListItemBuilder
    will parse child controls */
    ToolboxItem(false),/*Do not show this control in the toolbox*/
    ParseChildren(false)/*false - child elements are parsed as controls, not
    properties*/,
    PersistChildren(true) /*false - persist child controls only as child
    elements*/]
    public class TabListItem : WebControl, INamingContainer
    {
    private ArrayList pTabControls_m = new ArrayList();

    public TabListItem()
    {

    }

    // Called at runtime when a child object is added to the collection.
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,
    Name="FullTrust")]
    protected override void AddParsedSubObject(object obj)
    {
    Control pItem = obj as Control;
    if (pItem != null)
    {
    Controls.Add(pItem);
    }
    }

    }


    public class TabListItemArrayListEditor :
    System.Drawing.Design.UITypeEditor
    {
    public TabListItemArrayListEditor() : base()
    {
    }

    public override object
    EditValue(System.ComponentModel.ITypeDescriptorContext context,
    IServiceProvider provider, object value)
    {
    try
    {
    IWindowsFormsEditorService pSvc = null;

    if (context != null &&
    provider != null &&
    context.Instance != null)
    {
    pSvc =
    (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
    }

    if (pSvc != null)
    {
    frmTabEditor pForm = new frmTabEditor();

    ArrayList pCollection = (ArrayList)value;

    pForm.Tabs = pCollection;

    if (pForm.ShowDialog() == DialogResult.OK)
    {
    value = pCollection;
    }
    }
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    return value;
    }

    // Indicates whether the UITypeEditor provides a form-based (modal)
    dialog,
    // drop down dialog, or no UI outside of the properties window.
    public override System.Drawing.Design.UITypeEditorEditStyle
    GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
    {
    return UITypeEditorEditStyle.Modal;
    }
    }

    }
     
    Jeremy Chapman, Feb 18, 2006
    #1
    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. Saravanan Rathinavelu

    Iterate through ArrayList using an another ArrayList

    Saravanan Rathinavelu, Aug 16, 2003, in forum: ASP .Net
    Replies:
    3
    Views:
    2,743
    Natty Gur
    Aug 19, 2003
  2. Kaidi
    Replies:
    4
    Views:
    2,387
    Kaidi
    Jan 3, 2004
  3. xz
    Replies:
    16
    Views:
    2,379
  4. Philipp
    Replies:
    6
    Views:
    928
    Arne Vajhøj
    May 28, 2008
  5. Garry McGlennon

    Persisting properties in property Grid (help!)

    Garry McGlennon, Jun 24, 2004, in forum: ASP .Net Web Controls
    Replies:
    0
    Views:
    134
    Garry McGlennon
    Jun 24, 2004
Loading...

Share This Page