2009-05-15 8 views
1

ich eine Basisklasse habe, wie unten definiert (Ich bin auch mit DevExpress Komponenten):konkrete Umsetzung von generischer Form funktioniert nicht in Designer

public abstract partial class BaseFormClass<R> : XtraForm where R : DataRow 
{ 
    ... 
} 

Im Gegensatz zu dem, was ich von anderswo gelesen habe, ich Ich bin immer noch in der Lage, diese Klasse zu entwerfen. Ich musste dafür keine konkrete Klasse erstellen. Aber wenn ich eine konkrete Klasse abstammt (wie unten), wird diese Klasse im Designer nicht funktionieren.

public partial class ConcreteFormClass : BaseFormClass<StronglyTypedRow> 
{ 
    ... 
} 

ich diese Meldung:

Der Designer nicht für diese Datei, weil keiner der Klassen innerhalb sie können so gestaltet werden, gezeigt werden konnte. Der Designer hat die folgenden Klassen in der Datei überprüft: ConcreteFormClass --- Die Basis Klasse 'BaseFormClass' konnte nicht geladen werden. Stellen Sie sicher, dass auf die Assembly verwiesen wurde und dass alle Projekte erstellt wurden.

Hat jemand das schon einmal gesehen? Irgendeine bekannte Problemumgehung?

+0

Ich weiß, seine alten, aber sehen, wenn Sie –

Antwort

4

Sorry, aber das wird einfach nicht funktionieren (was eine Schande ist - ich habe mir in der Vergangenheit gewünscht, dass Sie das auch tun könnten.) Das Problem ist die grundlegende Methodik des Designers.

Um Ihnen ein Modell Ihrer Form zu präsentieren, versucht es nicht, das Formular selbst zu konstruieren; Wenn es so wäre, würden Sie auf andere Probleme stoßen - was, wenn Ihr Formular keinen parameterlosen Konstruktor hat? Stattdessen instanziiert es tatsächlich eine Instanz der Basisklasse Ihres Formulars. Dann fegt es durch Ihre InitializeComponents() Methode und "Schichten auf" alle Kontrollen, die Sie dort auf dem Basisformular definiert haben.

So ist es offensichtlich, warum das nicht funktioniert. Sie können eine Instanz von BaseFormClass entwerfen, da dies eine Instanz von XtraForm erstellt, die konkret ist. Aber Sie können keine Instanz von ConcreteFormClass entwerfen, weil Sie dazu eine Instanz BaseFormClass erstellen müssten, die abstrakt ist.

Die einfachste Problemumgehung dafür ist, einfach BaseFormClass nicht abstrakt zu machen. (Wenn Sie absolut sicher gehen wollen, dass niemand einen erstellen kann, könnten Sie vielleicht den Standardkonstruktor privat machen? Ich bin mir nicht sicher, ob der Designer damit umgehen kann, aber ich sehe nicht, warum das nicht geht.) Saugt, aber So ist das Leben. Beschweren zu Microsoft und vielleicht wird es besser sein, in Visual Studio 2012.

+0

Dank meine Antwort überprüfen können, aber jetzt habe ich versucht, die bedingte Kompilierung verwenden, die Klasse Beton drehen, und seine abstrakten Mitglieder virtuelle drehen. Ich bekomme immer noch dieselbe Nachricht.Der Grund, warum ich es abstrakt gemacht habe, war nicht, die Instanziierung zu verhindern, sondern weil ich abstrakte Mitglieder habe, deren Implementierung von der konkreten Klasse abhängt. Danke für die schnelle Antwort. – Dov

+0

Ich habe mich damit abgefunden, die absteigenden Klassen nicht zu entwerfen. Es war nicht nötig, und ich musste meine Architektur ein wenig ändern, aber es ist keine schlechte Sache. Danke, dass du mir geholfen hast, nicht zu viel Zeit mit dem Unmöglichen zu verschwenden. – Dov

+0

Schauen Sie sich meine und die Lösung von ruzch an, die in meiner Antwort –

0

Das klingt wie ein wirklich ähnliches Problem mit dem Designer immer Formen zu machen, das eine abstrakte Basisklasse hat. Ich habe keine generische Mehrfachvererbung gemacht, aber Sie konnten wenigstens my approach versuchen und sehen, ob es funktioniert.

Edit: Ja, ok, gerade versucht es, meine Lösung funktioniert sicher. Sie müssen nur die Mittelklassendefinition und die Formulardefinition ändern (eingewickelt in #if DEBUG)

Lassen Sie mich wissen, wenn Sie es versuchen können!

+0

Ich erwähnte in meinem ersten Kommentar zu der akzeptierten Antwort, dass ich zu diesem Zeitpunkt die bedingte Kompilation versucht hatte, aber das war eher eine Unannehmlichkeit, als den Designer nicht benutzen zu können. Danke für den Vorschlag. Vielleicht wird das für jemand anderen mit der gleichen Frage funktionieren. – Dov

+0

Ich denke vielleicht an die falsche Sache, aber wie ist bedingte Kompilierung ein Problem? Oder konnten Sie es einfach nicht zur Arbeit bringen? Solange Sie nicht im Freigabe-Modus entwerfen müssen und solange Sie keinen Debug-Code zur Produktion freigeben (was Sie nicht tun sollten), wird es nahtlos funktionieren –