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. Зробіть метод виклику нестатичним методом (наприклад 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>

Також: Не забудьте встановити рівень доступу та контролю для всіх.

І так, я знаю, ця відповідь не підходить для запитувача, але він підходить для гуглерів, у яких є ця проблема з елементами управління.


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 = сервер.

Щоб вирішити це, мені довелося видалити "статичне" ключове слово в моєму методі, і воно нормально працювало.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.