8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

CS0120:非静态字段、方法或属性“foo”需要对象引用

Squidgybuffalo 1月前

77 0

考虑:命名空间 WindowsApplication1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Cl...

考虑:

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

帖子版权声明 1、本帖标题:CS0120:非静态字段、方法或属性“foo”需要对象引用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Squidgybuffalo在本站《visual-studio》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 从我看来,您为文本框赋予一个空值并返回, ToString() 因为它是一个静态方法。您可以将其替换为 Convert.ToString() 可以启用空值的方法。

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

    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)
            }
        }
    }
    
  • 我实际上收到此错误是因为我正在检查 InnerHtml 中是否存在一些动态生成的内容 - 即 runat=server 的控件。

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

  • 感谢@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());
        }
    }
    
  • 此特定方法明确访问实例属性(特别是 this.InvokeRequired 和 this.Invoke),因此不能设为静态。

  • 你的方法必须是静态的

    static void setTextboxText(int result)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); 
        }
        else
        {
            SetTextboxTextSafe(result);
        }
    }
    
  • 您启动一个运行静态方法的线程 SumData 。但是, SumData 调用 SetTextboxText 不是静态的。因此,您需要一个表单实例来调用 SetTextboxText .

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

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

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

    是的,我知道,这个答案并不适合提问者,但它适合在控制方面有这个特定问题的谷歌员工。

  • 看起来您正在 setTextboxText 从静态方法(特别是) SumData )。您需要执行以下任一操作:

    1. 如果可以的话,请将其设为 setTextboxText 静态:
      static void setTextboxText(int result)

    但是,在这种情况下,setTextboxText 需要访问实例变量,因此不能是静态的。
    应该这样做:

    1. 通过 Form1 的静态单例 setTextboxText 调用
    class Form1
    {
        public static Form1 It;   // Singleton.
    
        public Form1()
        {
            It = this;
        }
    
        private static void SumData(object state)
        {
            ...
            It.setTextboxText(result);
        }
    }
    
    1. 点2

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

      点3

    2. p4

       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 上 找到 .

返回
作者最近主题: