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

কেন এই ত্রুটি ঘটছে?

ননস্ট্যাটিক ক্ষেত্র, পদ্ধতি বা সম্পত্তি 'উইন্ডোজ অ্যাপ্লিকেশন 1.ফর্ম 1.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);
    }

এই ত্রুটি সম্পর্কে আরও তথ্য এমএসডিএন-তে পাওয়া যাবে ।


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) এবং তাই স্থিতিযুক্ত করা যায় না।
ডিবিসি

2

আমার জন্য কী কাজ শেষ হয়েছিল তা সম্পর্কে আমাকে টিপ দেওয়ার জন্য কৃতিত্ব @ COOLGameTUBE। তাঁর ধারণাটি ভাল ছিল তবে ফর্মটি তৈরি হওয়ার পরে অ্যাপ্লিকেশন.সেট কমপ্যাটিভেক্সটরেেন্ডারিং ডিফল্ট কল করা হলে আমার একটি সমস্যা হয়েছিল। সুতরাং সামান্য পরিবর্তন সহ, এটি আমার পক্ষে কাজ করছে:


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

আমি আসলে এই ত্রুটিটি পেয়েছি কারণ আমি গতিশীলভাবে উত্পন্ন কিছু সামগ্রীর জন্য ইনারএইচটিএমএল পরীক্ষা করছিলাম - যেমন একটি নিয়ন্ত্রণ যা রানাত = সার্ভার।

এটি সমাধান করার জন্য আমাকে আমার পদ্ধতির "স্থিতিশীল" কীওয়ার্ডটি সরিয়ে ফেলতে হয়েছিল, এবং এটি ঠিক আছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.