CS0120: नॉनस्टैटिक फील्ड, मेथड या प्रॉपर्टी 'फू' के लिए एक ऑब्जेक्ट रेफरेंस की आवश्यकता होती है।


274

विचार करें:

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

यह त्रुटि क्यों हो रही है?

नॉनस्टैटिक फील्ड, मेथड या प्रॉपर्टी 'WindowsApplication1.Form1.setTextboxText (int) के लिए ऑब्जेक्ट संदर्भ आवश्यक है

जवाबों:


401

ऐसा लगता है कि आप setTextboxTextएक स्थिर विधि (विशेष रूप से) से एक गैर स्थिर सदस्य (एक संपत्ति या विधि, विशेष रूप से ) को बुला रहे हैं SumData। आपको या तो करने की आवश्यकता होगी:

  1. तथाकथित सदस्य को भी स्थिर बनाएं:

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
    
  2. Form1कॉलिंग विधि के भीतर एक उदाहरण बनाएँ :

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

    एक उदाहरण में पास Form1करना भी एक विकल्प होगा।

  3. कॉलिंग विधि को एक गैर-स्थिर इंस्टेंस विधि (का 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);
    }
    

इस त्रुटि के बारे में अधिक जानकारी MSDN पर पाई जा सकती है ।


18

आप एक थ्रेड शुरू करते हैं जो स्टैटिक विधि से चलता है SumData। हालाँकि, SumDataकॉल SetTextboxTextजो स्थिर नहीं है। इस प्रकार आपको कॉल करने के लिए अपने फॉर्म का एक उदाहरण चाहिए SetTextboxText


13
यह उत्तर समस्या को शांत करता है। यह नहीं समझाता है कि यह एक त्रुटि क्यों पैदा करता है।
रॉबर्ट

13

इस स्थिति के लिए, जहाँ आप एक प्रपत्र का नियंत्रण प्राप्त करना चाहते हैं और यह त्रुटि प्राप्त कर रहे हैं, तो मेरे पास आपके लिए थोड़ा बाईपास है।

अपने Program.cs पर जाएं और बदलें

Application.Run(new Form1());

सेवा

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

अब आप के साथ एक नियंत्रण का उपयोग कर सकते हैं

Program.form1.<Your control>

इसके अलावा: अपने कंट्रोल-एक्सेस-लेवल को पब्लिक में सेट करना न भूलें।

और हां मुझे पता है, यह जवाब प्रश्नकर्ता के लिए फिट नहीं है, लेकिन यह उन गोगलर्स के लिए फिट बैठता है जिनके पास नियंत्रण के साथ यह विशिष्ट मुद्दा है।


6

आपका तरीका स्थिर होना चाहिए

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

यह विशिष्ट विधि स्पष्ट रूप से उदाहरण के गुणों (विशेष रूप से this.InvokeRequiredऔर this.Invoke) तक पहुंचती है और इसलिए इसे स्थिर नहीं बनाया जा सकता है।
dbc

2

मुझे मेरे लिए काम करने के लिए बंद करने के लिए @COOLGAMETUBE करने का श्रेय। उनका विचार अच्छा था, लेकिन मुझे एक समस्या थी जब Application.SetCompatibleTextRenderingDefault फॉर्म तैयार होने के बाद कॉल किया गया था। इसलिए थोड़े बदलाव के साथ, यह मेरे लिए काम कर रहा है:


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

मेरे देखने से आप एक टेक्स्टबॉक्स को एक शून्य मान देते हैं और ToString()एक स्थिर तरीके से वापस आते हैं। आप इसे Convert.ToString()उस से बदल सकते हैं जो अशक्त मान को सक्षम कर सकता है।


0

मुझे वास्तव में यह त्रुटि मिली क्योंकि मैं कुछ सामग्री है जो गतिशील रूप से उत्पन्न हुई थी के लिए इनरहेटलएम की जांच कर रहा था - अर्थात एक नियंत्रण जो कि रनैट = सर्वर है।

इसे हल करने के लिए मुझे अपने तरीके पर "स्थैतिक" कीवर्ड को हटाना पड़ा, और यह ठीक चला।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.