...om te schrijven!
Vooral componenten waar een list/collection van andere objecten inzitten.
In Delphi is dat simpel, zorg ervoor dat alles wat je designtime wilt kunnen benaderen published is, en 't komt goed. De items in je list komen in de dfm (zeg maar de .designer.cs van Delphi) netjes binnen de definitie van je hoofdcomponent te staan, ze krijgen een naampje (aanpasbaar), en die naam is runtime ook nog te gebruiken!
Niet bij C#...
Om te beginnen moeten alle objecten in je list al afgeleid zijn van Component, en een constructor hebben die een IContainer als parameter accepteert, anders worden je designtime aanpassingen aan zo'n object niet eens bewaard.
Vervolgens worden die items uit die lijst gewoon plompverloren aangemaakt via .designer.cs, zonder ook maar een enkele koppeling met het component dat die lijst beheert. Runtime moet het hoofdcomponent dan eerst op zoek naar de items die in z'n lijst horen, en die zelf toevoegen. En omdat runtime die componenten geen naam meer hebben (beter gezegd geen Site, zodat je hun Site.Name niet op kunt vragen), moet je al een overbodige property opnemen om ze uberhaupt op te kunnen zoeken.
Nog leuker wordt 't als je een component hebt waar je designtime een ander component aan kunt koppelen die ervoor zorgt dat automatisch een lijst in het hoofdcomponent wordt gevuld. Bv. een component waar je een DAL component aanhangt met alle velddefinities voor een tabel in je database. Bij mij worden dan automatisch o.a. de edit control types aan de lijst in het hoofdcomponent toegevoegd, maar die moeten designtime wel wijzigbaar blijven.
Designtime zijn die extra objecten prima te persisten via "this.Site.Container.Add()" (overbodig in Delphi), en dan staan ze ook netjes in .designer.cs. Maar bij de eerstvolgende keer dat je dan dat form designtime oproept, word je overspoeld met foutmeldingen: op 't moment dat VS probeert om dat DAL component aan m'n hoofdcomponent te koppelen (waardoor die lijst met extra componenten wordt aangemaakt) begint 'ie te miepen dat die componenten al bestaan.
Uiteindelijk was dat wel op te lossen door de DesignerHost op te vragen, en te checken of 'ie Loading was (zo ja, dan een delegate toevoegen aan z'n LoadCompleted event), maar gecompliceerd is 't wel...
Of ik doe iets heel erg verkeerd (redelijk beginner in C#), of Anders Hjelberg (architect van zowel Delphi als C#) is met de overgang naar Microsoft een stukje vergeten...
Vooral componenten waar een list/collection van andere objecten inzitten.
In Delphi is dat simpel, zorg ervoor dat alles wat je designtime wilt kunnen benaderen published is, en 't komt goed. De items in je list komen in de dfm (zeg maar de .designer.cs van Delphi) netjes binnen de definitie van je hoofdcomponent te staan, ze krijgen een naampje (aanpasbaar), en die naam is runtime ook nog te gebruiken!
Niet bij C#...
Om te beginnen moeten alle objecten in je list al afgeleid zijn van Component, en een constructor hebben die een IContainer als parameter accepteert, anders worden je designtime aanpassingen aan zo'n object niet eens bewaard.
Vervolgens worden die items uit die lijst gewoon plompverloren aangemaakt via .designer.cs, zonder ook maar een enkele koppeling met het component dat die lijst beheert. Runtime moet het hoofdcomponent dan eerst op zoek naar de items die in z'n lijst horen, en die zelf toevoegen. En omdat runtime die componenten geen naam meer hebben (beter gezegd geen Site, zodat je hun Site.Name niet op kunt vragen), moet je al een overbodige property opnemen om ze uberhaupt op te kunnen zoeken.
Nog leuker wordt 't als je een component hebt waar je designtime een ander component aan kunt koppelen die ervoor zorgt dat automatisch een lijst in het hoofdcomponent wordt gevuld. Bv. een component waar je een DAL component aanhangt met alle velddefinities voor een tabel in je database. Bij mij worden dan automatisch o.a. de edit control types aan de lijst in het hoofdcomponent toegevoegd, maar die moeten designtime wel wijzigbaar blijven.
Designtime zijn die extra objecten prima te persisten via "this.Site.Container.Add()" (overbodig in Delphi), en dan staan ze ook netjes in .designer.cs. Maar bij de eerstvolgende keer dat je dan dat form designtime oproept, word je overspoeld met foutmeldingen: op 't moment dat VS probeert om dat DAL component aan m'n hoofdcomponent te koppelen (waardoor die lijst met extra componenten wordt aangemaakt) begint 'ie te miepen dat die componenten al bestaan.
Uiteindelijk was dat wel op te lossen door de DesignerHost op te vragen, en te checken of 'ie Loading was (zo ja, dan een delegate toevoegen aan z'n LoadCompleted event), maar gecompliceerd is 't wel...
Of ik doe iets heel erg verkeerd (redelijk beginner in C#), of Anders Hjelberg (architect van zowel Delphi als C#) is met de overgang naar Microsoft een stukje vergeten...