CS0120:非静态字段,方法或属性'foo'需要对象引用

时间:2009-01-31 06:22:03

标签: c#

考虑:

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)

需要对象引用

8 个答案:

答案 0 :(得分:320)

看起来您正在从静态方法调用非静态属性。您需要将属性设置为static,或者创建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

答案 1 :(得分:19)

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

答案 2 :(得分:10)

对于这种情况,如果你想获得一个表格的控制并且收到这个错误,那么我有一点绕道。

转到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>

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

是的,我知道,这个答案不适合问候者,但它适合那些控件存在此特定问题的google。

答案 3 :(得分:6)

您的方法必须是静态的

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

向@COOLGAMETUBE致谢,以向我提示最终为我工作的内容。他的想法很好,但是在创建表单之后调用Application.SetCompatibleTextRenderingDefault时遇到了问题。因此,只需稍作更改,即可为我工作:


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

/// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(form1 = new Form1()); } }

答案 6 :(得分:1)

我实际上收到了此错误,因为我正在检查InnerHtml中是否动态生成了某些内容,即runat = server的控件。

要解决此问题,我必须在方法上删除“ static”关键字,并且运行良好。

答案 7 :(得分:0)

问题的本质和解决方案是:

using System;

namespace myNameSpace
{
    class Program
    {
        private void method()
        {
            Console.WriteLine("Hello World!");
        }

        static void Main(string[] args)
        {
            method();//<-- Compile Time error because an instantiation of the Program class doesnt exist
            Program p = new Program();
            p.method();//Now it works. (You could also make method() static to get it to work)
        }
    }
}