Server Control using a Collection

Discussion in 'ASP .Net Building Controls' started by ME, Jul 1, 2004.

  1. ME

    ME Guest

    Ok I am brand new at C#. I am attempting to build a server control that
    contains a collection. Trouble is when I place my control on my page and
    edit the collection via the property window (using an Editor) the control
    generates the following html:

    <controlgroup:ControlGroupControl id="ControlGroupControl2" runat="server"
    Items="(Collection)"></controlgroup:ControlGroupControl>

    Note that Items shows up as just "(Collections)". Now the desired tag
    structure is similar to the following:

    <asp:DropDownList id="DropDownList1" runat="server">
    <asp:ListItem Value="3333">3333</asp:ListItem>
    <asp:ListItem Value="ffffffffff">ffffffff</asp:ListItem>
    </asp:DropDownList>

    So now how would one go about creating a control to automatically generate
    the correct tags and also read from them as well?

    Thanks,

    Matt
     
    ME, Jul 1, 2004
    #1
    1. Advertising

  2. ME

    Teemu Keiski Guest

    Hi,

    1) the collection property needs to be read-only (instantiate the collection
    when property is accessed for the first time)
    2). collection property should be declared with
    PersistenceMode(PersistenceMode.InnerProperty),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content) and
    NotifyParentProperty(true) attributes

    Have you done these? If this doesn't help, post the code.

    --
    Teemu Keiski
    MCP, Microsoft MVP (ASP.NET), AspInsiders member
    ASP.NET Forum Moderator, AspAlliance Columnist
    http://blogs.aspadvice.com/joteke



    "ME" <trash.trash@comcastDOTnet> wrote in message
    news:3sOEc.7440$MB3.867@attbi_s04...
    > Ok I am brand new at C#. I am attempting to build a server control that
    > contains a collection. Trouble is when I place my control on my page and
    > edit the collection via the property window (using an Editor) the control
    > generates the following html:
    >
    > <controlgroup:ControlGroupControl id="ControlGroupControl2" runat="server"
    > Items="(Collection)"></controlgroup:ControlGroupControl>
    >
    > Note that Items shows up as just "(Collections)". Now the desired tag
    > structure is similar to the following:
    >
    > <asp:DropDownList id="DropDownList1" runat="server">
    > <asp:ListItem Value="3333">3333</asp:ListItem>
    > <asp:ListItem Value="ffffffffff">ffffffff</asp:ListItem>
    > </asp:DropDownList>
    >
    > So now how would one go about creating a control to automatically generate
    > the correct tags and also read from them as well?
    >
    > Thanks,
    >
    > Matt
    >
    >
    >
     
    Teemu Keiski, Jul 1, 2004
    #2
    1. Advertising

  3. ME

    ME Guest

    Thank you. What would it take to get the control to "read" these values
    after the GUI page has been saved and closed then reopened again? It seems
    that if I do this the control reverts to "Error Creating Control". My guess
    is that it is not reading these values but I am not absolutly certain.
    Below is my controls code (please excuse my ignorance, like I said I am very
    new to this!):


    using System;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.Design;

    using System.ComponentModel;

    using System.ComponentModel.Design;

    using System.Collections;

    using System.IO;

    using System.Text;

    using System.Drawing.Design;

    //using System.

    [

    assembly: TagPrefix("ControlGroup","ControlGroup")

    ]

    namespace ControlGroup

    {

    /// <summary>

    /// Summary description for WebCustomControl1.

    /// </summary>

    ///

    [DefaultProperty("Text"),

    ToolboxData("<{0}:ControlGroupControl
    runat=server></{0}:ControlGroupControl>"),

    SerializableAttribute()]

    public class ControlGroupControl : System.Web.UI.WebControls.WebControl,
    INamingContainer

    {

    #region Private Variables

    private string text="";

    private ControlGroupItemCollection items = new ControlGroupItemCollection();

    private ControlGroupItemCollection allItems = new
    ControlGroupItemCollection();

    private ListBox lbItems = new ListBox();

    private Label lblTitleID = new Label();

    private TextBox txtInfo = new TextBox();

    #endregion

    #region Constructors and Initializers

    public ControlGroupControl()

    {

    try

    {

    this.Visible=true;

    txtInfo.Height=300;

    //this.Height=100;

    //this.Width=100;

    lbItems.BorderStyle=BorderStyle.None;

    lbItems.BorderWidth=0;

    lbItems.Width=300;

    txtInfo.Width=300;

    txtInfo.TextMode=TextBoxMode.MultiLine;

    txtInfo.Text += "CONSTRUCTED!\n";

    }

    catch (Exception ex)

    {

    items=null;

    allItems=null;

    text="Error! - " + ex.ToString();

    }

    }

    protected override void OnInit(EventArgs e)

    {

    if (AllItems.Count != Page.Controls.Count-1)

    {

    txtInfo.Text += "INITIALIZED & RESET!\n";

    fillAllItems();

    }

    base.OnInit (e);

    }

    protected override void OnLoad(EventArgs e)

    {

    txtInfo.Text += "LOADED!\n";

    base.OnLoad (e);

    }

    protected override void OnPreRender(EventArgs e)

    {

    txtInfo.Text += "PRE-RENDER!\n";

    base.OnPreRender (e);

    }



    #endregion

    #region Void Methods

    private void FillListBox()

    {

    //Start by clearing the list

    lbItems.Items.Clear();

    //If the items collection has not been instantiated then

    //Do not attempt to iterate through it.

    if (items.Count>0)

    {

    //for (int i=0; i< items.Count; i++)

    foreach(ControlGroupItem cntl in items)

    {

    lbItems.Items.Add(cntl.ControlID.ToString());

    }

    }

    else

    {

    //Writes "No Controls

    lbItems.Items.Add("No Controls");

    }



    }

    private void fillAllItems()

    {

    try

    {

    int c = Page.Controls.Count;

    int tmpID=0;

    ControlGroupItem tempControl = new ControlGroupItem();

    allItems.Clear();


    for(int i=0; i < c; i++)

    {

    //txtInfo.Text = txtInfo.Text + Page.Controls.ID.ToString() + "\n";

    tempControl = new ControlGroupItem();

    // set the control structure properties of the control

    tempControl.ControlID = Page.Controls.ID.ToString();

    tempControl.ControlType = Page.Controls.GetType();

    //tempControl.BoundProperty=

    // add the control structure to the collection

    tmpID=this.allItems.Add(tempControl);

    txtInfo.Text +="CONTROL " + this.allItems[tmpID].ControlID.ToString() + " ["
    + allItems.Count.ToString() + "]\n";

    }

    this.Text="WORKED!";

    }

    catch (Exception ex)

    {

    System.Diagnostics.Debug.Write(ex.ToString());

    this.Text=ex.ToString();

    }

    }

    #endregion


    #region Properties

    [

    Bindable(true),

    Category("Data"),

    ]

    public string Text

    {

    get

    {

    return text;

    }

    set

    {

    text=value;

    }

    }



    /// <summary>

    /// Items = The group of referenced controls

    /// </summary>

    [Category("Misc"),

    PersistenceMode(PersistenceMode.InnerProperty),

    DesignerSerializationVisibility(DesignerSerializationVisibility.Content),

    NotifyParentProperty(true),

    EditorAttribute(typeof(ControlGroupEditor), typeof(UITypeEditor))

    ]

    public ControlGroupItemCollection Items

    {

    get

    {

    return items;

    }

    }

    [BrowsableAttribute (false)]

    public ControlGroupItemCollection AllItems

    {

    get

    {

    return allItems;

    }

    set

    {

    allItems = value;

    }

    }

    #endregion

    #region Rendering

    protected override StateBag ViewState

    {

    get

    {

    return base.ViewState;

    }

    }

    protected override object SaveViewState()

    {

    return base.SaveViewState ();

    }

    protected override void LoadViewState(object savedState)

    {

    base.LoadViewState (savedState);

    }



    protected override void RenderContents(HtmlTextWriter writer)

    {

    //Render(writer);

    base.RenderContents (writer);

    }



    protected override void RenderChildren(HtmlTextWriter writer)

    {

    FillListBox();

    lblTitleID.Text=this.ID.ToString();

    // Render

    lblTitleID.RenderControl(writer);

    writer.Write("<BR>");

    lbItems.RenderControl(writer);

    writer.Write("<BR>");

    txtInfo.RenderControl(writer);

    }

    #endregion

    }

    }







    "Teemu Keiski" <> wrote in message
    news:...
    > Hi,
    >
    > 1) the collection property needs to be read-only (instantiate the

    collection
    > when property is accessed for the first time)
    > 2). collection property should be declared with
    > PersistenceMode(PersistenceMode.InnerProperty),
    > DesignerSerializationVisibility(DesignerSerializationVisibility.Content)

    and
    > NotifyParentProperty(true) attributes
    >
    > Have you done these? If this doesn't help, post the code.
    >
    > --
    > Teemu Keiski
    > MCP, Microsoft MVP (ASP.NET), AspInsiders member
    > ASP.NET Forum Moderator, AspAlliance Columnist
    > http://blogs.aspadvice.com/joteke
    >
    >
    >
    > "ME" <trash.trash@comcastDOTnet> wrote in message
    > news:3sOEc.7440$MB3.867@attbi_s04...
    > > Ok I am brand new at C#. I am attempting to build a server control that
    > > contains a collection. Trouble is when I place my control on my page

    and
    > > edit the collection via the property window (using an Editor) the

    control
    > > generates the following html:
    > >
    > > <controlgroup:ControlGroupControl id="ControlGroupControl2"

    runat="server"
    > > Items="(Collection)"></controlgroup:ControlGroupControl>
    > >
    > > Note that Items shows up as just "(Collections)". Now the desired tag
    > > structure is similar to the following:
    > >
    > > <asp:DropDownList id="DropDownList1" runat="server">
    > > <asp:ListItem Value="3333">3333</asp:ListItem>
    > > <asp:ListItem Value="ffffffffff">ffffffff</asp:ListItem>
    > > </asp:DropDownList>
    > >
    > > So now how would one go about creating a control to automatically

    generate
    > > the correct tags and also read from them as well?
    > >
    > > Thanks,
    > >
    > > Matt
    > >
    > >
    > >

    >
    >
     
    ME, Jul 1, 2004
    #3
    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,001
    Øyvind Isaksen
    May 18, 2007
  2. ME

    Server Control using a Collection

    ME, Jul 1, 2004, in forum: ASP .Net Building Controls
    Replies:
    0
    Views:
    112
  3. ME

    Server Control using a Collection

    ME, Jul 1, 2004, in forum: ASP .Net Building Controls
    Replies:
    0
    Views:
    118
  4. ME

    Server Control using a Collection

    ME, Jul 1, 2004, in forum: ASP .Net Building Controls
    Replies:
    1
    Views:
    122
    Natty Gur
    Jul 5, 2004
  5. ME

    Server Control using a Collection

    ME, Jul 1, 2004, in forum: ASP .Net Web Controls
    Replies:
    2
    Views:
    134
Loading...

Share This Page