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)

Ответы:


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


18

Вы запускаете поток, который запускает статический метод 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.

И да, я знаю, этот ответ не подходит для вызывающего вопросы, но он подходит для гуглеров, которые имеют эту конкретную проблему с элементами управления.


6

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

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

Этот конкретный метод явно обращается к свойствам экземпляра (в частности, this.InvokeRequiredи this.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

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.