1.3k Aufrufe
in Anwendungen(Java,C++...) von
Hallo liebe Leute!
Ich brauche mal wieder etwas Unterstützung. Es geht um folgenden
Quellcode in C#:

private void buttonAnwendungenTextverarbeitung_Click(object
sender, EventArgs e)
{
Boolean schonda = false;

foreach (Form fenster in Application.OpenForms)
{
if (fenster.Name == "frmTextverarbeitung")
{
schonda = true;
}
}

if (schonda == false)
{
frmTextverarbeitung _frmTextverarbeitung = new
frmTextverarbeitung();
_frmTextverarbeitung.Show(this);
}
}

Ziel sollte es sein, lediglich eine Instanz eines Formulars
frmTextverarbeitung anzuzeigen, allerdings wird bei jedem Klick auf
den Button eine neue Instanz angezeigt. Keine Ahnung wieso - ich
steh zur Zeit echt auf dem Schlauch. Es ist keine MDI-Anwendung!
Für Tipps und Hinweise zur positiven Realisierung bin ich echt
dankbar.
Gruß, Uwe

4 Antworten

0 Punkte
von repiv Mitglied (272 Punkte)
Hallo,

der Code den Du gepostet hast, tut das was er soll. Da ist der Fehler nicht. Das Problem ist, dass Visual Studio beim Erzeugen einer Form den Namen intern nur nach einer Änderung setzt. Solange der Dateiname mit dem Klassennamen übereinstimmt ist Name="". Deshalb funktioniert der Vergleich nicht.
Das siehst Du, wenn Du dir den Code in frmTextverarbeitung in der Funktion InitializeComponent(); ansiehst:


private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Text = "frmTextverarbeitung";
}

Da steht nichts von Name = "frmTextverarbeitung";
Entweder Du setzt das hier manuell, oder du änderst temporär den Namen im Eigenschaftsfenster des Dialogs.

Üblicherweise würde dein Problem aber eher über ein sog. Singleton-Design-Pattern lösen.
Falls Du Dir das mal ansehen möchtest, kannst Du das z.B. hier tun:

www.dofactory.com/net/singleton-design-pattern
Gruß Martin
0 Punkte
von ennok Experte (1.2k Punkte)
Warum so kompliziert?

[code]
private frmTextverarbeitung = null;
private void buttonAnwendungenTextverarbeitung_Click(object
sender, EventArgs e)
{
if ( _frmTextverarbeitung == null ) {
_frmTextverarbeitung = new
frmTextverarbeitung();
}
_frmTextverarbeitung.Show(this);
}
0 Punkte
von
Hallo!
Danke erst einmal für die Vorschläge. Ich werde die in der nächsten Zeit
mal ausprobieren, mal sehn, womit ich besser klar komme.
Trotzdem noch eine Frage am Rande und vor allem ohne Code:
Ich habe eine Form1 in der befindet sich eine CheckBox1. Wenn ich in
die CheckBox1 das Häkchen setze, öffnet sich eine Form2. Das Ganze
funktioniert auch. Jetzt möchte ich folgendes erreichen: wenn ich in
Form2 oben rechts auf das rote X klicke, soll Form2 geschlossen werden
und das Häkchen soll auch wieder verschwinden.
Wie realisiert man sowas auf einfache Art und Weise?
Danke für die Hilfe und Gruß, Uwe.
0 Punkte
von repiv Mitglied (272 Punkte)
Hallo,

wie überall gibt es dafür verschiedene Lösungen. Ich würde es mit einem Event lösen:




private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
Form2 f = new Form2();
f.FormClosed += F_FormClosed;
f.Show();
}
}

private void F_FormClosed(object sender, FormClosedEventArgs e)
{
checkBox1.Checked = false;
}

Deine Antwort

Dein angezeigter Name (optional):
Datenschutz: Deine Email-Adresse benutzen wir ausschließlich, um dir Benachrichtigungen zu schicken. Es gilt unsere Datenschutzerklärung.
Anti-Spam-Captcha:
Bitte logge dich ein oder melde dich neu an, um das Anti-Spam-Captcha zu vermeiden.
...