Laden...

Mehrere Forms in eine Hauptform einbinden möglich?

Erstellt von Xorgol vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.488 Views
X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren
Mehrere Forms in eine Hauptform einbinden möglich?

Ist es möglich in C# mehrere Forms in einer Hauptform anzuzeigen?

Folgendes Problem:

Ich würde gerne eine Anwendung schreiben, welche mehrere Fenster hat. z.B. Optionen usw.

Da ich nun nicht mehrere übereinanderliegende Controls und Buttons haben möchte, welche ich immer invisible und visible schalte, hatte ich mir überlegt einfach für jedes Fensterdesign eine eigene Form zu entwerfen mit FormBorderStyle None und diese dann in einer Hauptform anzuzeigen.

Die Hauptform hätte dann einen FormBorderStyle, damit man diese verschieben kann.

Gibt es hierfür Möglichkeiten? Leider habe ich mit Google nicht wirklich was gefunden, oder ich hab einfach nur nach den falschen Begriffen gesucht.

Vielen Dank im Voraus!

5.742 Beiträge seit 2007
vor 16 Jahren

Hallo Xorgol,

so ganz habe ich dein Problem nicht verstanden.
Meinst du vielleicht MDI?
Oder eine Art Wizard?

B
342 Beiträge seit 2006
vor 16 Jahren

Hi,
also ich würde an deiner Stelle TabControl oder mehrere Panels benutzen.
Viele Grüße,
Big Al

Da man Spatzen nicht mit Kanonen jagt, sollte man auch nicht mit Computern auf Spatzenhirne losgehen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Xorgol,

schreib besser UserControls statt Forms.

Siehe auch Mit Forms eine art Frame einer Website nachbauen?

herbivore

T
153 Beiträge seit 2007
vor 16 Jahren

hey,

gib mal in der suche "frame" oder "forms als frame" oder so ein, da kommt einiges. vorallem auf der 2. seite (bei der suche nach letzterem), die 3. unteren beispiele sollten sein was du suchst.

gruß
toxick

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Also ich würde eben gern mehrere Forms (ich nenn das einfach mal so) im Designer einrichten, diese dann jedoch in einer Hauptform anzeigen so wie ich sie gerade benötige?

5.742 Beiträge seit 2007
vor 16 Jahren

Original von Xorgol
mehrere Forms (ich nenn das einfach mal so) im Designer einrichten

Wenn du wirklich Forms verwenden willst, ist das mit sehr viel Aufwand verbunden.

Was hast du gegen den Vorschlag von herbivore? UserControls kann man auch mithilfe des Designers designen.

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Ok, dann werde ich mich mal grundlegend damit auseinandersetzen wie man UserControls richtig anwendet.

T
153 Beiträge seit 2007
vor 16 Jahren

yep, seh ich auch so. oder meinst du mehr mdi basierend, mit verschiedenen bereichen und zum andocken und so sachen?!

gruß
toxick

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Nein es geht nur darum, das ich bisher alles in Forms angelegt habe aber dann ja fuer jede Form ein neues Window mit Taskleisteneintrag etc geoeffnet wird.

Dies will ich jedoch vermeiden. Es soll nur 1 Hauptwindow geben und der rest darunter gegliedert sein, aber dennoch strukturiert, damit ich z.B. ein Design der Options in spaeteren Projekten wiederverwenden kann usw.

A
1 Beiträge seit 2007
vor 16 Jahren

Hallo Xorgol,

also wenns nur darum geht den Taskleisteneintrag des Forms zu verhindern, brauchst du nur die Form-Eigenschaft ShownInTaskbar auf FALSE setzen.

Gruß
AndyG

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

So, ich habe nun die Sache mit UserControls geloest.

Ich habe eine MainForm, in welcher die verschiedenen UserControls zur Laufzeit eingebunden werden.

Nur habe ich nun ein Problem mit der Groeße der MainForm.

Und zwar sind verschiedene UserControls unterschiedlich hoch. D.h. wenn z.B. die Menuleiste allein auf der Form ist ( Leistenhoehe 40 ) haette ich gern, das sich die Mainform auf die Groeße reduziert.

Wenn ich die Groeße der MainForm nun allerdings "Hardcode" eintippe, stimmt diese nicht mehr sobald man ein anderes Windows Theme benutzt. z.B. Classic oder eben XP Style unterscheiden sich hier drastisch von der Groeße der oberen Leiste.

Gibt es hier eine geschickte Loesung wie man die MainForm immer genau auf die Groeße eines UserControls anpasst und dies unabhaenig von dem gewaehlten XP Theme?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Xorgol,

myForm.ClientSize = myUserControl.Size

herbivore

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Vielen Dank

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Waere es eigtl. besser jedes UserControl mit einem Singleton auszustatten oder wirklich die Controls jedes mal wenn sie wieder gebraucht werden neu zu erzeugen?

Was wenn ich z.B. von einem Options Control spaeter die Daten nochmal brauchen wuerde? Nach dem Form.Controls.Remove(Options) sind diese doch weg oder?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Xorgol,

Waere es eigtl. besser jedes UserControl mit einem Singleton auszustatten oder wirklich die Controls jedes mal wenn sie wieder gebraucht werden neu zu erzeugen?

nein, Singleton wäre nicht das richtige, aber auch das immer wieder neu Erzeugen ist nicht nötig.

Nach dem Form.Controls.Remove(Options) sind diese doch weg oder?

Nein, du kannst das Control später einfach mit Form.Controls.Add(Options) wieder hinzufügen.

herbivore

M
402 Beiträge seit 2005
vor 16 Jahren

mal nebenbei gefragt an die Profis....

Wär nicht hierfür auch die "Smart Client Software Factory" zu verwenden?

Für kleine Anwendungen wärs vermutlich ziemlicher Overkill aber
bei mehreren Modulen?

lg
M@TUK

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Ich werde mal rumtesten!

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Xorgol,

wie kann ich aus Options auf das in MainControl angelegte Control startmenu zugreifen ohne dies neu anlegen zu muessen? 😕

am besten gar nicht. Die UserControls sollten sich untereinander nicht kennen! Das ist auch nie nötig!

Das MainControl darf alle UserControls kennen und sollte alle Kommunikation, die zwischen den UserControls nötig sein sollte, vermitteln. Ein UserControl kann z.B. ein Event feuern, den das MainControl empfängt und darauf hin alle Aktionen auslöst, die in anderen UserControls nötig sind.

herbivore

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Hey,

Ich habe mir die Geschichte mit Events nun angeschaut, aber irgendwie krieg ich das nicht ganz hin. Ich hab auch Code von dir hier im Forum gefunden wo du beschreibst wie man Events anlegt und nutzt.

Ich habe die 2 UserControls MainMenu und MainControl.

Wobei MainControl sich ein Objekt MainMenu anlegt und anzeigt.

Nun habe ich in MainMenu folgendes implementiert:


        public event EventHandler MyEvent;

        protected void OnMyEvent(EventArgs ea)
        {
            if (MyEvent != null)
            {
                MyEvent(this, ea);
            }
        }

Auf dem Control MainMenu gibt es zudem einen Button "Options"



        private void btnOptions_Click(object sender, EventArgs e)
        {
            OnMyEvent(EventArgs.Empty);
        }

Wenn ich nun aber wie du in deiner Beschreibung stehen hast in MainControl das Event registrieren will, finde ich dies nicht 😠

        UserControl cmainmenu;
        
    

        public MainControl()
        {
            InitializeComponent();
            cmainmenu = new Controls.MainMenu();

        }

Nun müsste ich laut deiner Anleitung ( Link ) doch über cmainmenu.MyEvent += new EventHandler (auszufuehrendeFkt); das Event registrieren koennen.

Jedoch gibt es kein Eintrag cmainmenu.MyEvent ?

Was übersehe ich? 😠

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Xorgol,

Nun müsste ich laut deiner Anleitung doch über cmainmenu.MyEvent += new EventHandler (auszufuehrendeFkt); das Event registrieren koennen.

richtig, wobei du unter .NET 2.0 kürzer und besser cmainmenu.MyEvent += auszufuehrendeFkt; schreiben kannst. Keine Ahnung, warum das bei dir nicht geht. Der Code sieht richtig aus.

herbivore

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Kann es daran liegen das ich schon unter .NET 3.0 entwickle und sich da was geaendert hat was das anlegen von Events betrifft?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Xorgol,

nein, zwischen .NET 2.0 und .NET hat sich der C# Sprachumfang nicht geändert. Er ändert sich erst mit .NET 3.5 und selbst dann ist zu erwarten, dass die Änderungen abwärtskompatibel sind.

herbivore

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Also mit folgenden Aenderungen laueft es:

MainMenu:

public static event EventHandler MyEvent;

MainControl:

 
public MainControl()
{
           InitializeComponent();
            cmainmenu = new Controls.MainMenu();
            MainMenu.MyEvent += new EventHandler(MainMenu_MyEvent);
}

        void MainMenu_MyEvent(object sender, EventArgs e)
        {
            OpenOptions();
        }

        public void OpenOptions()
        {
            Console.WriteLine("eventaaaaa!");
        }

Wieso es ohne static nicht funktioniert weiß ich leider noch immer nicht. Gibt es irgend was dagegen einzuwenden dies einfach als static stehen zu lassen? 🙂

X
Xorgol Themenstarter:in
25 Beiträge seit 2007
vor 16 Jahren

Ich schäme mich ja fast den Fehler zu nennen 🙂

Es geht wie in deinem Beispiel. Ich sollte nur bei der Deklaration nicht

UserControl cmainmenu;

sondern

MainMenu cmainmenu;

schreiben 🙂