CS0120: Für das nicht statische Feld, die Methode oder die Eigenschaft ‘foo’ ist eine Objektreferenz erforderlich.

Erwägen:

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

Warum tritt dieser Fehler auf?

Für das nicht statische Feld, die Methode oder die Eigenschaft ‘WindowsApplication1.Form1.setTextboxText (int) ist eine Objektreferenz erforderlich.

   

Es sieht so aus, als ob Sie eine statische Eigenschaft von einer statischen Methode aufrufen. Sie müssen entweder die Eigenschaft statisch machen oder eine Instanz von Form1 erstellen.

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

ODER

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

Weitere Informationen zu diesem Fehler finden Sie auf MSDN .

Sie starten einen Thread, der die statische Methode SumData . SumData ruft jedoch SetTextboxText das nicht statisch ist. Daher benötigen Sie eine Instanz Ihres Formulars, um SetTextboxText .

Für diesen Fall, wo Sie eine Kontrolle über ein Formular erhalten möchten und diesen Fehler erhalten, habe ich einen kleinen Bypass für Sie.

Gehe zu deinem Program.cs und ändere es

 Application.Run(new Form1()); 

zu

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

Jetzt können Sie mit einem Steuerelement auf zugreifen

 Program.form1. 

Außerdem: Vergessen Sie nicht, Ihren Control-Access-Level auf Public zu setzen.

Und ja, ich weiß, diese Antwort passt nicht zur Frage Anrufer, aber es passt zu Google-Nutzern, die dieses spezielle Problem mit Kontrollen haben.

Ihre Methode muss statisch sein

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

Aus meiner Suche geben Sie einem Textfeld einen Nullwert und geben es in einer ToString() da es sich um eine statische Methode handelt. Sie können es durch Convert.ToString() ersetzen, das Nullwert aktivieren kann.

Dankeschön an @COOLGAMETUBE, dass er mich zu dem gebracht hat, was für mich funktioniert hat. Seine Idee war gut, aber ich hatte ein Problem, als Application.SetCompatibleTextRenderingDefault aufgerufen wurde, nachdem das Formular bereits erstellt wurde. Mit etwas Abwechslung funktioniert das für mich:

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