Laden...

Child:Parent:UserControl Probleme mit dem Designer

Erstellt von darktower vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.877 Views
D
darktower Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren
Child:Parent:UserControl Probleme mit dem Designer

Hallo,

Ich habe folgendes Problem:
Ich habe ein BasisControl (von UserControl geerbt) erstellt, welches von verschiedenen Klassen geerbt wird. Soweit lässt sich das Programm auch problemlos kombilieren nur der Designer spielt regelmäßig verrückt.

Hier der Code für die Basisklasse:


public class BasisView : UserControl, IBeobachter
    {
        protected bool angemeldet = false;
        protected ArrayList childs = new ArrayList();
        protected IModel model;
        protected IController controller;
        
        public void anmelden()
        {
            if (!angemeldet)
            {
                model.registriereBeobachter(this);
                angemeldet = true;
                foreach (BasisView child in childs)
                {
                    child.anmelden();
                }               
            }
        }

        public void abmelden()
        {
            if (angemeldet)
            {
                model.entferneBeobachter(this);
                model.entferneBeobachter((IBeobachter)controller);
                angemeldet = false;
                foreach (BasisView child in childs)
                {
                    child.abmelden();
                }
            }
        }
    
        public void erstellen(IModel model)
        {
            this.model = model;
            this.controller = new Controller(model, this);
            foreach (BasisView child in childs)
            {
                child.erstellen(model);
            }
            if (model != null)
            {
                this.anmelden();
            }
        }

        public virtual void aktualisiere(EEvent kindOfEvent)
        { }

    }

Eine Kindklasse:


public partial class ViewWidgets : BasisView
    {
        public ViewWidgets()
        {
            InitializeComponent();          
            childs.Add(andereKindklasse);
            childs.Add(nochEineAndereKindklasse);
        }
    }

Wenn ich den Designer aufrufen möchte, funktioniert dies regelmäßig nicht und ich bekomme eine Fehlermeldung, dass die Basisklasse nicht geladen werden konnte.
Ich verzweifle da echt schon. Was ist das Problem?

Was vielleicht auch noch wichtig ist und ein Mitgrund für das Problem sein könnte, ich arbeite auf mehreren Ebenen. Soll heißen, dass ich schon eingesetzte Komponenten weiter bearbeite. Kommt dabei vielleicht der Designer nicht klar?

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo darktower,

ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

Kann es sein, dass du den Code von BasisView änderst und nicht neu kompilierst und daher der Designer spinnt?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
darktower Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

Danke erstmal für deine Antwort.
Zu den Collections, ich wusste nicht dass, die ArrayLists nicht mehr verwendet werden sollten. Merke ich mir für zukünftige Projekte, in diesem Fall kann ich mit dieser untypisierten Collection gut leben, da eine Neuimplementierung an vielen Stellen Änderungen nötigt macht, aber der Mehrnutzen nicht wirklich gegeben ist.

Kann es sein, dass du den Code von BasisView änderst und nicht neu kompilierst und daher der Designer spinnt?

Ja, das wird wohl der Fall sein. (schrieb ich auch schon bei meinem Posting ganz unten).
Das System ist so aufgebaut, dass ich mit einer Vielzahl von Komponenten (alle von BasisView abgeleitet) arbeite und diese teilweise übereinander lege um dann meine fertige Form zu erhalten.
Von der BasisView wird (wo nötig) die aktualisieren Methode überladen.
Die verschiedenen Komponenten werden regelmäßig überarbeitet, sprich der Code erweitert. Derzeit schaut es so aus, dass ich eigentlich keine von BasisView abgeleitete Komponente mehr im Designer anzeigen kann. Dies ging aber vorher (auch nicht immer, oft musste ich das Projekt neu laden bzw. neu erstellen).
Wie kann ich da meine einzelnen Komponenten retten und so ändern, dass ich diese Designer-Probleme in Zukunft nicht mehr habe?

S
145 Beiträge seit 2013
vor 10 Jahren

Nur mal eine andere Idee, vielleicht hilfs ja.
Musst du wirklich immer ableiten oder würde es auch reichen wenn du nur eine BasisView hast und diese im Designer freigibst das man auf diese Controls ziehen kann?
Sprich ähnlich eines Panels dann Controls einfach draufziehen.

Dafür müsstest du nur entsprechende Designer Attribute bei deiner BasisView setzen.

Zumindest da wo die BasisView wirklich blos für eine einheitliche Ansicht da ist könntest du es so verwenden, wo du nichts überschreiben musst.

Ansonsten gibts auch manchmal Probleme,
wenn in einer Solution mehrere Projekte sind
und in dem einem Projekt eine refrerenzierte DLL lokal referenziert wird
und ein anderes Projekt in der Solution direkten verweis auf das Projekt der referenzierten DLL in der Solution hat.
(Hoffe verständlich was ich mein)

D
darktower Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

Das BasicView beinhaltet ja nur den Code was ich zuvor schon gepostet habe. Hier geht es nur um neue Variablen und Methoden, also keine Designeinstellungen.
Aber wie kann ich die neuen Methoden und Variablen sonst in die ganzen Views bringen ohne jedes mal den Code neu schreiben zu müssen? Das wäre wohl sehr schlechter Stil und extrem aufwändig bei Änderungen und Fehlersuche.

D
darktower Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

Ich bin gerade am Überlegen, ob ich nicht mein ganzes Design umkrempeln sollte.
Folgende Idee:
Ich verzichte auf die eigentliche BasisView und leite alle Views direkt von User Control ab. Das sollte von VS-Designerseite dann kein Problem mehr darstellen.
Anstatt des BasisView binde ich in jedes View eine eigene Komponente ein, welche die Properties und Methoden der alten BasisView enthält und außerdem eine Reverenz auf auf das entsprechende View enthält. Die einzelnen Views müssten dann nur immer ein Interface (Beobachter) implementieren und sich bei der inizialisierung bei der Komponente registrieren. Den Rest würde dann die Komponente regeln (was auch die Aufgabe meiner ursprünglichen BasisView war).
Ich hoffe meine Idee ist halbwegsw verständlich.

Könnte so eine Lösung funktionieren, oder habe ich da etwas Wichtiges nicht berücksichtigt?

p.s. Sorry für Doppelpost

4.221 Beiträge seit 2005
vor 10 Jahren

Ohne jetzt alles im Detail zu lesen:

Wieso machst Du in der BaseClass nicht 2 Constructors...

  1. Default-Constructor ohne Params (das ist der Ctor den der Designer aufruft)
  2. einen Constructor mit Params welchen Du aus den vererbenden Klassen aufrufst.

Je nach Constructor kannst Du Dir dann ein Flag setzen ob problematischer Code ausgeführt werden soll oder nicht.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

D
darktower Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

Der Konstruktor kann ja nicht das Problem für den Designer gewesen sein. Denn in der BasisView gibt es keinen eigenen Konstruktor (siehe 1.Posting->kompletter Code für die BasisView).
Einzig in den abgeleiteten Views wird innerhalb des Konstruktors auf protected Fields zugegriffen.

4.221 Beiträge seit 2005
vor 10 Jahren

Schau Dir mal das hier an:

UserControl kann im Designer nicht hinzugefügt werden

So kannst Du mal prüfen welcher Code deiner BasisView im Designer auf die Bretter geht...

Und ev. verstehst Du dann was ich in meinem vorherigen Post gemeint habe (wie Du über ein Flag problematischen Code im Designer umgehen kannst).

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...