708 Aufrufe
Gefragt 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
Beantwortet 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
Beantwortet 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
Beantwortet 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
Beantwortet 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;
}
...