CS0120:非静态字段,方法或属性“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(); } } } 

为什么会发生此错误?

非静态字段,方法或属性“WindowsApplication1.Form1.setTextboxText(int)”需要对象引用。

它看起来像你从一个静态方法调用一个非静态属性。 您需要将该属性设为静态,或者创buildForm1的一个实例。

 static 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); } Form1 frm1 = new Form1(); frm1.setTextboxText(result); } 

你启动一个运行静态方法SumData的线程。 但是, SumData调用不是静态的SetTextboxText 。 因此,您需要一个表单实例来调用SetTextboxText

你的方法必须是静态的

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

对于这种情况,如果你想得到一个窗体的控制,并收到这个错误,那么我有一个绕过你。

转到您的Program.cs并更改

 Application.Run(new Form1()); 

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

现在你可以访问一个控件了

 Program.form1.<Your control> 

另外:不要忘记将你的控制访问级别设置为公开。

是的,我知道,这个答案不适合问题的调用者,但它适合于有控制这个具体问题的谷歌。

从我看,你给一个空值的文本框,并返回一个ToString()因为它是一个静态方法。 你可以用Convert.ToString()来replace它,它可以启用空值。