CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’

#c#

#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 resu<
            //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:

Похоже, что вы вызываете нестатический элемент (свойство или метод, в частности 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. Сделайте вызывающий метод нестатическим методом экземпляра (of 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.

Ответ №2:

В этом случае, когда вы хотите получить контроль над формой и получаете эту ошибку, у меня есть для вас небольшой обходной путь.

Перейдите в свой 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, у которых есть эта конкретная проблема с элементами управления.

Ответ №3:

Вы запускаете поток, который запускает статический метод SumData . Однако SumData вызовы SetTextboxText , которые не являются статическими. Таким образом, для вызова вам нужен экземпляр вашей формы SetTextboxText .

Комментарии:

1. Этот ответ, похоже, повторяет проблему. Это не объясняет, почему это приводит к ошибке.

2. @Robert Ни один из других ответов … этот комментарий был бессмысленным

Ответ №4:

Ваш метод должен быть статическим

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

Комментарии:

1. Этот конкретный метод явно обращается к свойствам экземпляра (в частности this.InvokeRequired , и this.Invoke ) и поэтому не может быть сделан статическим.

Ответ №5:

Спасибо @COOLGAMETUBE за то, что подсказал мне, что в итоге у меня получилось. Его идея была хорошей, но у меня возникла проблема при применении.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:

На самом деле я получил эту ошибку, потому что я проверял innerHTML на наличие некоторого содержимого, которое было сгенерировано динамически, то есть элемента управления runat = server .

Чтобы решить эту проблему, мне пришлось удалить ключевое слово «static» в моем методе, и все прошло нормально.

Ответ №7:

Насколько я понимаю, вы присваиваете текстовому полю нулевое значение и возвращаете его в a ToString() , поскольку это статический метод. Вы можете заменить его на Convert.ToString() , которое может включить нулевое значение.

Ответ №8:

Суть и решение вашей проблемы заключается в следующем:

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

Ответ №9:

Сделайте функцию статической. Это должно решить вашу проблему.