2009-03-24 18 views
33

Ich habe eine generische Basisklasse für eine WinForm Usercontrol:Allgemeinbasisklasse für WinForm Usercontrol

public partial class BaseUserControl<T> : UserControl 
{ 
    public virtual void MyMethod<T>() 
    { 
     // some base stuff here 
    } 
} 

Und ein Usercontrol basiert darauf, dass:

public partial class MyControl : BaseUserControl<SomeClass> 
{ 
    public override void MyMethod<SomeClass>() 
    { 
     // some specific stuff here 
     base.MyMethod<SomeClass>(); 
    } 
} 

Es funktioniert gut, aber MyControl können nicht bearbeitet werden im VisualStudio Designer, weil es besagt, dass die Basisklasse nicht geladen werden kann. Ich habe versucht, eine andere Klasse BaseUserControl, nicht generisch zu definieren, in der Hoffnung, es würde es laden, aber der Trick scheint nicht zu funktionieren.

Ich habe bereits eine Abhilfe: Definieren Sie eine Schnittstelle, IMyInterface <T>, und dann meine Kontrolle als

erstellen
public partial class MyControl : UserControl, IMyInterface<SomeClass> 

Aber ich verliere meine Basis virtueller Methoden (keine große Sache, aber immer noch ...).

Gibt es eine Möglichkeit, eine generische Basisklasse für ein UserControl zu erstellen, mit der Möglichkeit, sie im VisualStudio Designer zu bearbeiten?

+0

Sie nicht Ihre Basis virtuellen Methoden zu lösen, enthalten Implementierer Klasse statt erben von ihm. – Robocide

Antwort

34

Wir machen das gleiche und wir arbeiten zuerst mit der Spezialisierung einer Klasse und leiten von der spezialisierten Klasse ab. den Code aus Ihrem Beispiel verwenden bedeutet dies, so etwas wie:

public partial class UserControl : UserControlDesignable 
{ 

... 
} 
public class UserControlDesignable : BaseUserControl<Someclass> { } 

Der Designer noch flockig manchmal wirkt - aber die meiste Zeit es funktioniert.

+0

Während eine Problemumgehung, beachten Sie, dass dies in einer zusätzlichen Datei muss, und wenn die Basis abstrakt ist und ein benutzerdefiniertes Typ Provider-Attribut verwendet (wie in anderen Posts auf dieser Website erwähnt) muss es auf jeder Klasse –

+0

gehen immer noch die einzige funktionierende Lösung in VS2015. Keine native Unterstützung von MS hinzugefügt ...:-( –

14

Sie müssen den Designer tricksen, indem Sie eine 'reguläre' Klasse hinzufügen, die von Ihrem generischen Basisformular erbt. Ihr designfähiges Formular sollte dann von dieser Klasse erben. Die folgenden 2 Klassendefinitionen befinden sich somit in derselben Datei. Sie müssen sicherstellen, dass die Klasse, die von der generischen Basisbenutzersteuerung erbt, die letzte Klasse in der Datei ist.

public MyForm : EditableCustomerForm 
{} 

public EditableCustomerForm : GenericForm<Customer> 
{} 

Der Designer zeigt die erste Klasse in der gefundenen Codedatei an.

+0

Großartige Idee, aber da eine Basisklasse bereits kompiliert werden muss, bevor der Designer sie verwenden kann, bedeutet dies, dass für alle Änderungen an der EditableCustomerForm-Klasse der Konstruktor neu erstellt werden muss, damit er wirksam wird Designer wird wahrscheinlich nur auf der MyForm-Klasse arbeiten –

3

Nun, das scheint ein Fehler in Visual Studio zu sein.

Durch in den Rahmen Gräbt (tatsächlich durch ein RootDesignerSerializer mit einem benutzerdefinierten Typ von CodeDomSerializer und Überschreiben der serialize Methode abgeleiteten Zugabe), konnte ich die VS-Code Dom Anbieter beweisen, dass falsch, die generischen Klassen tatsächlich Parsen und stattdessen es als eine generische Klasse betrachtend betrachtet es es als eine reguläre Klasse mit dem Namen class<T>, die Type.GetType() natürlich nicht finden kann.

Ich bin immer noch auf der Suche nach einem Weg, um es zu umgehen, aber in der Zwischenzeit kann man die oben genannten Lösungen verwenden.

Es gibt einen Microsoft.Connect Fehlerbericht darauf, stimmen Sie bitte darauf an https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a-generic-form

Verwandte Themen