Entwickler-Ecke

WinForms - Instanz soll sich selbst einfügen


Suras78 - Fr 27.05.11 11:00
Titel: Instanz soll sich selbst einfügen
Hallo,

ich habe eine eigene Button Klasse, die sich selbst positionieren kann. Jetzt soll sie sich, sobald sie erstellt wird, auch selbst einfügen, im Konstruktor steht also:

C#-Quelltext
1:
WindowsFormsApplication2.Form1.panel2.Controls.Add(this);                    

Panel 2 steht auf public. Leider kriege ich trotzdem nur die Meldung "Für das nicht statische Feld, die Methode oder die Eigenschaft "WindowsFormsApplication2.Form1.panel2" ist ein Objektverweis erforderlich."

Was mache ich falsch?


jaenicke - Fr 27.05.11 11:12

Hallo und :welcome:

Form1 ist der Name deiner Klasse, keine Instanz der Klasse, also kein existierendes Objekt.
Du benötigst für den Zugriff aber ein konkret existierendes Objekt.

Davon abgesehen ist es aber ohnehin äußerst schlechter objektorientierter Stil aus einer Klasse heraus direkt zu versuchen auf das Formular zuzugreifen.

Beim Erstellen deiner Klasse musst du also übergeben wohin diese hinzugefügt werden soll.


Suras78 - Fr 27.05.11 11:16

Ok, danke, dann werde ich das lassen ;) Aber eine Rückfrage hätte ich noch:
Wieso funktioniert

C#-Quelltext
1:
2:
this.Location = new Point(WindowsFormsApplication2.Form1.currentButtonLoc, 10);
WindowsFormsApplication2.Form1.currentButtonLoc += this.Size.Width + 20;

dann? (befindet sich in der gleichen Klasse)


jaenicke - Fr 27.05.11 11:29

Vielleicht ist currentButtonLoc als static deklariert? ;-)


Suras78 - Fr 27.05.11 11:30

Ist es :x Naja danke =)
Edit:
Habe noch eine Frage: Gibt es eine Möglichkeit, das onClick des Buttons etwas tun zu lassen, ohne dafür eine extra methode zu schreiben? Die neue MEthode würde nämlich dann das in der vorherigen erzeugte Label nicht mehr kennen und ich bin zu doof, das dem new Eventhandler zu übergeben :x . Also so sieht es jetzt aus:

C#-Quelltext
1:
2:
3:
4:
            MyLabel label = new MyLabel();
            this.panel1.Controls.Add(label);
            label.BringToFront();
            MyButton LB1 = new MyButton("Farbe ändern");

und dazukommen soll jetzt sowas:

C#-Quelltext
1:
LB1.Click += label.changeColor();                    


jaenicke - Fr 27.05.11 11:46

Ich glaube du suchst anonyme Methoden: ;-)
http://msdn.microsoft.com/de-de/library/0yw3tz5k.aspx


Suras78 - Fr 27.05.11 11:57

Vielen dank =)