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

C# CS0120:非静态字段、方法或属性需要对象引用';foo';,c#,C#,考虑: namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //int[

考虑:

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


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

  • 将被调用的成员也设为静态:

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

    私有静态数据(对象状态)
    {
    int结果=0;
    //int[]icount=(int[])状态;
    int icount=(int)状态;
    对于(int i=i计数;i>0;i--)
    {
    结果+=i;
    系统线程线程睡眠(1000);
    }
    Form1 frm1=新Form1();
    frm1.setTextboxText(结果);
    }
    
    传入
    Form1
    的实例也是一个选项

  • 使调用方法成为非静态实例方法(属于
    Form1
    ):


  • 可以找到有关此错误的详细信息。

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

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

    您的方法必须是静态的

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

    现在,您可以使用访问控件

    Program.form1.<Your control>
    
    Program.form1。
    
    另外:不要忘记将您的控制访问级别设置为Public


    是的,我知道,这个答案不适合打电话的人,但它适合那些在控制方面有特殊问题的谷歌用户。

    感谢@COOLGAMETUBE向我透露了最终对我有用的东西。他的想法很好,但在创建表单后调用Application.SetCompatibleTextRenderingDefault时,我遇到了一个问题。因此,只要稍作改变,这对我来说是可行的:

    
    静态类程序
    {
    public static Form1 Form1;//=new Form1();//将此变量放在构造函数之外

    /// ///应用程序的主要入口点。 /// [状态线程] 静态void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(form1=newform1()); } }
    我实际上遇到了这个错误,因为我正在检查InnerHtml中动态生成的一些内容,即runat=server的控件


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

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

    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)
            }
        }
    }
    
    使用系统;
    名称空间myNameSpace
    {
    班级计划
    {
    私有无效方法()
    {
    控制台。WriteLine(“你好,世界!”);
    }
    静态void Main(字符串[]参数)
    {
    
    method();//这个答案似乎再次说明了问题。它没有解释为什么会产生错误。@Robert,其他答案也没有。……这个注释是无意义的。这个特定的方法显式地访问实例属性(特别是
    This.invokererequired
    This.Invoke
    ),因此不能成为静态的。
    Program.form1.<Your control>
    
    
    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()); } }
    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)
            }
        }
    }