2010-11-22 9 views
1

Im besten Fall bin ich ein UI-Neuling, aber ich bin ein ziemlich guter OO-Entwickler (wenn ich das nicht selbst sage). Ich bin verwirrt, wie man mit dem Designer arbeitet. Ich entwickle eine Windows Forms-Anwendung. Ich habe eine Kontrolle (TabPage), die ich von System.Windows.Forms.TabPage abgeleitet habe, die ich auf einer System.Windows.Forms.TabControl Kontrolle platzieren möchte.Wie verwende ich abgeleitete Steuerelemente in meiner Windows Forms-Anwendung

public class MyTabPage : TabPage 
{ ... } 

Ich bin mir nicht sicher, wie ich den Designer dazu bringen soll, meine Kontrolle zu benutzen.

Ein Mitentwickler sah dies für mich als vorgeschlagen, dass ich weitere Informationen hinzufügen.

Ich habe eine WinForms-Anwendung prototypisiert. Die Anwendung hat eine TabControl, mit drei Registerkarten. Jede TabPage hat eine SplitterControl mit einer DataGridView Kontrolle in jeder Hälfte des Splitters. Die beiden Steuerelemente DataGridView bilden eine Master-Detail-Ansicht einiger Daten, die wir bearbeiten müssen. Ich habe jedem DataGridView-Steuerelement und jedem Mal, wenn der Handler-Code in dem Formular platziert wird, eine Reihe von Ereignishandlern hinzugefügt. Das Formular wird ziemlich überfüllt und möchte OO-Techniken verwenden, um Dinge zu säubern.

Ich möchte jetzt den Prototyp wiederholen und da jeder TabPage verhaltensidentisch ist, würde ich gerne OO verwenden, um etwas von der Komplexität wegzuspalten. Hier kommt meine mangelnde Erfahrung mit dem Designer ins Spiel. Es muss einen Weg geben, den Designer für etwas Komplexeres zu verwenden als meinen ursprünglichen Prototyp.

Antwort

0

Es ist eine Weile her, aber ich dachte, ich würde diese Frage beantworten.

Ich war in der Lage, die OO-Implementierung, die ich wollte, durch Aufteilen der Kontrolle zu bekommen. Die Steuerung ist fast genauso implementiert wie der Prototyp. Ich erstellte dann eine Steuerbinderklasse mit abgeleiteten Klassen, um das spezifische Verhalten, das ich benötigte, zu enthalten. Das Steuerelement hat einen Verweis auf die Bindemittel-Basisklasse und ruft die Binderfunktionalität nach Bedarf auf. Die abgeleiteten Ordner überschreiben Eigenschaften und Methoden nach Bedarf. So ziemlich eine Lehrbuch-OO-Lösung.

Wo ich stolperte, war zu denken, dass ich eine Kontrollmiete haben musste.

Vielen Dank für Ihre Hilfe. Ich war unter etwas Druck, als ich diese Frage stellte. Es ist erstaunlich, wie viel ich in den vergangenen Monaten gelernt habe.

1

Usercontrol

einfach eine Benutzersteuerung erstellen, die Ihre Steuerung enthält. Dann wird es im ToolBox-Fenster von Visual Studio verfügbar sein.

Weitere Details Understanding the User Control Designer ...

Ein Benutzer Control ist ähnlich wie bei jeder anderen Klasse, aber mit der zusätzlichen Fähigkeit, in der Toolbox und angezeigt auf einem Formular platziert werden.

Das Lernprogramm unterscheidet sich ein wenig von Visual Studio 2010, aber ich bin sicher, dass Sie es durchstehen werden.


TabPage Steuerung

Was die TabPage Kontrolle, können Sie es nicht stand-alone im Designer. Es muss Teil eines TabControls sein.

Das TabControl enthält TabPage-Steuerelemente. Wenn Sie den Designer verwenden, um TabPage hinzuzufügen oder zu entfernen, kann er im Backend "new TabPage" nicht bestimmen, dass er eine neue Instanz der abgeleiteten Klasse von TabPage erstellen muss.


Andere Vorschläge

A TabPage nur ein Container ist, kann ich nicht herausfinden, warum Sie die TabPage Kontrolle außer Kraft setzen müssen. Ich weiß, dass Sie Ihrer Frage einige Informationen hinzugefügt haben, aber Sie müssen sie möglicherweise noch einmal überprüfen, damit wir sie besser verstehen können.

Da TabPage ein Container ist, sollten Sie ein UserControl erstellen, das Ihren SplitContainer und Ihre DataGridViews enthält. Daher können Sie dieses Benutzersteuerelement auf jeder Registerkarte erneut verwenden.

Der Designer ist nur eine Ergänzung zur UI-Programmierung, es ist nicht zwingend erforderlich. Sie können einem TabPage ein Benutzersteuerelement hinzufügen, ohne den Designer zu verwenden.

Ich kann hier von der Strecke abweichen, wenn ja bitte weitere Details angeben. Ein visueller Prototyp dessen, was Sie brauchen, kann helfen.

+0

Ich dachte, dieser Teil und dachte großartig. Ich habe ein Steuerelement namens MyTabPage erstellt, das von TabPage abgeleitet wurde. Wenn ich MyTabPage im Designer öffne, sehe ich nicht, wie man die Steuerelemente SplitContainer und DataGridView hinzufügt (und anordnet). Ich habe dann dasselbe mit dem SplitContainer-Steuerelement versucht. Dasselbe ist passiert ... Ich sehe nicht, wie ich den Designer zum Bearbeiten meiner abgeleiteten Steuerelemente verwenden kann. –

1

Leider gibt es keine praktische Lösung für Ihr Problem. Sie müssten auch ein benutzerdefiniertes TabControl erstellen und ihm einen eigenen Designer zuweisen, damit es Instanzen der abgeleiteten Klasse anstelle der Standard-TabPage-Klasse erstellt. Leider ist die TabControlDesigner-Klasse in System.Design.dll intern und kann nicht abgeleitet werden. Sie müssten einen vollständigen Ersatz dafür schreiben. Das ist schwierig, es ist ein ziemlich fortgeschrittener Designer. Sie können einen Blick darauf werfen - mit Reflector sehen, was es braucht.

+0

Wie entwickeln echte UI-Entwickler ihren Code? Es scheint, als ob der Designer für triviale Anwendungen gut ist, aber für jede Substanzanwendung nutzlos ist. Ich denke, es fällt mir schwer, das zu kaufen. –

+1

Sie sind ziemlich schnell, um es nach nur einer Geschwindigkeit-Beule zu entlassen. Das Anpassen einer TabPage ist sehr ungewöhnlich, es macht nichts sehr nützliches, das angepasst werden muss. Es ist nur ein Container für Kontrollen. Ich kann dir mit einer guten Antwort nicht helfen, du hast nicht erklärt, warum du es anpassen willst. –

+0

Das kam schlecht rüber. Ich lehne es nicht ab, im Gegenteil, meine Erwartung ist, dass es wahrscheinlich einen Weg gibt, zu tun, was ich will, aber mein Mangel an Erfahrung humpelt mich. Ich fügte der Frage mehr Detail hinzu, um besser zu verstehen. Ich dachte mir, dass die TabPage möglicherweise der falsche Ort für die Thederivation ist, also habe ich versucht, den SplitContainer abzuleiten. Ich vermisse immer noch etwas. Danke für die Antwort. –

1

Sie ändern nicht wirklich das Verhalten der TabPage, es ist nur ein Container immerhin :). Die TabPage und TabControl sind ziemlich eng gekoppelt, und sie sollten wahrscheinlich sein. Ihre "Kontrolle" ist, was auf der TabPage platziert werden soll. Definieren Sie Ihr Benutzersteuerelement als ein Panel mit einem Splitter und zwei Datagridviews und lassen Sie dann einfach Ihr Benutzersteuerelement auf jede TabPage in Ihrer App fallen. Das Tab Control/Page Tandem funktioniert weiterhin automatisch und Ihr benutzerdefinierter Code befindet sich im entsprechenden Steuerelement.

Verwandte Themen