Autor Beitrag
Ares
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Fr 24.09.10 12:57 
Hallo!

Ich einer WinForms Anwendung gibt es eine zentrales Steuerobjekt, das wichtige Informationen und globale Optionen für die Anwendung bereitstellt und verwaltet. Zu der Anwendung gehören verschiedene Formulare die auf diese Objekt zugreifen müssen.

Bislang bin bei jedem neuen Formular so vorgegangen, dass ich einfach ein neues Formular eingefügt und wie folgt abgewandelt habe:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    public partial class SubForm1 : Form {
        private AppController controler;

        public SubForm (AppController appControler) {
            controller = appController;

            InitializeComponent();
        }

        ...
    }


Die Formklasse hat also eine private Variable für den Controller erhalten die über den Konstruktor gesetzt wird. Dies muss für jedes Form wiederholt werden, das neu zu der Anwendung hinzugefügt wird. Die Arbeit wiederholt sich also ständig und eigentlich könnte man dies ja in einer gemeinsamen Oberklasse zusammenfassen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    public partial class ControllerForm : Form {
        protected AppController controller;

        public ControllerForm (AppController appControler) {
            controller = appController;

            InitializeComponent();
        }

        ...
    }


    public partial class SubForm1 : ControllerForm {
        ...
    }


Die neuen Formulare die ich in die Anwendung einfüge müssten also nicht direkt von Form erben sondern von ControllerForm wo die Verwendung und Einrichtung der controller-Variable bereits implementiert ist.

Aber wie mache ich das?

Die Klasse ControllerForm zu erstellen ist natürlich kein Problem. Aber wie erstelle ich nun automatisch Formulare die auf dieser basieren?

Problematisch ist hierbei vor allem die Methode InitializeComponent(). Diese wird nicht von Form geerbt sondern vom Designer automatisch erstellt. In der Classe ControllerForm benötige ich diese noch nicht. Wie erreiche ich dann aber, dass diese automatisch für die Unterforms erstellt wird?

Besten Dank
Ares
ThoMa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46
Erhaltene Danke: 3



BeitragVerfasst: Fr 24.09.10 14:18 
Hallo,

wenn ich im Projektexplorer auf Add->Item gehe, habe ich im Abschnitt Windows Forms das Template Inherited Form zur Auswahl, welches genau Deinem Wunsch entspricht.

Beachte bitte, dass Du für die Nutzung im Designer wahrscheinlich einen leeren Konstruktor auf Form-Ebene brauchst (nicht gestestet). Daher wäre es vielleicht zu überlegen den "AppController" als Singleton-Objekt in die AppDomain zu legen und Deine BasisForm holt sich dann das Objekt eben aus der AppDomain ab.

Die Sache mit dem veränderten Konstruktor ist zwar in Ordnung und wird auch von mir durchaus häufig so verwendet, aber ich bezweifele, dass der Designer wirklich damit zurecht kommen wird. Also bräuchtest Du auch den parameterlosen Konstruktor, was wieder dazu führen kann, dass Du beim programmatischen Aufruf vergisst das AppController-Objekt zu übergeben...

Grüße
ThoMa