.NET geerbt (WinForms) Formular - VS-Designer-Problem

8

Ich habe mehrere Formulare in einer C # -Anwendung. Ich verwende Visual Studio 2010 Beta, aber .NET 3.5 und C # 3.

Ich habe eine Basisform namens FilteredQueryViewForm im Shd-Namespace, und ich möchte, dass einige andere Formen sie erben (weil sie im Prinzip dasselbe machen, aber mit einigen Zusätzen).

Ich habe in der FilteredQueryViewForm-Klasse Dinge von privat in geschützt geändert, sodass sie über die abgeleiteten Formulare zugänglich sind. Danach habe ich ein abgeleitetes Formular erstellt und die Basisklasse auf FilteredQueryViewForm festgelegt.

Der Designer der abgeleiteten Klasse beschwerte sich über Shd.FilteredQueryViewForm ohne Konstruktoren ... unabhängig davon, dass es eine hatte, mit 3 Parametern. Ich dachte, dass Parameter ein Problem sein können, also habe ich auch einen (öffentlichen, natürlich) Konstruktor ohne Parameter erstellt, aber es funktioniert immer noch nicht. Die Fehlermeldung ist die gleiche:

  

"Konstruktor vom Typ 'Shd.FilteredQueryViewForm' nicht gefunden."

Und der Designer der abgeleiteten Klasse wird nicht geladen. Ich habe versucht, vs2010beta neu zu starten, das abgeleitete Formular neu erstellend, aber nichts scheint zu helfen. Google hat mir zu diesem Problem keine nützlichen Ergebnisse geliefert. : (

Ist das ein Problem von Visual Studio 2010 Beta? Oder mache ich etwas falsch?

    
ShdNx 01.08.2009, 16:26
quelle

3 Antworten

19

Sie benötigen einen Konstruktor ohne Parameter, der die InitializeComponent () -Methode in jedem Ihrer Formulare aufruft. Schließen Sie dann das Designerfenster, erstellen Sie die Lösung neu und versuchen Sie, den Designer erneut zu öffnen. Das sollte funktionieren. Der Wiederaufbau der Lösung ist von wesentlicher Bedeutung.

Das Problem ist, dass wenn Sie ein Formular erstellen, das von Shd.FilteredQueryViewForm erbt, der Designer versucht, den Konstruktor des übergeordneten Formulars aufzurufen, aber es lädt dieses Formular nicht aus Code, sondern aus seiner gebauten Assembly.

    
Emiswelt 01.08.2009, 16:37
quelle
1

Ich weiß, dass es ein altes Thema ist, aber diese Dinge passieren wieder, also denke ich, dass mein Beitrag in Zukunft nützlich sein könnte.

Emiswelt sagt "Sie benötigen einen Konstruktor ohne Parameter, der die InitializeComponent () -Methode in jedem Ihrer Formulare aufruft." Dies ist nicht wirklich notwendig. Sie können einen benutzerdefinierten parametrisierten Konstruktor für das abgeleitete Formular deklarieren und normalerweise die "InitializeComponent" -Methode (mit einem Aufruf an einen benutzerdefinierten Konstruktor) aufrufen. Wichtig ist, dass Ihr Konstruktor "InitializeComponent" (für neue Steuerelemente) und Basiskonstruktoraufrufe "InitializeComponent" (für geerbte Komponenten) aufruft. Diese Situation wird zur Laufzeit ausgeführt, aber Sie sehen keine ererbten Steuerelemente für den Visual Studio-Designer. Um alle Steuerelemente zur Entwurfszeit anzuzeigen, sollten Sie nur einen einfachen Konstruktor ohne Parameter in der Basisklasse hinzufügen.

Wenn Ihre Basis beispielsweise ein Formular mit einer Schaltfläche und zwei Optionsfeldern ist:

%Vor%

Sie können es auf dem Design-Tool sehen und Sie können den leeren Konstruktor (ohne Parameter) ohne Probleme vermeiden. Das Form2 wird jetzt von Form1 geerbt:

%Vor%

Es gibt keinen leeren Konstruktor und er wird normal kompiliert und ausgeführt. Zu Ihrer Zeit wird Ihr Form2 den gleichen Kontrollsatz wie Form1 zeigen. Aber ... Sie können es zur Entwurfszeit nicht sehen, da Visual Studio nicht erkennen kann, wo die "InitializeComponent" -Methode ist und ein Fehler angezeigt wird. Warum? Weil irgendwo in der Aufrufkette ein Konstruktor ohne Parameter sein sollte. Die Lösung ist eine einfache Modifikation der Basisklasse:

%Vor%

Das ist alles.

    
tedebus 30.07.2015 15:47
quelle
0

Ich glaube, du meintest, dass dein Form1.cs [Design] beim Hinzufügen deiner Basisklasse nicht aktualisiert wurde. Ich hatte das gleiche Problem. Seltsamerweise läuft das Programm problemlos, wenn Sie Start drücken. Ihre Basisklassenkomponenten werden auf Ihrem Formular angezeigt, wenn Sie es ausführen, aber nicht im Bearbeitungsmodus.

Klicken Sie einfach auf Form1.cs im Solution Explorer. Es hat für mich funktioniert.

    
user3832863 02.04.2015 02:39
quelle