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


274

Considérer:

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)

Réponses:


401

Il semble que vous appeliez 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éez une instance de Form1dans 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);
    }

    Passer dans une instance de Form1serait également une option.

  3. Faites de la méthode appelante une méthode d'instance non statique (of 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 .


18

Vous démarrez un thread qui exécute la méthode statique SumData. Cependant, les SumDataappels SetTextboxTextqui ne sont pas statiques. Vous avez donc besoin d'une instance de votre formulaire pour appeler SetTextboxText.


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

13

Pour ce cas, où vous souhaitez obtenir un contrôle d'un formulaire et recevez cette erreur, j'ai un petit contournement pour vous.

Accédez à 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);

Vous pouvez maintenant accéder à un contrôle avec

Program.form1.<Your control>

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

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


6

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

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

2

Nous remercions @COOLGAMETUBE de m'avoir informé de ce qui a fini par fonctionner pour moi. Son idée était bonne mais j'ai eu un problème lorsque Application.SetCompatibleTextRenderingDefault a été appelé après la création du formulaire. 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()); } }

1

De ma recherche, vous donnez une valeur nulle à une zone de texte et retournez dans ToString()car c'est une méthode statique. Vous pouvez le remplacer par Convert.ToString()celui qui peut activer la valeur nulle.


0

J'ai en fait eu cette erreur parce que je vérifiais InnerHtml pour du contenu généré dynamiquement - c'est-à-dire un contrôle qui est runat = serveur.

Pour résoudre ce problème, j'ai dû supprimer le mot clé "statique" de ma méthode, et cela s'est bien passé.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.