2010-10-31 16 views
5

Ciao Perché non ho accesso al mio controllo privato sul modulo (ad esempio ListBox) da un metodo statico? Come aggiornare il controllo in questo caso?Come aggiornare i controlli dal metodo statico?

EDIT 1.

il mio codice:

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

e

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

quindi deve essere vuoto, senza param ed essere statico, giusto?

EDIT 2.

Se qualcuno bisogno soluzione in WPF, allora dovrebbe provare questo:

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

inserire il codice per capire il motivo per cui si vuole fare l'aggiornamento a metodo statico –

+0

Perché è stato definito lo statico? hai avuto accesso a questo metodo da qualsiasi altra classe? –

+0

può avere parametri e puoi passare i suoi parametri come array di oggetti –

risposta

2

I metodi statici non possono accedere stato dell'istanza (ad esempio un controllo non statico). Rimuovere static dalla dichiarazione metodo o passare un riferimento al controllo come argomento al metodo:

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

... e chiamare in questo modo:

SomeMethod(MyListBox); 

Aggiorna
Ci sono diversi modi per fare cose asincrone nell'interfaccia utente (ora assumendo winforms). Ti consiglierei di utilizzare BackgroundWorker (cerca qui su SO, molti esempi). Se si vuole veramente farlo con la creazione di discussioni sul proprio, qui è un modo per farlo:

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

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

... e chiamarlo:

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

È inoltre possibile utilizzare il filo piscina (preferito a creare i propri thread, dato che non vi aspettate loro di correre per molto tempo):

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

Devo chiamare questo metodo in un altro Thread, quindi AFAIK deve essere statico e deve essere senza param e deve restituire void, giusto? – Saint

+0

@Saint_pl: Presumo che intendi che vuoi lanciare il metodo call su un thread separato (come in 'new Thread (YourMethod)'). Se questo è il caso allora no, non ha bisogno di essere statico. Vuoto senza parametri e inverso sì, ma non necessariamente statico. –

+0

Hmm, giusto :) Non so perché prima non ha funzionato :) – Saint

1

è necessario passare un riferimento al controllo al metodo statico, o qualcosa che li contiene . metodi statici non possono accedere a campi/metodi/campi non statici. Non dichiarare il tuo controllo come statico, non sono nemmeno sicuro se è possibile, ma se lo fosse, ti causerebbe problemi che nemmeno vorresti sapere.

2

Ho appena trovato un modo nuovo e diverso per aggiornare un controllo da un metodo statico.ma dobbiamo scegliere nomi univoci per i nostri controlli

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

ho trovato un'altra risposta sul web

scrittura presente nella classe del form:

static Form1 frm; 

e nel costruttore del form:

frm = this; 

ora possiamo usare la variabile "frm" per accedere a tutti i controlli del modulo.

qualche parte in un metodo statico:

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

Wow! Hai appena salvato la mia giornata. Grazie mille! –

+1

Questo è fantastico ~ !!!!! –

0

Non è possibile accedere "questo", "ui" o qualsiasi funzione in MainWindow da una funzione statica.

Per risolvere questo problema, fare un puntatore pubblica di MainWindow

Mainwindow *THIS; 

prima di chiamare la funzione di callback (la funzione statica), assegnare questo al puntatore QUESTO

THIS=this; 

Ora, si può usa QUESTO invece di questo.

ad esempio:

THIS->listBox->Items->Add("Some element"); 
Problemi correlati