CS0120: Odwołanie do obiektu jest wymagane dla niestatycznego pola, metody lub właściwości „foo”


274

Rozważać:

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

Dlaczego występuje ten błąd?

Odwołanie do obiektu jest wymagane w przypadku pola, metody lub właściwości niestatycznej „WindowsApplication1.Form1.setTextboxText (int)

Odpowiedzi:


401

Wygląda na to, że wywołujesz element niestatyczny (konkretnie właściwość lub metoda setTextboxText) z metody statycznej (konkretnie SumData). Będziesz musiał:

  1. Ustaw również wywoływany element statyczny:

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
  2. Utwórz instancję Form1w ramach metody wywołującej:

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

    Przekazywanie w instancji Form1byłoby również opcją.

  3. Ustaw metodę wywołującą jako metodę niestatyczną (z 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);
    }

Więcej informacji o tym błędzie można znaleźć w witrynie MSDN .


18

Zaczynasz wątek, który uruchamia metodę statyczną SumData. Jednak SumDatapołączenia, SetTextboxTextktóre nie są statyczne. Aby zadzwonić, potrzebujesz instancji formularza SetTextboxText.


13
Ta odpowiedź wydaje się przedstawiać problem ponownie. Nie wyjaśnia, dlaczego powoduje to błąd.
Robert

13

W tym przypadku, gdy chcesz uzyskać kontrolę nad formularzem i otrzymujesz ten błąd, mam dla ciebie małą obwodnicę.

Przejdź do pliku Program.cs i zmień

Application.Run(new Form1());

do

public static Form1 form1 = new Form1(); // Place this var out of the constructor
Application.Run(form1);

Teraz możesz uzyskać dostęp do kontrolki za pomocą

Program.form1.<Your control>

Ponadto: nie zapomnij ustawić swojego poziomu kontroli dostępu na publiczny.

I tak, wiem, ta odpowiedź nie pasuje do osoby dzwoniącej, ale pasuje do pracowników Google, którzy mają ten konkretny problem ze sterowaniem.


6

Twoja metoda musi być statyczna

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

Ta konkretna metoda wyraźnie uzyskuje dostęp do właściwości instancji (konkretnie this.InvokeRequiredi this.Invoke) i dlatego nie może być statyczna.
dbc

2

Podziękowania dla @COOLGAMETUBE za poinformowanie mnie o tym, co ostatecznie dla mnie zadziałało. Jego pomysł był dobry, ale miałem problem, gdy wywołano Application.SetCompatibleTextRenderingDefault po utworzeniu formularza. Więc z małą zmianą, to działa dla mnie:


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

Z mojego wyglądu dajesz wartość zerową do pola tekstowego i wracasz ToString()jako, ponieważ jest to metoda statyczna. Możesz go zastąpić tym, Convert.ToString()aby włączyć wartość zerową.


0

Naprawdę dostałem ten błąd, ponieważ sprawdzałem InnerHtml pod kątem zawartości, która została wygenerowana dynamicznie - tj. Formantu, który jest runat = serwer.

Aby rozwiązać ten problem, musiałem usunąć słowo kluczowe „static” z mojej metody i zadziałało dobrze.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.