2009-01-31 253 views
154

考慮:CS0120:一個對象引用是所必需的非靜態字段,方法或屬性「富」

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)

回答

242

它看起來像您呼叫從一個靜態方法的非靜態的特性。您需要將該屬性設爲靜態,或者創建Form1的實例。

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

OR

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

更多關於此錯誤的信息可以發現on MSDN

14

您啓動一個運行靜態方法SumData的線程。但是,SumData調用SetTextboxText這不是靜態的。因此,您需要一個表單實例來呼叫SetTextboxText

+0

這個答案似乎重申了這個問題。它沒有解釋爲什麼這會產生一個錯誤。 – Robert 2016-01-06 06:16:42

0

從我看你給一個空值的文本框,並返回ToString(),因爲它是一個靜態方法。您可以用可以啓用空值的Convert.ToString()替換它。

3

你的方法必須是靜態的

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

對於這種情況,要獲得一個表單的控制,並收到此錯誤,那麼我對你有點繞行。

轉到您的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> 

而且訪問控制:不要忘記設置您的控制訪問級別爲公共。

是的,我知道,這個答案不適合問題的調用者,但它適合於谷歌誰與控制這個具體問題。

相關問題