Entwickler-Ecke

WinForms - Einfache GUI - Auslesen von TextBox bei Klick auf Button


rap123 - Di 27.08.13 16:17
Titel: Einfache GUI - Auslesen von TextBox bei Klick auf Button
Hallo,

ich bin absoluter C# Neuling und habe GUI's bisher nur mit Java erstellt (und auch das ist schon Jahre her).
Zum Einstieg möchte ich das Beispiel von folgendem Video http://www.youtube.com/watch?v=trkXsXIh0xo nachprogrammieren.

Da mir zum Entwickeln kein GUI-Builder zur Verfügung steht, (ich entwickle nicht mit Microsoft Visual Studio) habe ich mir ein Beispiel für Windows Forms gesucht.

Das u. S. Beispiel war das einzige, dass (vor meiner Anpassung) funktioniert hat und welches ich auch nachvollziehen konnte.

Das Problem ist, dass die TextBox und das Label nicht im Event Handler (Button_Click) erkannt werden.

Wie kann ich dem Event Handler die Form-Elemente bekanntmachen bzw. was muss ich ändern um das Programm lauffähig zu bekommen?

Vielen Dank für Eure Hilfe
Gruß
Raphael



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
using System;
using System.Drawing;
using System.Windows.Forms;

public partial class HelloWorld : Form
{
    static public void Main ()
    {
        Application.Run (new HelloWorld ());
    }

    public HelloWorld ()
    {
        TextBox t1 = new TextBox();
        t1.Left = 10;
        t1.Top = 10;
        Controls.Add (t1);
        
        Button b1 = new Button ();
        b1.Text = "Click Me!";
        b1.Left=10;
        b1.Top=30;
        b1.Click += new EventHandler (Button_Click);
        Controls.Add (b1);
        
        Label l1 = new Label();
        l1.Left = 10;
        l1.Top = 60;
        l1.Text="HELLO";
        Controls.Add (l1);
    }
    

    private void Button_Click (object sender, EventArgs e)
    {
        l1.Text = t1.Text;
    }
}


Christian S. - Di 27.08.13 16:26

Hallo und :welcome:!

Du hast die Komponenten ja als lokale Variablen im Konstruktor deklariert, deswegen sind die auch nur darin gültig. Du musst sie als Felder der Klasse deklarieren, damit das klappt.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
        TextBox t1;
        Button b1;
        Label l1;

        static public void Main()
        {
            Application.Run(new HelloWorld());
        }

        public HelloWorld()
        {
            t1 = new TextBox();
            t1.Left = 10;
            t1.Top = 10;
            Controls.Add(t1);

            b1 = new Button();
            b1.Text = "Click Me!";
            b1.Left = 10;
            b1.Top = 30;
            b1.Click += new EventHandler(Button_Click);
            Controls.Add(b1);

            l1 = new Label();
            l1.Left = 10;
            l1.Top = 60;
            l1.Text = "HELLO";
            Controls.Add(l1);
        }


        private void Button_Click(object sender, EventArgs e)
        {
            l1.Text = t1.Text;
        }


Aber warum benutzt Du kein Visual Studio? Mach Dir doch nicht mehr Arbeit als notwendig :-)

Grüße
Christian


rap123 - Di 27.08.13 22:34

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:


Du hast die Komponenten ja als lokale Variablen im Konstruktor deklariert, deswegen sind die auch nur darin gültig. Du musst sie als Felder der Klasse deklarieren, damit das klappt.

Ah danke, genau das hatte ich gesucht! Mir war nur nicht klar, wie und wo ich die Variablen global deklariere.

Vielen Dank für Deine Hilfe, wobei das für dich wahrscheinlich nicht schwer zu lösen war :wink:

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:

Aber warum benutzt Du kein Visual Studio? Mach Dir doch nicht mehr Arbeit als notwendig :-)


Das hat zwei Gründe:
Zum einen sieht es für mich so aus, als ob es für WindowsXP keine kostenlose Visual-Studio-Version gibt, mit der man in C# entwickeln kann (Ich lasse mich sehr gerne eines besseren belehren, jedoch habe ich keinen Download dafür gefunden und keine Ahnung von VisualStudio, sodass es für mich einfacher war, MonoDevelop zu installieren)

Zum Anderen wollte ich unter Linux entwickeln, da es das Betriebssystem ist, welches ich privat hauptsächlich nutze. (Und unter Linux gibt es natürlich kein Visual Studio, sondern eben dieses oben erwähnte MonoDevelop).

Man könnte sich jetzt auch fragen, warum ich dann nicht gleich bei Java bleibe, aber zum einen erscheint mir die Entwicklung mit C# einfacher und zum anderen soll mein Programm später auch im Geschäft laufen ohne dass ich darauf angewiesen bin ob Java installiert ist oder nicht (Das .NET-Framework ist auf unseren Windows-Clients standardmäßig installiert).


Palladin007 - Di 27.08.13 23:33

Ich denke schon, dass eine Visual Studio 2008/2010/2012 Express Version auf XP laufen könnte, zumindest fällt mir kein Grund ein, warum nicht.

Probier es doch einfach aus, Visual Studio ist eine ziemliche Erleichterung, weil es in fast allen Bereichen viel vereinfacht und Arbeit abnimmt.
Wenn du sagst, du willst kein Visual Studio, dann kann ich noch SharpDevelop empfehlen. Das kommt meiner Meinung nach am weitesten in die Nähe von Visual Studio.


Eine solche Entwicklungsoberfläche ist gerade bei Windows Forms sehr praktisch, weil das doch recht umständlich zu schreiben ist und so ein Designer den größten Teil der Schreibarbeit abnimmt.




Was den Code angeht, so würde ich alles, was du im Moment im Konstruktor hast, in eine extra Methode auslagern und die privaten Variablen auch. So macht das auch der Designer von VS, der lagert diese Dinge in eine partielle Klasse (Deine aktuelle Klasse ist sowieso schon partiell) aus, damit diese ewig Langen Zeilen unübersichtlichen Codes nicht neben der Logik stören.


Partielle Klassen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
partial class Klasse
{
    public void Methode()
    {
    }
}

partial class Klasse
{
    public Klasse()
    {
    }
}


static class Program
{
    static void Main(string[] args)
    {
        KLasse klasse = new Klasse();
        klasse.Methode();
    }
}


Beide müssen das Schlüsselwort partial haben und den gleichen Namen tragen, dann sind in Beiden auch alle Inhalte gleichermaßen verfügbar und sie werden als eine Klasse kompiliert.


Webo - Mi 28.08.13 08:44

Das Visual Studio 2012 ist nicht für XP erhältlich, siehe http://www.microsoft.com/visualstudio/deu/products/compatibility. Liegt soweit ich mich erinnere daran, dass .Net4.5 einfach nicht für XP existiert ...

Die 2010er Version hingegen schon: http://www.microsoft.com/visualstudio/deu/downloads#d-2010-express


rap123 - Mi 28.08.13 13:34

Vielen Dank für die wertvollen Tipps. :D

Da habe ich ja endlich ein gutes Forum gefunden (nachdem ich in zwei anderen Foren keine Antwort auf meine Frage erhalten hatte).