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


274

考虑:

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)需要对象引用

Answers:


401

看起来您正在setTextboxText从静态方法(特别是SumData)调用非静态成员(特别是属性或方法)。您将需要:

  1. 也将被叫成员设为静态:

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
    
  2. Form1在调用方法中创建一个实例:

    private static void SumData(object state)
    {
        int result = 0;
        //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);
    }
    

    Form1也可以选择传入的实例。

  3. 将调用方法设为(Form1)的非静态实例方法:

    private void SumData(object state)
    {
        int result = 0;
        //int[] icount = (int[])state;
        int icount = (int)state;
    
        for (int i = icount; i > 0; i--)
        {
            result += i;
            System.Threading.Thread.Sleep(1000);
        }
        setTextboxText(result);
    }
    

可以在MSDN上找到有关此错误的更多信息。


18

您启动一个运行static方法的线程SumData。然而,SumData电话SetTextboxText这也不是一成不变的。因此,您需要一个表单实例来调用SetTextboxText


13
该答案似乎可以重述该问题。它没有解释为什么这会产生错误。
罗伯特

13

对于这种情况,如果您想获得表单控件并收到此错误,那么我为您提供了一些绕过的方法。

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

另外:不要忘记将Control-Access-Level设置为Public。

是的,我知道,这个答案不适合提出问题的人,但适合具有控件特定问题的Google员工。


6

您的方法必须是静态的

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

此特定方法显式访问实例属性(特定为this.InvokeRequiredthis.Invoke),因此不能将其设为静态。
dbc

2

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

1

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


0

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

为了解决这个问题,我必须删除方法中的“ static”关键字,并且运行良好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.