2010-10-31 22 views
5

Hola ¿Por qué no he tenido acceso a mi control privado en el formulario (por ejemplo, ListBox) desde un método estático? ¿Cómo actualizar el control en este caso?Cómo actualizar los controles del método estático?

EDITAR 1.

mi código:

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

y

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

lo que debe ser nula, sin param y un ser estático, ¿verdad?

EDITAR 2.

Si alguien necesita solución en WPF continuación, debe intentar esto:

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

ingresar el código de entender por qué desea realizar la actualización en el método estático –

+0

¿Por qué se ha definido estática? ¿Accediste a este método desde cualquier otra clase? –

+0

puede tener un parámetro y puede pasar su parámetro como matriz de objetos –

Respuesta

2

métodos estáticos no pueden acceder estado de la instancia (por ejemplo, un control no estática). O bien eliminar static de la declaración de método, o pasar una referencia al control como argumento al método:

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

... y lo llaman así:

SomeMethod(MyListBox); 

actualización
No son formas diferentes de hacer cosas asincrónicas en la interfaz de usuario (ahora asumiendo formas de ganar). Te recomendaría que estudiases usando BackgroundWorker (busca aquí en SO, muchos ejemplos). Si realmente quiere hacerlo mediante la creación de hilos por su cuenta, aquí es una manera de hacerlo:

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

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

... y llamarlo:

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

También puede utilizar el hilo piscina (preferible a crear sus propios hilos, dado que no se espera que se ejecuten por mucho tiempo):

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

Debo llamar a este método en otro subproceso así que AFAIK debe ser estático y debe estar sin param y debe volverse vacío, ¿no? – Saint

+0

@Saint_pl: supongo que quieres decir que quieres ejecutar llamar al método en un hilo separado (como en 'new Thread (YourMethod) '). Si ese es el caso, entonces no, no necesita ser estático. Parameterless y return void sí, pero no necesariamente estático. –

+0

Hmm, es correcto :) No sé por qué antes no funcionó :) – Saint

1

lo necesario para pasar una referencia al control a su método estático, o algo que los contiene . los métodos estáticos no pueden acceder a campos/métodos/etc no estáticos no declare su control como estático, ni siquiera estoy seguro si es posible, pero si lo fuera, le causaría problemas que ni siquiera quiere saber.

2

Acabo de encontrar una nueva y diferente forma de actualizar un control desde un método estático.pero tenemos que elegir nombres únicos para nuestros controles

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

he encontrado otra respuesta en la web

escribir esto en la clase formulario:

static Form1 frm; 

y en la forma constructor:

frm = this; 

ahora podemos usar la variable "frm" para acceder a todos los controles del formulario.

en algún lugar de un método estático:

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

¡Guau! Usted acaba de salvar mi día. Muchas gracias! –

+1

Esto es impresionante ~ !!!!! –

0

no puede acceder a "este", "ui" o cualquier función en MainWindow de una función estática.

Para resolver este problema, crea un puntero pública de MainWindow

Mainwindow *THIS; 

antes de llamar a la función de devolución de llamada (la función estática), asignar este al puntero ESTA

THIS=this; 

Ahora, se puede usa ESTO en vez de esto

por ejemplo:

THIS->listBox->Items->Add("Some element"); 
Cuestiones relacionadas