Autor Beitrag
blumione
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 25.12.08 03:31 
Hallo zusammen

ich möchte dynamisch eine Form erstellen und dort Buttons mit Aktionen einsetzen.
Der ganzer Code steht in der Form1.

Wenn ich jetzt aber eine neue Methode mit einem Button der auf der neuen Form ausführen möchte. gibt es natürlich einen Fehler, da die Steuerelemente nicht vorher existieren. Wie kann ich dann darauf zugreifen?

Das funktioniert noch:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
            // Form2 
            Form Form2 = new Form();
            Form2.Show();

            // Button 1
            Button mache = new Button();
            mache.Click += new EventHandler(this. mache_click);
            Form2.Controls.Add(mache);



Aber wenn ich in der Form1 noch das schreibe:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        private void mache_click(object sender, EventArgs e)
        {
            //ListBox lbox = new ListBox();
            lbox.Items.Add("test");
            
            
        }


sagt der Kompiler, das die lbox nicht gefunden wurde :(

Freue mich auf eure Antworten.

Schöne Weihnachten!

Lg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 25.12.08 05:39 
Du darfst die Variablen dann nicht in der Methode deklarieren sondern muss das außerhalb in der Klasse tun. Dann sind die nämlich auch für die Handlermethode erreichbar.
PerryRhodan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34


C# (VS 2005 + 2008), .NET 2.0 + 3.5 (inkl. WPF, WCF)
BeitragVerfasst: Do 25.12.08 08:18 
Auf die Schnelle:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
    private void mache_click(object sender, EventArgs e)
    {
      (Form2.Controls["lbox"as ListBox).Items.Add("Test");
      
    }


Theoretisch solltest Du prüfen ob (Controls["lbox"] != null) und ob Type == ListBox ist um auf der sicheren Seite zu sein. Form2 muss dann natürlich noch innerhalb der Grundklasse als Private-Field geführt werden.

_________________
C# im IRC: QuakeNet, Channel: #dotNet.de
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 25.12.08 11:10 
Hallo,

der "Unsterbliche" hat im Prinzip recht. Ich habe aber Zweifel, ob das Vorgehen wirklich so sinnvoll ist. Wenn Du vorher weißt, dass Du ein Formular mit einer ListBox und einem Button-Click haben willst, wobei der Button etwas in der ListBox machen soll, warum programmierst Du das dann nicht schon vorher innerhalb von Form2?

Das neue Formular selbst kann natürlich zur Laufzeit dynamisch erzeugt werden. Es ist auch denkbar, dass seine Bestandteile dynamisch erstellt werden. Aber alles, was zu einer Klasse gehört, sollte auch Teil dieser Klasse sein. Wenn das unbedingt dynamisch sein muss, dann packe es in das FormLoad-Ereignis oder in eine öffentliche Init-Methode; stoße das von Form1 aus an, aber erledige es möglichst vollständig innerhalb des neuen Formulars.

Beispiel: Ein Auto-Transporter (ist also auch eine Ableitung der Klasse "Auto") transportiert mal VW, mal BMW. Soll der Transporter die Ausstattung der transportierten Autos bestimmen? Nein, das ist Sache der Klasse VW bzw. BMW. Der Transporter sagt also lediglich dem Hersteller: "Bereite die Autos zum Transport vor", sonst steuert er nichts.

Gruß und Frohe Weihnachten! Jürgen