CS0120: Uma referência de object é necessária para o campo não estático, método ou propriedade ‘foo’

Considerar:

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 que esse erro está ocorrendo?

Uma referência de object é necessária para o campo não estático, método ou propriedade ‘WindowsApplication1.Form1.setTextboxText (int)

Parece que você está chamando uma propriedade não estática de um método estático. Você precisará tornar a propriedade estática ou criar uma instância do Form1.

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

OU

 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); } 

Mais informações sobre esse erro podem ser encontradas no MSDN .

Você inicia um thread que executa o método estático SumData . No entanto, SumData chama SetTextboxText que não é estático. Assim, você precisa de uma instância do seu formulário para chamar SetTextboxText .

Para este caso, onde você deseja obter um Controle de um Formulário e está recebendo este erro, então eu tenho um pequeno desvio para você.

Vá para o seu Program.cs e mude

 Application.Run(new Form1()); 

para

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

Agora você pode acessar um controle com

 Program.form1. 

Além disso, não se esqueça de definir seu nível de access ao controle como público.

E sim, eu sei, essa resposta não se encheckbox na pergunta do chamador, mas cabe aos googlers que têm esse problema específico com controles.

Seu método deve ser estático

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

Do meu olhar você dá um valor nulo para uma checkbox de texto e retornar em um ToString() , pois é um método estático. Você pode substituí-lo com Convert.ToString() que pode habilitar o valor nulo.

Crédito para @ COOLGAMETUBE por me dar gorjeta para o que acabou funcionando para mim. Sua idéia era boa, mas eu tive um problema quando Application.SetCompatibleTextRenderingDefault foi chamado após o formulário já ter sido criado. Então, com uma pequena mudança, isso está funcionando para mim:

 static class Program { public static Form1 form1; // = new Form1(); // Place this var out of the constructor ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(form1 = new Form1()); } } 

static class Program { public static Form1 form1; // = new Form1(); // Place this var out of the constructor ///

/// The main entry point for the application. ///

[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(form1 = new Form1()); } }