320 votes

CS0120 : Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique 'foo'.

Pensez-y :

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

Pourquoi cette erreur se produit-elle ?

Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique 'WindowsApplication1.Form1.setTextboxText(int)'.

451voto

Joe Points 5298

Il semble que vous appelez un membre non statique (une propriété ou une méthode, en particulier). setTextboxText ) à partir d'une méthode statique (en particulier SumData ). Vous devrez soit :

  1. Rendez le membre appelé statique également :

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
  2. Créer une instance de Form1 dans la méthode d'appel :

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

    En passant dans une instance de Form1 serait également une option.

  3. Faire de la méthode appelante une méthode d'instance non-statique (de 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);
    }

Plus d'informations sur cette erreur peuvent être trouvées sur MSDN .

20voto

COOLGAMETUBE Points 494

Dans ce cas, si vous voulez obtenir un contrôle d'un formulaire et que vous recevez cette erreur, j'ai une petite astuce pour vous.

Allez dans votre Program.cs et changez

Application.Run(new Form1());

à

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

Maintenant, vous pouvez accéder à un contrôle avec

Program.form1.<Your control>

Aussi : N'oubliez pas de définir votre niveau de contrôle d'accès sur Public.

Et oui, je sais, cette réponse ne convient pas à l'auteur de la question, mais elle convient aux googleurs qui ont ce problème spécifique avec les contrôles.

19voto

Brian Rasmussen Points 68853

Vous démarrez un thread qui exécute la méthode statique SumData . Cependant, SumData appelle SetTextboxText qui n'est pas statique. Vous avez donc besoin d'une instance de votre formulaire pour appeler SetTextboxText .

16 votes

Cette réponse semble reformuler le problème. Elle n'explique pas pourquoi cela produit une erreur.

0 votes

@Robert Ni toutes les autres réponses... ce commentaire était inutile

7voto

user3794031 Points 1

Votre méthode doit être statique

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

0 votes

Cette méthode spécifique accède explicitement aux propriétés de l'instance (spécifiquement this.InvokeRequired et this.Invoke ) et ne peut donc pas être rendu statique.

3voto

veggiebenz Points 176

Crédit à @COOLGAMETUBE pour m'avoir indiqué ce qui a fini par fonctionner pour moi. Son idée était bonne mais j'avais un problème lorsque Application.SetCompatibleTextRenderingDefault était appelé après que le formulaire ait été créé. Donc, avec un petit changement, cela fonctionne pour moi :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X