Seite 1 von 1

[C#] Designer mit eigener Control-Basisklasse

Verfasst: 24.02.2012, 08:59
von BeRsErKeR
Hallo,

ich habe mit dem Designer ein Form erstellt. Darin befinden sich Panels, die ich als Zeichenflächen nutze. Da das ganze ohne DoubleBuffer flackert und die Panel-Klasse keine direkte Möglichkeit bietet diesen zu aktivieren, habe ich meine eigene Klasse von Panel abgeleitet und im Ctor DoubleBuffering auf true gesetzt. Nun muss ich dem Designer sagen, dass die Panels nicht von Panel erben, sondern von DoubleBufferPanel (meine eigene Klasse).

Diese Änderung hab ich in der Datei MyForm.Designer.cs vorgenommen, indem ich einfach private System.Windows.Forms.Panel MyPanel; durch private DoubleBufferedPanel MyPanel; ersetzt habe. Soweit so gut.

Nun gibt es da aber noch die Region, in der der Code steht, der vom Designer automatisch generiert wird (in InitializeComponent()). Dort steht ja folgendes:

this.MyPanel = new System.Windows.Forms.Panel();

Ich kann das zwar durch this.MyPanel = new DoubleBufferedPanel(); ersetzen, allerdings vermurkst der Designer den Code nach der nächsten Änderung in der Form wieder. Er merkt zwar, dass MyPanel nun vom Typ DoubleBufferedPanel ist, allerdings hängt er immer den Namen des Hauptnamespaces davor.

this.MyPanel = new MyForm.DoubleBufferedPanel();

Da dachte ich mir, biste mal ganz clever und packst DoubleBufferedPanel mit in die Klasse, die ja den selben Namen trägt wie der namespace. Allerdings war der Designer wieder schlauer und hing dann zusätzlich noch den Namen der Klasse davor:

this.MyPanel = new MyForm.MyForm.DoubleBufferedPanel();

Prinzipiell ist das ja sogar richtig, weil DoubleBufferedPanel in der Klasse MyForm im namespace MyForm liegt. Allerdings befinde ich mich hier in einer Methode der Klasse MyForm im namespace MyForm. Scheinbar kommt der Compiler damit nicht klar, was mich ehrlich gesagt wundert. Anscheinend sucht er nach einem relativen namespace/Klassennamen im aktuellen namespace, anstatt MyForm.MyForm.DoubleBufferedPanel aus globaler Sicht zu betrachten. Komisch nur, dass es ja bei System.Windows.Forms.Panel auch nicht so ist. Kommt er damit nicht klar, dass die Klasse genau so heißt wie der namespace? Das erste MyForm nach dem new interpretiert er nämlich bereits als MyForm.MyForm (also als die Klasse im namespace).

Die Fehlermeldung: Der Typname "MyForm" ist im Typ "MyForm.MyForm" nicht vorhanden.
Die Codezeile dazu: this.MyPanel = new MyForm.MyForm.DoubleBufferedPanel();


Gibt es eine elegante Möglichkeit das ganze zu umgehen, ohne die Panels aus dem Code heraus erstellen zu müssen? Oder liegt der Fehler irgendwo anders?

Die einzige Lösung, die ich gerade sehe ist das Umbenennen des namespace oder der Klasse. Würde ich jedoch unschön finden (MyForm ist natürlich hier nur ein Beispiel).

Re: [C#] Designer mit eigener Control-Basisklasse

Verfasst: 24.02.2012, 10:05
von Matthias Gubisch
Mir würde noch spontan ein UserControll einfallen dass von Panel erbt und deine gewünschte Funktionalität bereitstellt.
Sollte eigentlich klappen wenn ich den Problem richtig verstanden habe

Re: [C#] Designer mit eigener Control-Basisklasse

Verfasst: 24.02.2012, 19:35
von BeRsErKeR
Das Problem ist halt, dass er den namespace als Klasse interpretiert, da beide gleich heißen. Normal würde also das umbennen helfen. Das Projekt ist leider nicht auf meinem Mist gewachsen. Ich konnte es allerdings lösen, indem ich das neue Panel in einen eigenen namespace packe. Mit dem UserControl tritt das gleiche Problem auf. Aber nun hab ichs gelöst. Danke.