CS0120: è richiesto un riferimento a un object per il campo nonstatico, il metodo o la proprietà ‘foo’

Prendere in considerazione:

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

Perché si verifica questo errore?

È richiesto un riferimento a un object per il campo, il metodo o la proprietà non statici ‘WindowsApplication1.Form1.setTextboxText (int)

Sembra che tu stia chiamando una proprietà non statica da un metodo statico. Sarà necessario rendere statica la proprietà o creare un’istanza di 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); } 

Ulteriori informazioni su questo errore sono disponibili su MSDN .

Si avvia una discussione che esegue il metodo statico SumData . Tuttavia, SumData chiama SetTextboxText che non è statico. Quindi hai bisogno di un’istanza del tuo modulo per chiamare SetTextboxText .

In questo caso, in cui si desidera ottenere un controllo di un modulo e si riceve questo errore, quindi ho un piccolo bypass per te.

Vai al tuo Program.cs e cambia

 Application.Run(new Form1()); 

a

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

Ora puoi accedere a un controllo con

 Program.form1. 

Inoltre: non dimenticare di impostare il livello di accesso di controllo su Pubblico.

E sì, lo so, questa risposta non si adatta al chiamante della domanda, ma si adatta ai googler che hanno questo problema specifico con i controlli.

Il tuo metodo deve essere statico

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

Dal mio aspetto si assegna un valore nullo a una casella di testo e si ritorna in un ToString() poiché si tratta di un metodo statico. È ansible sostituirlo con Convert.ToString() che può abilitare il valore nullo.

Ringraziamo @COOLGAMETUBE per avermi informato su cosa ha funzionato per me. La sua idea era buona ma ho avuto un problema quando Application.SetCompatibleTextRenderingDefault è stato chiamato dopo che il modulo era già stato creato. Quindi con un piccolo cambiamento, questo funziona per me:

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