CS0120: È necessario un riferimento all'oggetto per il campo, il metodo o la proprietà non statici "pippo"


274

Tener conto di:

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

Perché si verifica questo errore?

È necessario un riferimento a oggetto per il campo, il metodo o la proprietà non statici 'WindowsApplication1.Form1.setTextboxText (int)

Risposte:


401

Sembra che tu stia chiamando un membro non statico (una proprietà o un metodo, in particolare setTextboxText) da un metodo statico (in particolare SumData). Dovrai:

  1. Rendi statico anche il membro chiamato:

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
  2. Creare un'istanza Form1all'interno del metodo chiamante:

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

    Passare in un'istanza di Form1sarebbe anche un'opzione.

  3. Rendi il metodo chiamante un metodo di istanza non statico (di 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);
    }

Ulteriori informazioni su questo errore sono disponibili su MSDN .


18

Si avvia un thread che esegue il metodo statico SumData. Tuttavia, SumDatachiamate SetTextboxTextnon statiche. Quindi hai bisogno di un'istanza del tuo modulo da chiamare SetTextboxText.


13
Questa risposta sembra riaffermare il problema. Non spiega perché questo produce un errore.
Robert

13

Per questo caso, dove vuoi ottenere il controllo di un modulo e stai ricevendo questo errore, allora ho un piccolo bypass per te.

Vai su Program.cs e modifica

Application.Run(new Form1());

per

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

Ora puoi accedere a un controllo con

Program.form1.<Your control>

Inoltre: non dimenticare di impostare il livello di controllo-accesso su Pubblico.

E sì, lo so, questa risposta non si adatta al chiamante della domanda, ma si adatta ai googler che hanno questo specifico problema con i controlli.


6

Il tuo metodo deve essere statico

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

Questo metodo specifico accede esplicitamente alle proprietà dell'istanza (in particolare this.InvokeRequirede this.Invoke) e quindi non può essere reso statico.
dbc

2

Ringraziamo @COOLGAMETUBE per avermi segnalato ciò che alla fine ha funzionato per me. La sua idea era buona ma ho avuto un problema quando è stato chiamato Application.SetCompatibleTextRenderingDefault dopo che il modulo era già stato creato. Quindi, con un piccolo cambiamento, questo funziona per me:


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

Dal mio aspetto, dai un valore nullo a una casella di testo e ritorna in a ToString()perché è un metodo statico. È possibile sostituirlo con Convert.ToString()quello che può abilitare il valore null.


0

In realtà ho riscontrato questo errore perché stavo controllando InnerHtml per alcuni contenuti generati dinamicamente, ovvero un controllo runat = server.

Per risolvere questo problema, ho dovuto rimuovere la parola chiave "statica" dal mio metodo e funzionava bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.