CS0120: Für das nicht statische Feld, die Methode oder die Eigenschaft 'foo' ist eine Objektreferenz erforderlich.


274

Erwägen:

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

Warum tritt dieser Fehler auf?

Für das nicht statische Feld, die Methode oder die Eigenschaft 'WindowsApplication1.Form1.setTextboxText (int) ist eine Objektreferenz erforderlich.

Antworten:


401

Es sieht so aus, als würden Sie ein nicht statisches Element (speziell eine Eigenschaft oder Methode setTextboxText) von einer statischen Methode (speziell SumData) aufrufen . Sie müssen entweder:

  1. Machen Sie das aufgerufene Mitglied auch statisch:

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
  2. Erstellen Sie eine Instanz Form1innerhalb der aufrufenden Methode:

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

    Das Übergeben einer Instanz von Form1wäre ebenfalls eine Option.

  3. Machen Sie die aufrufende Methode zu einer nicht statischen Instanzmethode (von 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);
    }

Weitere Informationen zu diesem Fehler finden Sie auf MSDN .


18

Sie starten einen Thread, der die statische Methode ausführt SumData. Allerdings SumDataAnrufe , SetTextboxTextdie nicht statisch ist . Daher benötigen Sie eine Instanz Ihres Formulars zum Aufrufen SetTextboxText.


13
Diese Antwort scheint das Problem erneut zu formulieren. Es erklärt nicht, warum dies einen Fehler erzeugt.
Robert

13

In diesem Fall, in dem Sie die Kontrolle über ein Formular erhalten möchten und diesen Fehler erhalten, habe ich einen kleinen Bypass für Sie.

Gehen Sie zu Ihrer Program.cs und ändern Sie

Application.Run(new Form1());

zu

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

Jetzt können Sie mit auf ein Steuerelement zugreifen

Program.form1.<Your control>

Außerdem: Vergessen Sie nicht, Ihre Control-Access-Ebene auf Public zu setzen.

Und ja, ich weiß, diese Antwort passt nicht zum Fragenanrufer, aber zu Googlern, die dieses spezielle Problem mit Steuerelementen haben.


6

Ihre Methode muss statisch sein

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

Diese spezielle Methode greift explizit auf Instanzeigenschaften zu (speziell this.InvokeRequiredund this.Invoke) und kann daher nicht statisch gemacht werden.
dbc

2

Dank an @COOLGAMETUBE für den Hinweis, was letztendlich für mich funktioniert hat. Seine Idee war gut, aber ich hatte ein Problem, als Application.SetCompatibleTextRenderingDefault aufgerufen wurde, nachdem das Formular bereits erstellt wurde. Mit einer kleinen Änderung funktioniert dies für mich:


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

Nach meinem Aussehen geben Sie einem Textfeld einen Nullwert und kehren in a zurück, ToString()da es sich um eine statische Methode handelt. Sie können es durch Convert.ToString()einen Nullwert ersetzen .


0

Ich habe diesen Fehler tatsächlich erhalten, weil ich InnerHtml auf dynamisch generierten Inhalt überprüft habe - dh auf ein Steuerelement, das runat = server lautet.

Um dies zu lösen, musste ich das Schlüsselwort "static" in meiner Methode entfernen, und es lief einwandfrei.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.