740 Aufrufe
Gefragt in Anwendungen(Java,C++...) von
Hallo Zusammen!Mag eine vielleicht etwas blöde Frage sein, aber
ich komme mit dem Problem einfach nicht klar.
Ich lasse zur Laufzeit durch Klick auf einen Button eine Groupbox mit
enthaltenem Panel anzeigen -- funktioniert auch soweit. Wie kann
ich beides nun wieder verschwinden lassen, wenn ich auf denselben
Button klicke ( es ändert sich der Text des Buttons von Grafik + auf
Grafik -)
Viel leicht noch ein kurzer Auszug aus den Quellcode:
private void buttonGrafikEinblenden_Click(object sender, EventArgs
e)
{
if (buttonGrafikEinblenden.Text == "Grafik +")
{
GroupBox groupBoxGrafik = new GroupBox();
groupBoxGrafik.Text = "Grafische Darstellung...";
groupBoxGrafik.Location = new
Point(groupBoxKoordinaten.Right + 6, groupBoxKoordinaten.Top);
groupBoxGrafik.Height = groupBoxKoordinaten.Height * 3 /
2;
groupBoxGrafik.Width = groupBoxKoordinaten.Width * 3 / 2;
this.tabPage1.Controls.Add(groupBoxGrafik);
Panel panelGrafik = new Panel();
panelGrafik.BackColor = Color.Black;
panelGrafik.Location = new Point(groupBoxGrafik.Left + 10,
groupBoxGrafik.Top + 20);
panelGrafik.Height = groupBoxGrafik.Height - 30;
panelGrafik.Width = groupBoxGrafik.Width - 20;
this.tabPage1.Controls.Add(panelGrafik);
panelGrafik.BringToFront();
buttonGrafikEinblenden.Text = "Grafik -";
}
else
{
buttonGrafikEinblenden.Text = "Grafik +";
GroupBox groupBoxGrafik = new GroupBox();
this.tabPage1.Controls.Remove(groupBoxGrafik);
// so funktioniert es leider nicht!!
}
}
Wenn jemand neine brauchbare Idee hat, Danke!

7 Antworten

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Halo uwe96,

wenn du die Eigenschaft visible der Elemente auf false setzt, verschwinden sie, bleiben aber existent, du kannst sie also bei Bedarf wieder sichtbar schalten, ohne sie neu erzeugen zu müssen.

Also erzeuge die Elemente bei der Initialisierung und schalte dann nur noch die Eigenschaft visible von true auf false und umgekehrt.

Gruß
computerschrat
0 Punkte
Beantwortet von
Hallo computerschrat,
besten Dank für den Vorschlag. Wenn ich Dich richtig verstanden
habe, dann sollte der else-Zweig also so aussehen:

if
{
...... siehe oben
}
else
{
buttonGrafikEinblenden.Text = "Grafik +";
GroupBox groupBoxGrafik = new GroupBox();
Panel panelGrafik = new Panel();
groupBoxGrafik.Visible = false;
panelGrafik.Visible = false;

// das funktioniert leider auch nicht, denn das Panel und die
GroupBox bleiben sichtbar, es ändert sich lediglich der Text des
Buttons, was auch so sein soll!!!

}

Falls Du weitere Vorschläge hast, ich bin für alles offen und dankbar.
Gruß, uwe96
0 Punkte
Beantwortet von
Hallo,

Warum erzeugst du ein neues Panel und eine neue Groupbox im Else Zweig.
Bei dem Button verwendest du ja auch den vorherigen.
Du musst die original goupbox auf visible =False setzen.

Gruß Martin
0 Punkte
Beantwortet von
Hallo Martin!
Besten Dank für die Anregung. So hatte ich es mir eigentlich vorgestellt,
aber ich muß beide Controls im else-Zweig neu erzeugen, da ich sonst
keinen Zugriff auf diese Elemente habe. Auf den Button habe ich Zugriff,
da dieser auch nicht zur Laufzeit erzeugt wird.
Ich tüfftel mal weiter - bin aber für weitere Anregungen und
Lösungsvorschläge immer offen und dankbar.
Gruß Uwe
0 Punkte
Beantwortet von
Hallo uwe96,
ich mach Dir mal folgenden Vorschlag:

Die Routine zum Laden der GroupBox bzw. des Panels jeweils in
eine eigene Methode packen. Dazu müsstest Du allerdings beide
gleich nach dem Eintrag

public partial class ......

als public deklarieren. Sollte kein Problem sein.

Beide Methoden setzt Du dann in den if-Zweig von

private void buttonGrafikEinblenden_Click....

ebenfalls auch den Code für die Umbenennung Deines Buttons.

Im else-Zweig würde ich dann, neben dem Code für den Button, eine
weitere Methode einfügen, die so aussehen könnte:

private void GrafikAusblenden(object sender, EventArgs e)
{
if (this.tabPage1.Controls.Contains(groupBoxGrafik))
{
this.tabPage1.Controls.Remove(groupBoxGrafik);
groupBoxGrafik.Dispose();
}
if (this.tabPage1.Controls.Contains(panelGrafik))
{
this.tabPage1.Controls.Remove(panelGrafik);
panelGrafik.Dispose();
}
}

Unter Umständen, je nach C#-Version, welche Du verwendest,
könntest Du dieses this auch noch weglassen - wäre dann etwas
weniger Quellcode. Die einzelnen Methoden machen das Ganze,
meiner Meinung nach etwas übersichtlicher und erleichtern später
eventuell mal die Fehlersuche ;-)

Ich denke, damit sollte Dein Problem erst einmal gelöst sein und
diese Lösung wäre auch eine saubere runde Sache.

Weiterhin viel Spaß und frohes Schaffen,

liebe Grüße
Dani
0 Punkte
Beantwortet von
Hallo,

eigentlich hast du es schon fast. Du musst nur ganz wenig anpassen:
ob das Control zur Laufzeit erzeugt wird oder nicht spielt keine Rolle.

man kann eine Groupbox so erzeugen wie du:
GroupBox groupBoxGrafik = new GroupBox();

oder so:

GroupBox groupBoxGrafik = null;

private void button1_Click(object sender, EventArgs e)
{
if (groupBoxGrafik == null)
{
groupBoxGrafik = new GroupBox();

}
}

wenn du den 2. Weg gehst, kommst du innerhalb der Klasse auch an die ursprüngliche Groupbox und kann sie ausblenden. Vorher dem Zugriff aber immer auf NULL prüfen.

Gruß
Martin
0 Punkte
Beantwortet von
Hallo Dani, Hallo Martin!
Besten Dank für die recht ausführlichen Anregungen. Ich hab das
Prinzip von Dani einfach mal übernommen und kann nur sagen, es
klappt wunderbar, so wie ich es haben wollte - echt Klasse.
Das mit auf Null setzen, von Dir Martin, werde ich sicherlich auch noch
im Verlaufe meiner "Bastelei" ausprobieren, denn ich habe noch mehr,
was erst zur Laufzeit erzeugt werden muß.
Also, danke für die kompetente HIlfe an Euch beide und vielleicht oder
sicherlich bis zum nächsten Mal.
Viele Grüße, Uwe.
...