387 Stimmen

CS0120: Ein Objektverweis ist für das nicht statische Feld, die Methode oder Eigenschaft 'foo' erforderlich.

Bitte beachten Sie:

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("Geben Sie eine Zahl ein");
            }
            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?

Ein Objektverweis ist für das nichtstatische Feld, die Methode oder die Eigenschaft 'WindowsApplication1.Form1.setTextboxText(int) erforderlich

535voto

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

  1. Wenn möglich, machen Sie setTextboxText statisch:
    static void setTextboxText(int result)

ALLERDINGS erfordert setTextboxText in diesem Fall Zugriff auf Instanzvariablen, kann also nicht statisch sein.
Machen Sie stattdessen folgendes:

  1. Rufen Sie setTextboxText über einen statischen Singleton von Form1 auf:

    class Form1 { public static Form1 It; // Singleton.

    public Form1()
    {
        It = this;
    }
    
    private static void SumData(object state)
    {
        ...
        It.setTextboxText(result);
    }

    }

  2. Erstellen Sie eine Instanz von Form1 innerhalb 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);
    }

    ABER das wird nicht das tun, was Sie wollen, wenn bereits eine Instanz von Form1 vorhanden ist.
    Das Übergeben einer Instanz von Form1 wäre auch 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.

25voto

Simon Nitzsche Punkte 613

Für diesen Fall, wo Sie die Steuerung eines Formulars erhalten möchten und diesen Fehler erhalten, habe ich einen kleinen Umweg für Sie.

Gehen Sie zu Ihrem Program.cs und ändern Sie

Application.Run(new Form1());

zu

public static Form1 form1 = new Form1(); // Platzieren Sie diese Variable außerhalb des Konstruktors
Application.Run(form1);

Jetzt können Sie auf eine Steuerung mit

Program.form1.

zugreifen

Vergessen Sie auch nicht, Ihren Steuerzugriffslevel auf Öffentlich zu setzen.

Und ja, ich weiß, dass diese Antwort nicht zur Frage passt, aber sie passt zu Googler, die dieses spezifische Problem mit Steuerungen haben.

22voto

Brian Rasmussen Punkte 112118

Du startest einen Thread, der die statische Methode SumData ausführt. Allerdings ruft SumData SetTextboxText auf, was nicht statisch ist. Daher benötigst du eine Instanz deines Formulars, um SetTextboxText aufzurufen.

25 Stimmen

Diese Antwort scheint das Problem erneut zu erklären. Es erklärt nicht, warum dies einen Fehler verursacht.

4 Stimmen

@Robert Auch die anderen Antworten nicht... dieser Kommentar war sinnlos

9voto

issam chouchane Punkte 117

Ihre Methode muss statisch sein

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

2 Stimmen

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

5voto

veggiebenz Punkte 369

Gutschrift an @COOLGAMETUBE für den Hinweis, der am Ende 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. Also mit einer kleinen Änderung funktioniert das für mich:

static class Program
{
    public static Form1 form1; // = new Form1(); // Platzieren Sie diese Variable außerhalb des Konstruktors

    /// 
    /// Der Hauptteil für die Anwendung.
    /// 
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(form1 = new Form1());
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X