CS0120: Statik olmayan alan, yöntem veya 'foo' özelliği için bir nesne başvurusu gerekiyor


274

Düşünmek:

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

Bu hata neden oluşuyor?

Statik olmayan alan, yöntem veya 'WindowsApplication1.Form1.setTextboxText (int) özelliği için bir nesne başvurusu gerekiyor

Yanıtlar:


401

setTextboxTextStatik bir yöntemden (özellikle SumData) statik olmayan bir üye (özellikle bir özellik veya yöntem ) çağırdığınız anlaşılıyor . Aşağıdakilerden birini yapmanız gerekir:

  1. Aranan üyeyi de statik yapın:

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
  2. Form1Çağıran yöntem içinde bir örnek oluşturun :

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

    Bir örnek vermek Form1de bir seçenek olabilir.

  3. Çağıran yöntemi statik olmayan bir örnek yöntemi (/ Form1) yapın:

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

Bu hata hakkında daha fazla bilgi MSDN'de bulunabilir .


18

Statik yöntemi çalıştıran bir iş parçacığı başlatın SumData. Ancak, statik olmayan SumDataçağrılar SetTextboxText. Bu nedenle aramak için formunuzun bir örneğine ihtiyacınız vardır SetTextboxText.


13
Bu yanıt sorunu yeniden ifade ediyor gibi görünüyor. Bunun neden bir hata oluşturduğunu açıklamıyor .
Robert

13

Bu durumda, bir Formun Denetimi'ni almak ve bu hatayı almak istediğinizde, sizin için küçük bir baypas var.

Program.cs dosyasına gidin ve değiştirin

Application.Run(new Form1());

için

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

Artık aşağıdakilerle bir kontrole erişebilirsiniz:

Program.form1.<Your control>

Ayrıca: Kontrol-Erişim Seviyenizi Herkese Açık olarak ayarlamayı unutmayın.

Ve evet biliyorum, bu cevap soru arayan için uygun değil, ancak kontrollerle bu özel sorunu olan Google çalışanlarına uyuyor.


6

Metodunuz statik olmalıdır

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

Bu özel yöntem, örnek özelliklerine (özellikle this.InvokeRequiredve this.Invoke) açıkça erişir ve bu nedenle statik hale getirilemez.
dbc

2

@COOLGAMETUBE adlı kişiye, beni benim için çalışacak olan şeylere yatırdığı için teşekkür ederiz. Onun fikri iyi ama Form zaten oluşturulduktan sonra Application.SetCompatibleTextRenderingDefault çağrıldığında bir sorun vardı. Yani küçük bir değişiklikle, bu benim için çalışıyor:


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

Benim bakışımdan, bir metin kutusuna null değeri verir ve ToString()statik bir yöntem olduğu gibi bir a döndürür . Bu Convert.ToString()değeri null değeri etkinleştirecek şekilde değiştirebilirsiniz .


0

Dinamik olarak oluşturulan bazı içerik için InnerHtml kontrol ediyordum çünkü aslında bu hatayı aldım - yani runat = sunucu olan bir kontrol.

Bunu çözmek için benim yöntem "statik" anahtar kelimesini kaldırmak zorunda kaldı ve iyi koştu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.