Windows Forms C#: Elemente im Code zu Form hinzufügen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Form1 ist eine Klasse, doch Controls ein objektgebundenes Property. Dein erster Versuch ist daher die richtige Lösung.

AOMkayyy 
Fragesteller
 01.03.2021, 02:33

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.

0
regex9  01.03.2021, 02:51
@AOMkayyy

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.

1
AOMkayyy 
Fragesteller
 01.03.2021, 03:01
@regex9
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.

0
regex9  01.03.2021, 05:04
@AOMkayyy

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.

1
AOMkayyy 
Fragesteller
 01.03.2021, 12:15
@regex9

Danke! Jetzt ist etwas mehr Licht im Dunkeln.

0

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.

AOMkayyy 
Fragesteller
 01.03.2021, 02:08

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.

0
AOMkayyy 
Fragesteller
 01.03.2021, 02:12

Obwohl ich schon glaube, dass es mit dem Instanzverweis zutun hat, nur ist mir die Funktion noch nicht wirklich klar.

0
meirumeiru  01.03.2021, 02:23
@AOMkayyy

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

1