CS0120: Referensi objek diperlukan untuk bidang tidak statis, metode, atau properti 'foo'


274

Mempertimbangkan:

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

Mengapa kesalahan ini terjadi?

Referensi objek diperlukan untuk bidang tidak statis, metode, atau properti 'WindowsApplication1.Form1.setTextboxText (int)

Jawaban:


401

Sepertinya Anda memanggil anggota yang tidak statis (properti atau metode, khususnya setTextboxText) dari metode statis (khusus SumData). Anda harus:

  1. Jadikan anggota yang dipanggil juga statis:

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
    
  2. Buat instance dari Form1dalam metode panggilan:

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

    Melewati dengan instance Form1akan menjadi opsi juga.

  3. Jadikan metode panggilan metode instance non-statis 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);
    }

Info lebih lanjut tentang kesalahan ini dapat ditemukan di MSDN .


18

Anda memulai utas yang menjalankan metode statis SumData. Namun, SumDatapanggilan SetTextboxTextyang tidak statis. Jadi, Anda perlu contoh formulir Anda untuk menelepon SetTextboxText.


13
Jawaban ini muncul untuk menyatakan kembali masalahnya. Itu tidak menjelaskan mengapa ini menghasilkan kesalahan.
Robert

13

Untuk kasus ini, di mana Anda ingin mendapatkan Kontrol Formulir dan menerima kesalahan ini, maka saya memiliki sedikit jalan pintas untuk Anda.

Buka Program.cs Anda dan ubah

Application.Run(new Form1());

untuk

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

Sekarang Anda dapat mengakses kontrol dengan

Program.form1.<Your control>

Juga: Jangan lupa untuk mengatur Level Kontrol-Akses Anda menjadi Publik.

Dan ya saya tahu, jawaban ini tidak cocok dengan penelepon pertanyaan, tetapi cocok untuk orang Google yang memiliki masalah khusus ini dengan kontrol.


6

Metode Anda harus statis

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

Metode spesifik ini secara eksplisit mengakses properti instance (khusus this.InvokeRequireddan this.Invoke) dan karenanya tidak dapat dibuat statis.
dbc

2

Kredit ke @COOLGAMETUBE karena memberi tahu saya tentang apa yang akhirnya berhasil bagi saya. Idenya bagus tapi saya punya masalah ketika Application.SetCompatibleTextRenderingDefault dipanggil setelah formulir sudah dibuat. Jadi dengan sedikit perubahan, ini bekerja untuk saya:


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

Dari tampilan saya, Anda memberikan nilai nol ke kotak teks dan kembali dalam bentuk ToString()metode statis. Anda dapat menggantinya dengan Convert.ToString()yang dapat mengaktifkan nilai nol.


0

Saya benar-benar mendapatkan kesalahan ini karena saya memeriksa InnerHtml untuk beberapa konten yang dihasilkan secara dinamis - yaitu kontrol yang runat = server.

Untuk mengatasi ini saya harus menghapus kata kunci "statis" pada metode saya, dan itu berjalan dengan baik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.