C# MainForm Enabled

exeto

Lt. Junior Grade
Registriert
Juli 2007
Beiträge
435
Hi,

ich habe auf meiner Main Form einen Button mit dem ich eine neue Form öffne und die MainForm auf Disabled setze.

Hier das ButtonClick Event:
Code:
NeueForm.get().Show();
this.Enabled = false;

Dies klappt wunderbar.

Wenn man jetzt in der neuen Form auf einen Button klickt soll die NeueForm geschlossen werden und die MainForm wieder enabled werden.

Habe da 2 Sachen ausprobiert.

Einmal so bei ButtonClick auf der neuen Form:
Code:
MainForm.get().Enabled = true;
NeueForm.get().Hide();
NeueForm.get().Dispose(true);
mForm1 = null;

bzw. eine public Methode auf der MainForm erstellt, die ich beim ButtonClick auf der neuen Form aufrufe mit:
Code:
public void setEnabled()
{
this.Enabled = true;
}
Und dann:
Code:
MainForm.get().setEnabled();
NeueForm.get().Hide();
NeueForm.get().Dispose(true);
mForm1 = null;

Nur die MainForm bleibt weiterhin auf Disabled, momentan hab ich nur nen "?" übern Kopf.
 
Warum machst du nicht einfach folgendes:
Code:
NeueForm.get().ShowDialog();

Dann kommst du aus der neuen Form einfach nicht mehr raus bis diese wieder geschlossen wird.

Edit:
Falls die darunter liegende Form doch noch klickbar sein soll, übergib diese doch einfach im Konstruktor von NeueForm:
Code:
    public partial class NeueForm : Form
    {
        private Form parentForm;

        public NeueForm(Form form)
        {
            InitializeComponent();

            this.parentForm = form;
            form.Enabled = false;
            this.FormClosed += NeueForm_FormClosed;
        }

        void NeueForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.parentForm.Enabled = true;
        }
    }
 
Zuletzt bearbeitet:
exec84 schrieb:
Warum machst du nicht einfach folgendes:
Code:
NeueForm.get().ShowDialog();

Dann kommst du aus der neuen Form einfach nicht mehr raus bis diese wieder geschlossen wird.

Ja, so passt das schonmal mit der Form, dass die MainForm gesperrt ist solange.
Trotzdem kann ich irgendwie keine Methoden von meiner MainForm über die neue aufrufen.

Wenn ich jetzt auf der neuen Form eine Textbox habe und der Inhalt soll bei der MainForm in eine Textbox geschrieben werden.
Dafür hab ich mir auf der MainForm eine Methode gemacht mit einem string als Übergabeparameter und diesen schreib ich dann auf der MainForm in die Textbox.

Die Methode ruf ich dann von der neuen Form auf und übergebe da den Inhalt der Textbox.

Wenn ich jetzt in Visual Studio einen Haltepunkt setze und die Schritte durchgehe, geht der da auch lang und schmeißt keinen Fehler. Aber der Text steht trotzdem nicht auf der MainForm in der Textbox.
 
Kommt drauf an, was die Methode get() der Form macht. Du wirst die Form als Singleton implementieren wollen. Dann achte darauf, dass du wirklich nur eine Instanz der Form hast und auch nur mit dieser einen Instanz arbeitest. So wie du das Problem schilderst, sieht es so aus, als würdest du die Methode, die die TextBox füllen soll, an einer anderen Instanz aufrufen (die aktuell gar nicht angezeigt wird).

Wenn du die Parent Form (die dann im Hintergrund sein soll) als Parameter im Konstruktor von NeueForm übergibst, kannst du alle (non-private/protected) Methoden der Parent Form in NeueForm aufrufen. So würde ich das rein intuitiv machen.
 
exec84 schrieb:
Kommt drauf an, was die Methode get() der Form macht. Du wirst die Form als Singleton implementieren wollen. Dann achte darauf, dass du wirklich nur eine Instanz der Form hast und auch nur mit dieser einen Instanz arbeitest. So wie du das Problem schilderst, sieht es so aus, als würdest du die Methode, die die TextBox füllen soll, an einer anderen Instanz aufrufen (die aktuell gar nicht angezeigt wird).

Ja, natürlich... So ein dummer Fehler...*Facepalm*
Jetzt klappts!

Code:
private static MainForm mForm1;

public static MainForm get()
        {
            if (mForm1 == null)
            {
                mForm1 = new MainForm();
            }
            return mForm1;
        }

Das hat mir natürlich nix gebracht, da ich in der Program.cs drinne stehen hatte:
Code:
Application.Run(new MainForm());
Anstatt:
Code:
Application.Run(MainForm.get());
 
So als Tipp für die Zukunft: Genau aus dem Grund ists eigentlich immer ne gute Sache den Konstruktur direkt private zu machen, wenn du eine Klasse zum Singleton machst. Dann kann dir sowas gar nicht erst passieren :)
 
BlooDFreeZe schrieb:
So als Tipp für die Zukunft: Genau aus dem Grund ists eigentlich immer ne gute Sache den Konstruktur direkt private zu machen, wenn du eine Klasse zum Singleton machst. Dann kann dir sowas gar nicht erst passieren :)

Der Konstruktor deiner Singleton-Klasse muss zwingend private sein, wenn du das Entwurfsmuster "wie im Lehrbuch" implementieren willst.

Aber der Fehler passiert dir sicher nicht mehr. ;)
 
BlooDFreeZe schrieb:
So als Tipp für die Zukunft: Genau aus dem Grund ists eigentlich immer ne gute Sache den Konstruktur direkt private zu machen, wenn du eine Klasse zum Singleton machst. Dann kann dir sowas gar nicht erst passieren :)

Singletons sind total grauenhaft und sollten überhaupt nicht mehr verwendet werden. Wenn man es richtig machen möchte arbeitet man direkt mit den passenden Referenzen und setzt dann auf Dependency Injection bzw Inversion of Control.


@exeto Mich würde es viel mehr interessieren wieso ausgerechnet die Form überhaupt ein Singleton sein soll? Was ist da der Beweggrund dahinter?
 
Zurück
Oben