2012-04-12 5 views
0

Ich habe den folgenden Code. Es ist ein Formular mit einem einzigen Textfeld darauf. Wenn ich myTimer_Tick nicht statisch mache, dann funktioniert es gut - warum?Warum macht statische Fehler beim Versuch, Textbox-Text zu aktualisieren

namespace Ariport_Parking 
{ 
    public partial class AirportParking : Form 
    { 

    //instance variables of the form 
    static Timer myTimer; 


    public AirportParking() 
    { 
     InitializeComponent(); 
     keepingTime(5000); 
     txtMessage.Text = "hello"; 
    } 

    //method for keeping time 
    public void keepingTime(int howlong) { 

     myTimer = new Timer(); 
     myTimer.Enabled = true; 
     myTimer.Tick += new EventHandler(myTimer_Tick); 
     myTimer.Interval = howlong; 

     myTimer.Start(); 

    } 

    static void myTimer_Tick(Object myObject,EventArgs myEventArgs){ 
     myTimer.Stop(); 
     txtMessage.Text = "hello world"; 
    } 

    } 

} 
+1

erst uns sagen, warum Sie es statisch sein? – Reniuz

+1

Was funktioniert nicht, wenn * es * eine statische ist? – Tigran

+1

Was ist der Fehler? –

Antwort

4

Ich denke, der Fehler wäre, dass es nicht auf txtMessage zugreifen kann. txtMessage ist eine Instanzvariable, die im Formular deklariert wurde. Eine statische Methode hat keinen Zugriff auf die Instanzdaten eines Formulars. Und Sie können google, warum zu wissen.

+0

+1. absolute Wahrheit – Reniuz

+0

Ich bin neu in C# und habe nicht erkannt, dass die Objekte auf einer Winform sind effektiv Instanzvariablen - das erklärt Dinge. – whytheq

+0

@Reniuz Ich habe nach Informationen gesucht und bin [hier] gegangen (http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.tick.aspx) und habe die Qualifier für die Ereignis _TimerEventProcessor_ im Beispiel. Ein wenig Wissen ist gefährlich. – whytheq

1

Da die txtMessage nicht statisch ist, benötigt sie die Instanz der Klasse, auf die zugegriffen werden soll. Sie müssen Ihren myTimer_Tick und den Timer nicht statisch machen. Oder nutzen Sie Lambda statt myTimer_Tick.

statt:

myTimer.Tick += new EventHandler(myTimer_Tick); 

Verwendung

myTimer.Tick += (sender, e) => { 
    myTimer.Stop(); 
    txtMessage.Text = "hello world"; 
}; 
+0

_Or für guten Gebrauch Lambda anstelle von myTimer_Tick._ was bedeutet das? – whytheq

+0

@whytheq Just edited the post :) – AlexTheo

+0

Ich nehme an, der Operator '=>' ist das Lambda? – whytheq

Verwandte Themen