Hallo,
ich versuche gerade, verschiedene Steuerelemente in verschiedenen Formularen zu verwenden. Es soll dann so sein, wenn im einen Formular an einem Steuerelement eine Änderung durchgeführt wird, soll diese im anderen Formular übernommen werden. Wenn ich das ganze ohne z.B. Splitcontainer verwende, funktioniert das alles wunderbar. Lege ich die Steuerelemente vom Hauptformular allerdings in einen Splitcontainer (splitContainerHaupt), in dessen Panel1, kann ich im Unterformular nicht darauf zugreifen und ich komm einfach nicht drauf, wie ich darauf zugreifen könnte.
Hier der Code. Im Form2.cs in der TextBox tb, habe ich schon mal was probiert, aber das funktioniert so nicht. Kann mir da jemand helfen?
Form1.cs
namespace Formulare_Uebergabe
{
public partial class Form1 : Form
{
public string eigenschaftHaupt;
public Form1()
{
InitializeComponent();
eigenschaftHaupt = "Hallo";
}
private void Form1_Load(object sender, EventArgs e)
{
LblHaupt.Text = eigenschaftHaupt;
}
private void CmdStartUnter_Click(object sender, EventArgs e)
{
Form2 formUnter = new(this);
formUnter.ShowDialog();
}
private void CmdEndeUnter_Click(object sender, EventArgs e)
{
Close();
}
}
}
Form2.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Formulare_Uebergabe
{
public partial class Form2 : Form
{
private readonly Form1? formHaupt;
public Form2(Form1? aufrufer)
{
formHaupt = aufrufer;
formHaupt?.Hide();
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
if (formHaupt is not null)
{
LblUnter.Text = formHaupt.eigenschaftHaupt;
TextBox tx = (TextBox)formHaupt.Controls["splitContainerHaupt"].Controls["Panel1"].Controls["TxtHaupt"];
TxtUnter.Text = tx.Text;
CheckBox cb = (CheckBox)formHaupt.Controls["ChkHaupt"];
ChkUnter.Checked = cb.Checked;
CheckedListBox clb = (CheckedListBox)formHaupt.Controls["checkedListBox1"];
checkedListBoxUnter.Items.AddRange(clb.Items);
}
}
private void CmdEndeUnter_Click(object sender, EventArgs e)
{
if (formHaupt is not null)
{
TextBox tx = (TextBox)formHaupt.Controls["TxtHaupt"];
tx.Text = TxtUnter.Text;
CheckBox cb = (CheckBox)formHaupt.Controls["ChkHaupt"];
cb.Checked = ChkUnter.Checked;
formHaupt.Show();
}
Close();
}
}
}
Vielen Dank,
Stephan
Hallo,
Diese Eigenschaft ist für diese Klasse nicht relevant.
Der SplitContainer
verfügt stattdessen über die beiden Eigenschaften Panel1
und Panel2
.
Dein Code verletzt aber grundlegende Prinzipien der OOP, nämlich von einer Klasse (Form) auf die Interna einer anderen Klasse (Form) zuzugreifen, s.a. [FAQ] Kommunikation von 2 Forms (bzw. mein eigener Artikel zum Thema: Kommunikation von 2 Forms).
Control-Elemente Schubsen ist nicht so nen dolles Ding 🙂
Sowas löst man eigentlich über Datenbindungen bzw. mit Hilfe von State Handling / Messaging Pattern.
In .NET kann dazu einfach Rx.NET oder ReactiveUI verwenden.
GitHub - dotnet/reactive: The Reactive Extensions for .NET
https://www.reactiveui.net/docs/guidelines/platform/windows-forms
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke für die Erklärungen und Hinweise.
Hatte mir extra ein Buch gekauft in dem meine Vorgehensweise so beschrieben wurde. Ich werde mich mal mit euren Links beschäftigen und mich durchkämpfen. Danke!
Stephan
Welches Buch?
Ich hab mittlerweile noch eine ganz verständliche Beschreibung gefunden. Vielleicht hilft s dem ein oder anderen:
Windows Forms: Kommunikation zwischen Formularen - C# lernen - Das große Computer ABC
Gruß,
Stephan
Das im gezeigten Link ist eine sehr sehr vereinfachte Kommunikation von 2 Forms.
Gerade wenn man aber Objekte hat, die man über mehrere Forms bekannt machen will (zB durch Auswahlen), ist ein Messaging Pattern der bessere Weg.
Und in welchem Buch steht, dass Controls schubsen ne gute Idee ist? 🙂
Die Frage wäre noch offen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Gibt's für Messaging Pattern auch eine für Anfänger verständliche Beschreibung?
Stephan