2010-10-31 7 views
5

Hallo Warum habe ich keinen Zugriff auf mein privates Steuerelement auf Formular (z. B. ListBox) von einer statischen Methode? Wie wird die Steuerung in diesem Fall aktualisiert?Wie Update Controls von statischen Methode?

EDIT 1.

mein Code:

ThreadStart thrSt = new ThreadStart(GetConnected); 
     Thread thr = new Thread(thrSt); 
     thr.Start(); 

und

static void GetConnected() 
    { 
     //update my ListBox 
    } 

So muss es nichtig sein, ohne param und statisch sein, nicht wahr?

EDIT 2.

Wenn jemand Lösung in WPF benötigen, dann sollten diese versuchen:

private void GetConnected() 
    { 
     myListBox.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, 
        new Action(() => 
        { 
         myListBox.Items.Add("something"); 
        } 
           ) 
       ); 
    } 
+1

Ihren Code einfügen, um zu verstehen, warum Sie Update in statischer Methode –

+0

machen wollen Warum Sie es statisch definiert? Hast du von irgendeiner anderen Klasse auf diese Methode zugegriffen? –

+0

kann es Parameter haben und Sie können seinen Parameter als Objekt-Array übergeben –

Antwort

2

Statische Methoden können nicht Instanz Zustand (wie eine nicht-statische Kontrolle) zuzugreifen. Entfernen Sie entweder static aus der Methodendeklaration oder einen Verweis übergeben an die Steuerung als Argument an die Methode:

private static void SomeMethod(ListBox listBox) 
{ 
    listBox.Items.Add("Some element"); 
} 

... und nennen Sie es wie folgt:

SomeMethod(MyListBox); 

aktualisieren
Es Es gibt verschiedene Möglichkeiten, asynchrone Dinge in der Benutzeroberfläche zu tun (jetzt unterstellt man Winforms). Ich würde Ihnen empfehlen, mit BackgroundWorker (suchen Sie hier auf SO; viele Beispiele) zu untersuchen. Wenn Sie es wirklich tun wollen von Threads auf eigene Faust zu schaffen, hier ist eine Möglichkeit, das zu tun:

private void SomeMethod() 
{ 
    string newElement = FetchNextElementToAdd(): 
    SafeUpdate(() => yourListBox.Items.Add(newElement)); 
} 

private void SafeUpdate(Action action) 
{ 
    if (this.InvokeRequired) 
    { 
     this.BeginInvoke(action); 
    } 
    else 
    { 
     action(); 
    } 
} 

... und es nennen:

Thread thread = new Thread(SomeMethod); 
thread.Start(); 

Sie können auch den Faden verwenden Pool (bevorzugt Ihre eigenen Threads über die Erstellung, da Sie nicht erwarten, dass sie sehr lange laufen):

ThreadPool.QueueUserWorkItem(state => SomeMethod()); 
+0

Ich muss diese Methode in einem anderen Thread so AFAIK aufrufen, es muss statisch sein und muss ohne param und muss void zurückgeben, oder? – Saint

+0

@Saint_pl: Ich nehme an, dass Sie meinen, dass Sie die Methode aufrufen wollen, rufen Sie die Methode in einem separaten Thread auf (wie in 'new Thread (YourMethod)'). Wenn das der Fall ist, dann nein, es muss nicht statisch sein. Parameterlos und zurückkehrend void ja, aber nicht unbedingt statisch. –

+0

Hmm, das ist richtig :) Ich weiß nicht, warum früher es nicht funktioniert :) – Saint

1

Sie einen Verweis auf das Steuerelement auf Ihre statische Methode übergeben müssen, oder die etwas enthält sie . Statische Methoden können nicht auf nicht statische Felder/Methoden/etc zugreifen. deklariere deine Kontrolle nicht als statisch, ich bin mir nicht einmal sicher, ob es möglich ist, aber wenn es so wäre, würde es dir Probleme verursachen, von denen du nicht einmal wissen willst.

2

Ich habe gerade eine neue und andere Möglichkeit gefunden, ein Steuerelement von einer statischen Methode zu aktualisieren.aber wir müssen eindeutige Namen für unsere Kontrollen wählen

foreach (Form tmp in Application.OpenForms) 
       foreach (System.Windows.Forms.Control temp in tmp.Controls) 
        if (temp.Name == "textBox1") 
         temp.Text = "it works :)"; 
10

ich eine andere Antwort auf die Web-

schreiben diese in Form Klasse gefunden:

static Form1 frm; 

und in Form Konstruktor:

frm = this; 

Jetzt können wir die Variable "frm" für den Zugriff auf alle Steuerelemente im Formular verwenden.

irgendwo in einer statischen Methode:

frm.myListBox.Items.Add("something"); 
+2

Wow! Du hast gerade meinen Tag gerettet. Ich danke dir sehr! –

+1

Das ist genial ~ !!!!! –

0

Sie können nicht darauf zugreifen „dieses“, „ui“ oder eine beliebige Funktion in Mainwindow aus einer statischen Funktion.

Um dieses Problem zu lösen, einen öffentlichen Zeiger von Hauptfenstern machen

Mainwindow *THIS; 

, bevor Sie die Callback-Funktion (die statische Funktion) aufrufe, diese THIS

THIS=this; 

Jetzt können Sie, auf den Zeiger zuweisen Verwenden Sie stattdessen THIS.

zum Beispiel:

THIS->listBox->Items->Add("Some element"); 
Verwandte Themen