2009-01-31 32 views
154

considerar:CS0120: Se requiere una referencia de objeto para el campo no estático, método o propiedad 'foo'

namespace WindowsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      //int[] val = { 0, 0}; 
      int val; 
      if (textBox1.Text == "") 
      { 
       MessageBox.Show("Input any no"); 
      } 
      else 
      { 
       val = Convert.ToInt32(textBox1.Text); 
       Thread ot1 = new Thread(new ParameterizedThreadStart(SumData)); 
       ot1.Start(val); 
      } 
     } 

     private static void ReadData(object state) 
     { 
      System.Windows.Forms.Application.Run(); 
     } 

     void setTextboxText(int result) 
     { 
      if (this.InvokeRequired) 
      { 
       this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); } 
      else 
      { 
       SetTextboxTextSafe(result); 
      } 
     } 

     void SetTextboxTextSafe(int result) 
     { 
      label1.Text = result.ToString(); 
     } 

     private static void SumData(object state) 
     { 
      int result; 
      //int[] icount = (int[])state; 
      int icount = (int)state; 

      for (int i = icount; i > 0; i--) 
      { 
       result += i; 
       System.Threading.Thread.Sleep(1000); 
      } 
      setTextboxText(result); 
     } 

     delegate void IntDelegate(int result); 

     private void button2_Click(object sender, EventArgs e) 
     { 
      Application.Exit(); 
     } 
    } 
} 

¿Por qué se está produciendo este error? Se requiere

una referencia de objeto para el campo no estático, método o propiedad 'WindowsApplication1.Form1.setTextboxText (int)

Respuesta

242

Parece que está llamando una propiedad para no estática de un método estático. Tendrá que hacer la propiedad estática o crear una instancia de Form1.

static void SetTextboxTextSafe(int result) 
{ 
    label1.Text = result.ToString(); 
} 

O

private static void SumData(object state) 
{ 
    int result; 
    //int[] icount = (int[])state; 
    int icount = (int)state; 

    for (int i = icount; i > 0; i--) 
    { 
     result += i; 
     System.Threading.Thread.Sleep(1000); 
    } 
    Form1 frm1 = new Form1(); 
    frm1.setTextboxText(result); 
} 

Más información sobre este error se puede encontrar on MSDN.

14

Inicia un hilo que ejecuta el método estático SumData. Sin embargo, SumData llama al SetTextboxText que no es estático. Por lo tanto, necesita una instancia de su formulario para llamar al SetTextboxText.

+0

Esta respuesta parece replantear el problema. No explica * por qué * esto produce un error. – Robert

0

Desde mi punto de vista le das un valor nulo a un cuadro de texto y lo devuelves en un ToString() ya que es un método estático. Puede reemplazarlo con Convert.ToString() que puede habilitar el valor nulo.

3

Su método debe ser estática

static void setTextboxText(int result) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); 
    } 
    else 
    { 
     SetTextboxTextSafe(result); 
    } 
} 
4

Para este caso, en el que desea obtener un control de un formulario y recibe este error, entonces tengo un poco de derivación para usted.

ir a su Program.cs y cambiar

Application.Run(new Form1()); 

a

public static Form1 form1 = new Form1(); // Place this var out of the constructor 
Application.Run(form1); 

Ahora se puede acceder a un control con

Program.form1.<Your control> 

También: No se olvide de configurar su Control-Nivel de acceso a público.

Y sí, sé que esta respuesta no se ajusta a la persona que llama la pregunta, pero se ajusta a los usuarios de Google que tienen este problema específico con los controles.

Cuestiones relacionadas