Steuerelemente in anderer Form anwenden | C# / Visual Studio

mxy

Neues Mitglied
Hallo zusammen, ich bin ein ziemlicher C#-Anfänger und arbeite momentan an einem Projekt. Allerdings habe ich ein kleines Problem und finde seit mehreren Tagen diesbezüglich keine Lösung. Es bestehht auf zwei verschiedenen forms. Auf form1 sind 6 CheckBoxen vorhaden und ein Button. Der Button öffnet form2 und schließt form1. Anschließend sollen auf form2 die jeweiligen Buttons angezeigt werden, welche zuvor in der form1 per CheckBox ausgewählt wurden (Buttons befinden sich bereits auf form2, sind allerdings auf visible = false gestellt). Bsp.: In form1 wurde CheckBox 2 und 6 betätigt, Button wird geklickt, form2 öffnet sich und es wird Button 2 und 6 angezeigt. Die Steuerelemente habe ich bereits im Designer alle auf public gestellt. Meine Überlegung wäre, mit einer if-Verzweigung zu arbeiten. Allerdings frage ich mich dabei, wie ich in den forms, auf die jeweiligen Steuerelemente zugreifen kann, da diese ja eigentlich zu der anderen form gehöre. Vielen Dank im Voraus!
 
Ich nehme an bei "forms" meinst du Windows Forms?

Ich frage mich vor allem: warum willst du das überhaupt tun? Was ist dein Ziel? selbst wenn es geht klingt das für mich ein klein wenig nach einem X-Y-Problem: https://xyproblem.info/ .

MfG,
Lowl3v3l

P.S. Wenn du gerade neu C# lernst und keinen besonders guten Grund für Windows Forms hast solltest du i.A. nicht mehr Windows Forms, sondern das wesentlich neuere WPF (oder UWP, da ist aber die Nutzung etwas eingeschränkter, da es dich auf Windows festnagelt und bspw. F# nicht unterstützt) lernen, da du ohnehin, wenn du .Net Core 3.1(oder noch besser : .Net 5.0) benutzt darauf Zugriff hast. Ältere Versionen von .Net solltest du ohnehin in keinem Fall mehr benutzen, da sie nicht weiterhin gepflegt werden.
 
Zuletzt bearbeitet:
Genau, ich programmiere eine Windows forms-App.
Um es etwas genauer zu beschreiben programmiere ich ein Windowsprogramm, welches Studenten dabei hilft, Neuigkeiten bezüglich eines bestimmten bzw von bestimmten Semester zu erhalten. Dabei sollen sie zunächst ihr Semester auswählen (in dem Fall die form1 welche ich beschrieben hab). Und anschließend gelangen sie zu einem zweiten Fenster, in dem sie das bestimmte Semester auswählen können und per Button jeweils das Semester switchen können (oben beschriebene form2). Das Programm ist soweit fertig programmiert. Das einzige Problem welches ich habe, ist das oben beschriebene Problem. Das heißt, ich möchte dass die am Anfang ausgewählten Semester (ausgewählt per CheckBox) im ersten Fenster, im zweiten per Button sichtbar gemacht werden (alle 6 Buttons sind also nicht sichtbar, außer die, die per CheckBox ausgewählt wurden). Gedacht habe ich mir, dass ich dies in der form1 mit einer if-Verzweigung bearbeiten kann : z.B.
if (CheckBox1.Checked) { form2.button1.Visible=true; }
allerdings ohne Erfolg.
 
Ich verstehe immer noch nicht, warum du das in zwei Forms machst, und nicht beispielsweise mit Tabs.
Und der rest klingt immer noch... convoluted, at best, also das scheint mir nicht ein angemessener Weg zu sein, to be honest.

Das If ist auch überhaupt nicht das Problem, ich glaube du übernimmst dich da gerade etwas. Da ich deinen Code nicht kenne kann ich einfach mal nur raten, dass bei deinen Forms F1 und F2 F1 zwar auf F2 zugreifen soll, aber nicht der Owner von F2 ist( https://docs.microsoft.com/en-us/do...&view=net-5.0#System_Windows_Forms_Form_Owner), weshalb du die Rechte nicht hast.

Eventuell hilft dir das hier: https://stackoverflow.com/questions/21616808/get-value-of-checkbox-of-form1-from-form2

Ich habe den Verdacht, du klickst das zeug einfach nur irgendwie zusammen im WYSIWYG-Designer... Wenn dem so sein sollte lass das lieber, damit gewinnst du nichts, weil du dann in genau solche Probleme schlitterst, die aus mangelndem Grundlagenverständnis kommen.
 
Ja, ich glaube ich habe den Ansatz verwendet, den du vermutet hast, hier der Quellcode der ersten form1:

public form2 f2 = new form2(); public form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Öffne form2 / Schließe form1 this.Hide(); h.ShowDialog(); this.Close(); if (eins.Checked) { form2.Beins.Enabled = true; } }
Ich denke, dass der von dir vorgeschlagene Ansatz mit den Tabs sinnvoller wäre. Könntest du diesen nochmals etwas genauer erkläutern? Kann nicht so ganz nachvollziehen, was du damit meinst. Danke schoneinmal für deine Bemühungen
 
Bitte benutz Code-Tags! So kann das ja niemand lesen ;)

Tabs haben vor allem den Vorteil, dass sie das subjektive Schönheitskriterium "Jedes Fenster gehört nur sich selbst" umsetzen.

Da ich ewig nicht mehr mit Windows Forms gearbeitet hab hab ich dir mal ein Beispiel gesucht, das für mich nach Überfliegen nicht allzu katastrophal aussieht(der Code ist etwas altbacken, weil Windows Forms nicht das neueste sind) :

 
Das Problem, das bei dir das ganze nicht Funktioniert liegt an h.ShowDialog();.

ShowDialog zeigt das Formular als modales Dialogfeld an; dh. die weitere Codeausfüurung in der Funktion wird blockiert bis das Fenster geschlossen wurde.

Wenn du deine Zuweisungen vorher Tätigst wird es funktionieren.
Btw. kannst du auch die Enabled Zuweisung ohne If Anweisung durchführen.:
form2.Beins.Enabled = eins.Checked;

Ansonsten kannst du auch den Ratschlägen von Lowl3v3l folgen.
 
Hallo, danke für deine Antwort. Ich habe es mit deinem Lösungsvorschlag mit
form2.Beins.Enabled = eins.Checked endlich hinbekommen, danke dafür!
Das h.ShowDialog() habe ich nun durch ein h.Show() ersetzt. Allerdings habe ich das this.Hide();, sowie auch das darauf folgende this.Close(); gelöscht, da sich das Programm nach dem Betätigen des Buttons sofort geschlossen hat. Nun bleibt das Fenster der form1 (Auswahl der Semester) nun im Hintergrund offen, nachdem ich den Button betätigt habe. Hättet Ihr dafür noch einen Ratschlag, wie ich dieses Problem umgehen kann?
 
Wenn du in deine Program.cs gehst solltest du die folgende Zeile finden:
C#:
Application.Run(new Form1());
Der Parameter der an Run übergeben wird sagt der Applikation Instanz, dass dies das Hauptfenster (Form1) ist und wenn dieses geschlossen wird auch die weitere ausführng der Applikation beendet werden soll.

Wenn du also ein zweites Fenster öffnen möchtest musst du diesen Parameter weglassen (== null oder einfach leer lassen), dann musst du dich auch um die Beendigung der Applikation selber kümmern.

Sagen wir, dass du möchtest dass die Applikation beendet werden soll, wenn alle Fenster geschlossen sind, dann kannst du den Programmstart wie folgt modifizieren:
C#:
static void Main() {
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);

  var form1 = new Form1();
  form1.Show();

  Application.Idle += (_1, _2) = > {
    if (Application.OpenForms.Count == 0)
      Application.Exit();
  };

  Application.Run();
}

In Zeile 5 und 6 wird dein Fenster erstellt und als sichtbar markiert.
In Zeile 13 wird die Applikation ohne ein Hauptfenster gestartet.

Damit nun die Applikation sich beendet wenn keine Fenster vorhanden sind wird in Zeile 8 eine benutzerdefinierte Funktion (hier eine inline Lambda Funktion) auf dass Event Idle registriert. Diese wird immer dann Aufgerufen wenn die Anwendung keine Events mehr verarbeiten muss; dies ist (normalerweise) der Fall wenn all Fenster geschlossen sind.

Da uns die Parameter der Idle Funktion nicht interessieren discarden (verwerfen) wir diese mit _1 und _2. In Zeile 9 und 10 wird nun einfach geprüft ob alle Fenster tatsächlich geschlossen sind und wenn ja wird die Applikation beendet.

Damit kannst du nun mit Show und Close wie von dir vorher angesetzt arbeiten. Solange ein Fenster Sichtbar ist bleibt die Anwendung am leben. Beachte dass du auch mehrere Forms der selben Klasse anzeigen kannst, wenn diese nicht geschlossen werden.

Edit: Zeilen angepasst.
 
Zuletzt bearbeitet:
Zurück
Oben Unten