CS0120: ссылка на объект требуется для нестатического поля, метода или свойства 'foo' - PullRequest
213 голосов
/ 31 января 2009

Рассмотрим:

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)

Ответы [ 7 ]

321 голосов
/ 31 января 2009

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

static void SetTextboxTextSafe(int result)
{
    label1.Text = result.ToString();
}

OR

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);
    }
    Form1 frm1 = new Form1();
    frm1.setTextboxText(result);
}

Более подробную информацию об этой ошибке можно найти на MSDN .

19 голосов
/ 31 января 2009

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

11 голосов
/ 07 января 2017

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

Перейдите в свой 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 голосов
/ 01 июля 2014

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

static void setTextboxText(int result)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); 
    }
    else
    {
        SetTextboxTextSafe(result);
    }
}
2 голосов
/ 27 июля 2018

Благодарю @COOLGAMETUBE за сообщение о том, что сработало для меня. Его идея была хороша, но у меня была проблема, когда Application.SetCompatibleTextRenderingDefault вызывался после того, как форма уже была создана. Так что с небольшими изменениями это работает для меня:


static class Program
{
    public static Form1 form1; // = new Form1(); // Place this var out of the constructor</p>

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(form1 = new Form1());
    }
}
1 голос
/ 12 января 2013

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

0 голосов
/ 03 июня 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...