web-dev-qa-db-fra.com

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

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 non statique, la méthode ou la propriété 'WindowsApplication1.Form1.setTextboxText (int)

194
huda

Il semble que vous appeliez une propriété non statique à partir d'une méthode statique. Vous devrez rendre la propriété statique ou créer une instance de Form1.

static void SetTextboxTextSafe(int result)
{
    label1.Text = result.ToString();
}

OR

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);
    }
    Form1 frm1 = new Form1();
    frm1.setTextboxText(result);
}

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

297
Joe

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

16
Brian Rasmussen

Dans ce cas, lorsque vous souhaitez obtenir le contrôle d'un formulaire et que vous recevez cette erreur, j'ai un petit contournement 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);

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

Program.form1.<Your control>

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

Et oui, je sais, cette réponse ne correspond pas à l'appelant, mais elle convient aux utilisateurs qui ont ce problème spécifique de contrôle.

9
COOLGAMETUBE

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);
    }
}
5
issam chouchane

Nous remercions @COOLGAMETUBE de m'avoir informé de ce qui a finalement fonctionné 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 peu de 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()); } }
0
veggiebenz

En fait, j'ai 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 = server.

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

0

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

0