Laden...

Form-Kommunikation, Eingabe in Form2 an Hauptform übergeben

Erstellt von ngedigk vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.242 Views
N
ngedigk Themenstarter:in
4 Beiträge seit 2015
vor 9 Jahren
Form-Kommunikation, Eingabe in Form2 an Hauptform übergeben

Hallo zusammen,

ich bin neu in diesem Forum und ganz neu in C# nachdem ich vor Ewigkeiten mal mit Borland Pascal, VBA, CMD und JavaScript gecodet habe.

Ich bin mir bewusst, dass dieser Artikel extra für Fragen, wie die meine eingerichtet wurde.

Soweit komme ich mit der Kommunikation zwischen den Forms auch schon zurecht, in der Regel, wenn Form2 Daten aus Variablen aus Form1 übernehmen will.

Wenn ich das andersherum versuche bekomme ich folgende Fehlermeldung:> Fehlermeldung:

'xxx.Form1' enthält keinen Konstruktor, der 0-Argumente akzeptiert. (Datei: Program.cs, Z:19, S:29)

Sonst habe ich das – hoffentlich richtig – gelöst, indem ich dem leer stehenden Konstruktor mit einen Verweis in der Click Funktion wie folgt gefüllt habe:

Form2 f2 = new Form2(this)

Die Anwendung soll später bestehen aus einem Hauptfenster mit einer tabControl, der durch Benutzereingabe in einer 2. Form neue tabPages hinzugefügt oder entfernt werden.

Folgenden Code hab ich bisher geschrieben:
Form1.cs:

namespace BCMF_Training_01
{
    public partial class form_Hauptfenster : Form
    {        
        form_NeueLinie f2;
        public form_Hauptfenster(form_NeueLinie f2)
        {
            InitializeComponent();
            this.f2 = f2; 
        }

        private void btn_LinieHinzufuegen_Click(object sender, EventArgs e)
        {
            form_NeueLinie f2 = new form_NeueLinie();
            f2.ShowDialog();
        }

        private void form_Hauptfenster_Load(object sender, EventArgs e)
        {
            MessageBox.Show(f2.txt_nameLinie.Text);
        }
    }
}

Form2.cs:

namespace BCMF_Training_01
{
    public partial class form_NeueLinie : Form
    {
        public form_NeueLinie()
        {
            InitializeComponent();
        }

        private void btn_Hinzufuegen_Click(object sender, EventArgs e)
        {
            if (txt_nameLinie.Text == "")
            {
                MessageBox.Show("Bitte einen Namen eingeben!");
                return;
            }

            string neueLinie = txt_nameLinie.Text;
            this.Close();
            //MessageBox.Show(neueLinie);
        }
    }
}

Der Fehler taucht hier auf, sobald ich oben genannten Weg Versuche:
Program.cs:

namespace BCMF_Training_01
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new form_Hauptfenster( ... <HIER> ... ));
        }
    }
}

Ich wäre für euren Hinweis sehr dankbar.
Ich habe die Anleitungen gewälzt und mache doch irgendwas falsch!

L
95 Beiträge seit 2009
vor 9 Jahren

Warum solltest du deinem Hauptfenster eine Referenz auf das form_neueLinie geben.
Da ist diese Fehlermeldung nicht verwunderlich.

Vorallem habe ich das Gefühl du hast den Artikel nicht so richtig verstanden. Bzw. was dein Code macht. Anstatt dem Konstruktor das Form mitzugeben:


public form_Hauptfenster(form_NeueLinie f2)

Wäre die Gleiche Funktionalität erreicht wenn du.


public form_Hauptfenster()
        {
            InitializeComponent();
            this.f2 =  new from_NeueLinie();
        }

Das war jetzt nur. Wie bekomme ich den Code mit der gleichen Funktionalität wie der gepostete zum Laufen.

Zum Thema: Wie bekomme ich von der Child Form wieder Variablen zurück, liest du noch mal den Artikel und schaust dir an den Teil zu Events an.

Die Grundidee dabei ist: Erzeug in deiner Hauptform deine Childform. Dieser Form gibts du Methoden mit um Variablen zu setzen. (Nicht die Hauptform im Konstruktor übergeben, oder umgekehrt).
Wenn sich in der Childform was geändert hat benachrichtigt diese die Hauptform über ein Event.

N
ngedigk Themenstarter:in
4 Beiträge seit 2015
vor 9 Jahren

Hallo Lenny,

deine Antwort hat mich schon etwas weitergebracht, wobei ich gestehen muss, dass ich wirklich noch ein wenig rumstocher, ohne das vollständig Verstanden zu haben.

Vor allem schwirrt mir noch etwas der Kopf von den vielen verschiedenen neuen Begriffen:
Mit Konstruktor, Verweis und Referenz und dem was sie sind bzw. im Einzelnen wirklich bedeuten/bewirken kann ich noch nicht so viel anfangen.

Der Rest (Klassen, instanzieren, Methoden, Variablen, etc.) ist mir natürlich nicht neu.

Ich werde den von dir empfohlenen Artikel nochmal versuchen zu lesen.

Eine Rückfrage habe ich auf deine Frage, denn vielleicht mangelt es gerade hier an meinem Verständis:

Warum solltest du deinem Hauptfenster eine Referenz auf das form_neueLinie geben.

Warum sollte ich der Form2 eine Referenz auf Form1 geben, so dass es umgekehrt funktioniert?

J
251 Beiträge seit 2012
vor 9 Jahren

Fehlermeldung:
Fehlermeldung:
'xxx.Form1' enthält keinen Konstruktor, der 0-Argumente akzeptiert. (Datei: Program.cs, Z:19, S:29)

Verwenden von Konstruktoren (C#-Programmierhandbuch)
Instanzkonstruktoren (C#-Programmierhandbuch)

Könnte man noch anmerken zu den genannten Fehler.

L
95 Beiträge seit 2009
vor 9 Jahren

Hey,

  1. Referenzen, Werte
    Am schönsten finde ich wird das bei C++ klar
    https://de.wikibooks.org/wiki/C++-Programmierung/_Weitere_Grundelemente/_Prozeduren_und_Funktionen#call-by-reference

Für C# gibt es das aber auch schön in der MSDN erklärt:
https://msdn.microsoft.com/de-de/library/4d43ts61%28v=vs.90%29.aspx

  1. Zum Thema übergeben.
    Genau das wird doch in dem Artikel zu Kommunikation zwischen 2 Forms erklärt.
    Es ist nicht sinnvoll im Child Form das Hauptform zu kennen (Aus mehreren Gründen die man auch im Internet findet)
    Wenn du vom Hauptform auf das Childform zugreifen willst, definier dort eine Methode die du von der Hauptform aus aufrufst.
    Wenn du im Hauptform Daten aus der Childform brauchst, definiert im Childform ein Event, das du in der Hauptform abonnierst.
4.931 Beiträge seit 2008
vor 9 Jahren

Hallo ngedigk,

du kannst dir auch mal meinen Artikel Kommunikation von 2 Forms durchlesen (ganz unten gibt es auch ein Beispielprojekt dazu).

Dir muß bewußt werden, daß du bei


form_NeueLinie f2 = new form_NeueLinie();

ein neues Form-Objekt erzeugst (auch wenn du denselben Variablennamen 'f2' wie für die Membervariable benutzt hast).

PS: Außerdem ist der direkte Zugriff auf Formelemente von außerhalb der Form-Klasse ein 'No-Go' der Programmierung - verwende eine eigene Eigenschaft dafür (wird auch im obigen Artikel gezeigt).

N
ngedigk Themenstarter:in
4 Beiträge seit 2015
vor 9 Jahren

Hey @all,
ich muss schon sagen, der Ton in diesem Forum gefällt mir,

Vielen Dank für eure Hilfe/Hinweise und angenehmen Antworten.
Ich werde mich durch die Lektüre arbeiten.

Ich melde mich sobald ich hierzu weitere Fragen habe.

N
ngedigk Themenstarter:in
4 Beiträge seit 2015
vor 9 Jahren

du kannst dir auch mal meinen Artikel
>
durchlesen (ganz unten gibt es auch ein Beispielprojekt dazu).

Danke dafür! Das ließt sich schonmal eingängig ...