[.net 2.0] VS-Designer löscht nach Reload Komponenten.

Danielku15

Erfahrenes Mitglied
Hallo Leute.
Ich arbeite gerade an einem Designer für mein Control. Jedoch scheint irgendwo was nicht zu stimmen denn Visual Studio löscht mir die Komponenten wieder aus dem Code. Es handelt sich um ein Container-Control (Container) welches andere Controls hostet (Groups)
Hier ein kurzes Szenario:
Ich füge über meinen Designer dem Container neue Gruppen hinzu. Diese werden auch sofort dargestellt. Im Designer-Code nachgesehen findet sich die neue Group Instanz und diese wird auch der Collection des Containers hinzugefügt. Alles in Ordnung.
Als nächstes speichere ich die GUI und öffne sie nochmals (Schließen und Öffnen des Designers). Zwar beffindet sich die Group Instanz in diesem Moment noch im Visuellen Designer, wurde sie jedoch im Designer Code entfernt. Lediglich die Variable für die Group existiert noch. Diese wird weder Instanziert noch der Collection hinzugefügt.

Nur wie kommt es zu diesem Verhalten? Zurzeit existiert ein Designer für den Container. Dieser stellt ein Adorner zur Verfügung und returnt als AssociatedComponents Eigenschaft die Container-Collection.

Noch seltsamer finde ich das Verhalten darum: Mein Container-Objekte befinden sich nochmals in einem Container ( ContainerSet ). Dort ist mit der selben Struktur dieses Verhalten nicht aufzufinden. Auch in die ContainerSets werden die Container mit ähnlichem Code hinzugefügt. Der einzige Unterschied ist dass das ContainerSet ein Control ist und die Container sind Components:

Code:
+--------------+
| Containerset |
| +----------+ |
| |Container | |
| +----------+ |
| | Group    | |
| | Group    | |
| +----------+ |
|              |
| +----------+ |
| |Container | |
| +----------+ |
| | Group    | |
| +----------+ |
+--------------+

Die Collections welche die Container beinhalten und jene welche die Groups erben von derselben Basisklasse. Die Quellcodes zum Hinzufügen der neuen Komponente sind ebenfalls gleich:
C#:
// AddContainer
IDesignerHost oHost = (IDesignerHost)GetService(typeof(IDesignerHost));
DesignerTransaction oTransaction = oHost.CreateTransaction("Add Container");
MyContainer oNewContainer = (MyContainer)oHost.CreateComponent(typeof(MyContainer));
IComponentChangeService oChangeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));

_oSet.ContainerList.SuspendEvents();
oChangeService.OnComponentChanging(_oSet, null);

oNewContainer = _oSet;
_oSet.ContianerList.Add(oNewContainer);

oChangeService.OnComponentChanged(_oSet, null, null, null);
oTransaction.Commit();

oNewContainer.Text = oNewContainer.Site.Name;
_oSet.SelectedContainer = oNewContainer;
_oSet.ContainerList.ResumeEvents();
_oSet.RebuildControl();

// AddGroup
IDesignerHost oHost = (IDesignerHost)GetService(typeof(IDesignerHost));
DesignerTransaction oTransaction = oHost.CreateTransaction("Add Group");
Group oItem = (Group)oHost.CreateComponent(typeof(Group));
IComponentChangeService oChangeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));

_oContainer.Groups.SuspendEvents();
oChangeService.OnComponentChanging(_oContainer, null);

oItem.Container = _oContainer;
_oContainer.Groups.Add(oItem);

oChangeService.OnComponentChanged(_oContainer, null, null, null);
oTransaction.Commit();

oItem.Text = oItem.Site.Name;
_oContainer.Groups.ResumeEvents();
_oContainer.Set.RebuildControl();

Nun wenn ihr noch mehr Infos braucht um den Fehler zu analysieren einfach fragen.

EDIT:

Problem gelöst. Bin rein durch Zufall auf den Fehler gekommen. Ich hab nach dem Hinzufügen der Groups zum Container die Groups in einen System.ComponentModel.Container gepackt welcher beim Dispose() vernichtet wird. Ich hab die Zeile rausgenommen sodass die Groups nicht hinzugefügt werden und schon wird nichts mehr gelöscht. Das Designerverhalten ist oft sehr seltsam. Generell kommt es mir so vor als dass es kaum ausgereifte Dokumentationen zur Erstellung professioneller Control-Designer gibt. Wäre mal ein Tutorial wert :)

Beste Grüße
Daniel
 
Zuletzt bearbeitet:
Zurück