Windows Forms C#: Elemente im Code zu Form hinzufügen?
Guten Tag,
ich wollte fragen wie ich innerhalb des Codes ein Element zu einer Form hinzufügen kann. Beispielsweise habe ich einen Button und wenn ich diesen drücken, dann soll ein neuer Button erzeugt werden.
Ich bekomme das sogar hin, nur weiß ich nicht so ganz wieso. Wenn ich in der Klasse Form1 bin (wo auch die ganzen EventHandler sitzen), dann kann ich mittels this.Controls.Add(new Button()); einen neuen Button erzeugen, aber mittels Form1.Controls.Add(...) ist das nicht möglich. Kann mir jemand erklären was ich falsch mache? Stehe gerade etwas auf dem Schlauch.
Ich freue mich über Antworten!
2 Antworten
Form1 ist eine Klasse, doch Controls ein objektgebundenes Property. Dein erster Versuch ist daher die richtige Lösung.
Eventuell fehlen dir noch OOP-Grundlagen.
Das Schlüsselwort this bezieht sich immer auf das aktuelle Objekt. In deinem Fall also auf die von der Anwendung erstellte Form1-Instanz. Jedes Objekt, dessen Typ / Klasse ein Subtyp / eine Subklasse von Control ist (das wären Buttons, Labels, u.a. typische Windows Forms-Komponenten), verfügt über das Controls-Property. All diesen Objekten können also weitere Komponenten zugefügt werden.
Eventuell fehlen dir noch OOP-Grundlagen.
Ziemlich sicher sogar :')
Die Bedeutung von this war mir jedoch eigentlich bewusst (zumindest meinte ich das und habe es auch schon mehrmals eingesetzt), nur bin ich jetzt etwas verwirrt. Wäre Form1 eine Instanz von Form oder eine statische Klasse die von Form erbt, dann wäre es klar, aber mir ist nicht klar, warum von dem konkreten 'Objekt' Form1 (was in Code ja kein Objekt ist), eine Klasse erstellt wird und es von dieser widerum Instanzen gibt. Dazu kommt, dass ich nicht verstehe wo die Instanz von Form1 erzeugt wird.
Ich hoffe das ist irgendwie verständlich was ich sagen/fragen möchte.
Ich gehe davon aus, dass du einfach nur ein neues Windows Forms-Projekt erstellt hast. In diesem wird initial eine Form namens Form1 angelegt. Du hast dazu also eine Designer-Datei, eine Ressourcendatei (resx), eine Klasse Form1 (die von Form erbt):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
und in der Program.cs wird in der Main-Methode eine Instanz von Form1 angelegt:
Application.Run(new Form1());
Daher wird bei einem Klick auf Run/Start auch gleich diese Form erstellt und geöffnet.
Du musst das auf's passende Objekt aufrufen. Auf die korrekte Instanz der Form. Und zudem muss es aus dem UI Thread heraus aufgerufen werden...
Was ich hier sage kommt aus der Win32-Programmierung. Mit C# kenne ich mich nicht wirklich aus. Aber... es müsste auch für die C# Programme gelten... vielleicht hilft's ja. Weil, Window Forms müsste einfach ein Wrapper für Win32 sein, soweit ich weiss.
Obwohl ich schon glaube, dass es mit dem Instanzverweis zutun hat, nur ist mir die Funktion noch nicht wirklich klar.
tja... ich finde diese komischen Frameworks immer mühsam... weil, eigentlich ist es logisch was man tun muss, nur kriegt man nicht raus, wie man die Frameworks bedienen muss, damit sie die korrekten Windows-Befehle senden...
UI Thread... also, das ist so... in Windows müssen die Fenster alle im selben Thread erzeugt werden (CreateWindow) ... (gut, das was ich jetzt sage ist nicht ganz richtig... aber, vereinfacht gesagt ist es so... alles andere wäre wie Jonglieren mit laufenden Kettensägen... obwohl, möglich wär's schon).
Prüf doch mal im Debugger, ob Form1 und this das gleiche ist... irgendwie leuchtet mir auch nicht ein, wieso es mehrere Formen geben soll...
Erstmal vielen Dank für die Antwort!
Ich programmiere noch nicht lange und ich sitze erst seit 1 Stunde vor Windows Forms, weshalb es sein kann, dass ich hier Schwachsinn schreibe, aber ich glaube es gibt da gar keine konkrete Instanz von Form1. Die Klasse Form1 wird sozusagen als Instanz von Form genutzt, nur dass es keine Instanz ist, sondern eine eigene Klasse welche von Form erbt.
Bzgl. des UI Threads bin ich mir nicht sicher was du meinst, aber die Stelle an der ich den Befehl aufrufe scheint richtig zu sein, denn mit dem Schlüsselwort 'this' klappt es wunderbar.
Danke! Ja, das es die Lösung ist habe ich ebenfalls rausgefunden, nur noch nicht verstanden warum^^
Zwar ist mir auch klar, dass ein Objektverweis benötigt ist, aber welche Instanz ist wird gebraucht? Wenn ich über 'this' hover, dann kommt auch nur Turing-Maschine.Form1 und mir wird nirgends gesagt wie ich die Instanz korrekt anspreche (abgesehen von this).
P.S.: Kann natürlich auch sein, dass ich eine komplett falsche Vorstellung habe.