Avatar billede elgringo Nybegynder
23. april 2006 - 22:50 Der er 3 kommentarer

Nested Collection Property

Hej, jeg har et irriterende problem med Collection Properties.
I mit tilfælde har jeg brug for at have en collection property i "hovedklassen" og i hver af objekterne skal der være endnu en collection property.

Dvs en BanditItemCollection i WebControlen der består af MyThingy-objekter.
I MyThingy-objektet har jeg så MyNanoCollection der består af MyNano-objekter.

Starter med sådan set at virke fint, med output i aspx'en.
f.eks.
<cc4:WebCustomControl1 ID="WebCustomControl1_1" runat="server" BanditItemCollection-Capacity="4">
        <MyThingy title="abc" amount="123" tjuhej="">
            <MyNanoCollection>
                <MyNano id="1" name="a" someothervalue="b" />
                <MyNano id="2" name="c" someothervalue="d" />
            </MyNanoCollection>
        </MyThingy>
        <MyThingy title="def" amount="456" tjuhej="">
            <MyNanoCollection>
            </MyNanoCollection>
        </MyThingy>
</cc4:WebCustomControl1>

Kan være det er forkert, men kan umiddelbart ikke komme på en bedre ide?

Nå men, ved skift tilbage til designtime får jeg en fejl på kontrollen..
"WebControlLibrary1.MyNanoCollection must have items of type 'WebControlLibrary1.MyNano'. 'MyNano' is of type 'System.Web.UI.HtmlControls.HtmlGenericControl'.

Nogle gode ideer? :)

-----------------------

    [DefaultProperty("Text")
    ,ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")
    ,ParseChildren(false)
    ,PersistChildren(false)
    ,Designer(typeof(HtmlDesigner))
    ,ControlBuilder(typeof(HtmlBuilder))]
    public class WebCustomControl1 : System.Web.UI.WebControls.WebControl
    {
        protected MyItemCollection _myItemCollection=null;

        [
        Bindable(true)
        ,Category("Appearance")
        ,Browsable(true)
        ,PersistenceMode(PersistenceMode.InnerDefaultProperty)
        ,DesignerSerializationVisibility(DesignerSerializationVisibility.Content)       
        ]
        public MyItemCollection BanditItemCollection
        {
            get
            {
                if (_myItemCollection == null)
                    _myItemCollection = new MyItemCollection();

                return _myItemCollection;
            }
            set
            {
                _myItemCollection = value;
            }
        }

        protected override void Render(HtmlTextWriter output)
        {
            output.Write("Ostehat");
        }

        protected override void AddParsedSubObject(object obj)
        {
            if (obj is MyThingy)
            {
                MyThingy h = obj as MyThingy;

                this.BanditItemCollection.Add(new MyThingy(h.Amount, h.Title, h.Tjuhej));
            }
            else
            {
                base.AddParsedSubObject(obj);
            }
        }
    }

-----------------------------------------------

    public class MyNano
    {
        private int id;
        private string name;
        private string someothervalue;

        public int ID
        {
            get { return this.id; }
            set { this.id = value; }
        }

        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        public string SomeOthervalue
        {
            get { return this.someothervalue; }
            set { this.someothervalue = value; }
        }

        public MyNano()
        {
        }

        public MyNano(int id,string name,string someothervalue)
        {
            this.id = id;
            this.name = name;
            this.someothervalue = someothervalue;
        }
    }
   
    [ParseChildren(false)
    ,PersistChildren(false)
    ,Designer(typeof(HtmlDesigner))
    ,ControlBuilder(typeof(HtmlBuilder))]
    public class MyThingy
    {
        private string sTitle;
        private int iAmount=0;
        private string sTjuhej = "";

        public string Tjuhej
        {
            get { return sTjuhej; }
            set { sTjuhej = value; }
        }

        public string Title
        {
            get { return sTitle; }
            set { sTitle = value; }
        }

        public int Amount
        {
            get {return iAmount;}
            set {iAmount=value;}
        }

        protected MyNanoCollection _myNanoCollection = null;

        [
            Bindable(true)
            , Category("Appearance")
            , Browsable(true)
            , PersistenceMode(PersistenceMode.InnerDefaultProperty)
            , DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
            , Description("Returns the collection of colors to list as options when"
                + " the Palette property is set to UserDefined")
        ]
        public MyNanoCollection MyNanoCollection
        {
            get
            {
                if (_myNanoCollection == null)
                    _myNanoCollection = new MyNanoCollection();

                return _myNanoCollection;
            }
            set
            {
                _myNanoCollection = value;
            }
        }

        public MyThingy()
        {
           
        }

        public MyThingy(int aAmount,string aTitle,string aTjuhej)
        {
            iAmount = aAmount;
            sTitle = aTitle;

        }
    }

    public class MyNanoCollection : CollectionBase
    {
        public int Add(MyNano aItem)
        {
            return List.Add(aItem);
        }

        public void Insert(int aIndex, MyNano aItem)
        {
            List.Insert(aIndex, aItem);
        }

        public void Remove(MyNano aItem)
        {
            List.Remove(aItem);
        }

        public bool Contains(MyNano aItem)
        {
            return List.Contains(aItem);
        }

        public int IndexOf(MyNano aItem)
        {
            return List.IndexOf(aItem);
        }

        public void CopyTo(MyNano[] aArray, int aIndex)
        {
            List.CopyTo(aArray, aIndex);
        }

        public MyNano this[int aIndex]
        {
            get { return (MyNano)List[aIndex]; }
            set { List[aIndex] = value; }
        }
    }

    public class MyItemCollection : CollectionBase
    {
        public int Add(MyThingy aItem)
        {
            return List.Add(aItem);
        }

        public void Insert(int aIndex, MyThingy aItem)
        {
            List.Insert(aIndex, aItem);
        }

        public void Remove(MyThingy aItem)
        {
            List.Remove(aItem);
        }

        public bool Contains(MyThingy aItem)
        {
            return List.Contains(aItem);
        }

        public int IndexOf(MyThingy aItem)
        {
            return List.IndexOf(aItem);
        }

        public void CopyTo(MyThingy[] aArray, int aIndex)
        {
            List.CopyTo(aArray, aIndex);
        }

        public MyThingy this[int aIndex]
        {
            get { return (MyThingy)List[aIndex]; }
            set { List[aIndex] = value; }
        }
    }

-----------------------------------------------------

    public class HtmlDesigner : ControlDesigner
    {       
        public override string GetPersistInnerHtml()
        {
            StringWriter sw = new StringWriter();
            HtmlTextWriter html = new HtmlTextWriter(sw);

            WebCustomControl1 dd = this.Component as WebCustomControl1;
            if (dd!=null)
            {
                foreach (MyThingy c in dd.BanditItemCollection)
                {
                    html.WriteBeginTag("MyThingy");
                    html.WriteAttribute("title",c.Title);
                    html.WriteAttribute("amount", c.Amount.ToString());
                    html.WriteAttribute("tjuhej", c.Tjuhej);
                    html.WriteLine(HtmlTextWriter.TagRightChar);

                    html.WriteBeginTag("MyNanoCollection");
                    html.WriteLine(HtmlTextWriter.TagRightChar);/**/
                    foreach (MyNano nano in c.MyNanoCollection)
                    {
                        html.WriteBeginTag("MyNano");
                        html.WriteAttribute("id", nano.ID.ToString());
                        html.WriteAttribute("name", nano.Name);
                        html.WriteAttribute("someothervalue", nano.SomeOthervalue);
                        html.WriteLine(HtmlTextWriter.SelfClosingTagEnd);
                    }
                    html.WriteEndTag("MyNanoCollection");

                    html.WriteEndTag("MyThingy");
                }
            }
            return sw.ToString();/**/
            //return "GetPersistInnerHtml";
        }
    }

--------------------------------------------------------

    public class HtmlBuilder : ControlBuilder
    {
        public override Type GetChildControlType(string tagName, IDictionary attribs)
        {
            if (string.Compare(tagName, "MyThingy", true) == 0)
                return typeof(MyThingy);

            if (string.Compare(tagName, "MyNano", true) == 0)
                return typeof(MyNano);

            if (string.Compare(tagName, "MyNanoCollection", true) == 0)
                return typeof(MyNanoCollection);
         
            return base.GetChildControlType(tagName, attribs);
        }
    }
Avatar billede dr_chaos Nybegynder
25. april 2006 - 07:56 #1
virker det ?
er problemet bare at du ikke kan bruge designview ?

tror du får denne fejl fordi du har en tom collection:
<MyNanoCollection>
            </MyNanoCollection>
prøv at smide et item deri.
Avatar billede elgringo Nybegynder
25. april 2006 - 08:25 #2
Nej, det virker stadig ikke.
Og har desværre ikke noget at gøre med en tom NyNanoCollection, skulle jo helst kunne være tom :)

Nej, det fejler først når en
<MyNano id="1" name="a" someothervalue="b" />
er til stede.
Avatar billede dr_chaos Nybegynder
25. april 2006 - 08:27 #3
er det i designview den fejler elle når du afvikler siden ?
og hvad er den præcise fejlmeddelelse ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester