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!
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.
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?
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.
Hey,
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
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).
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.