Laden...

Steuererlemente in mehreren Formularen mit Container

Erstellt von JaquesLudwig vor einem Jahr Letzter Beitrag vor einem Jahr 566 Views
J
JaquesLudwig Themenstarter:in
9 Beiträge seit 2022
vor einem Jahr
Steuererlemente in mehreren Formularen mit Container

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

4.939 Beiträge seit 2008
vor einem Jahr

Hallo,

s. SplitContainer.Controls:

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).

16.835 Beiträge seit 2008
vor einem Jahr

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

J
JaquesLudwig Themenstarter:in
9 Beiträge seit 2022
vor einem Jahr

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

J
JaquesLudwig Themenstarter:in
9 Beiträge seit 2022
vor einem Jahr

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

16.835 Beiträge seit 2008
vor einem Jahr

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.

J
JaquesLudwig Themenstarter:in
9 Beiträge seit 2022
vor einem Jahr

Gibt's für Messaging Pattern auch eine für Anfänger verständliche Beschreibung?

Stephan