CS0120: Tham chiếu đối tượng là bắt buộc đối với trường, phương thức hoặc thuộc tính 'foo'


274

Xem xét:

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

Tại sao lỗi này xảy ra?

Tham chiếu đối tượng là bắt buộc đối với trường, phương thức hoặc thuộc tính 'WindowsApplication1.Form1.setTextboxText (int)

Câu trả lời:


401

Có vẻ như bạn đang gọi một thành viên không tĩnh (một thuộc tính hoặc phương thức, cụ thể setTextboxText) từ một phương thức tĩnh (cụ thể SumData). Bạn sẽ cần một trong hai:

  1. Làm cho thành viên được gọi tĩnh cũng:

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
    
  2. Tạo một thể hiện Form1trong phương thức gọi:

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

    Vượt qua trong một ví dụ Form1cũng sẽ là một lựa chọn.

  3. Biến phương thức gọi thành phương thức không tĩnh (of 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);
    }

Thông tin thêm về lỗi này có thể được tìm thấy trên MSDN .


18

Bạn bắt đầu một luồng chạy phương thức tĩnh SumData. Tuy nhiên, SumDatacác cuộc gọi SetTextboxTextkhông tĩnh. Vì vậy, bạn cần một ví dụ của hình thức của bạn để gọi SetTextboxText.


13
Câu trả lời này xuất hiện để khôi phục lại vấn đề. Nó không giải thích tại sao điều này tạo ra một lỗi.
Robert

13

Trong trường hợp này, nơi bạn muốn nhận Kiểm soát Biểu mẫu và nhận được lỗi này, thì tôi có một cách bỏ qua cho bạn.

Chuyển đến Chương trình của bạn và thay đổi

Application.Run(new Form1());

đến

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

Bây giờ bạn có thể truy cập một điều khiển với

Program.form1.<Your control>

Ngoài ra: Đừng quên đặt Cấp độ kiểm soát truy cập của bạn thành Công khai.

Và vâng tôi biết, câu trả lời này không phù hợp với người gọi câu hỏi, nhưng nó phù hợp với những người làm việc có vấn đề cụ thể với các điều khiển.


6

Phương pháp của bạn phải tĩnh

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

Phương pháp cụ thể này truy cập rõ ràng các thuộc tính thể hiện (cụ thể this.InvokeRequiredthis.Invoke) và do đó không thể được thực hiện tĩnh.
dbc

2

Tín dụng cho @COOLGAMETUBE vì đã đưa tôi đến với những gì đã kết thúc với tôi. Ý tưởng của anh ấy rất tốt nhưng tôi gặp vấn đề khi Application.SetCompiverseTextRenderingDefault được gọi sau khi biểu mẫu đã được tạo. Vì vậy, với một chút thay đổi, điều này có hiệu quả với tôi:


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

Từ cái nhìn của tôi, bạn đưa ra một giá trị null cho một hộp văn bản và trả về ToString()vì nó là một phương thức tĩnh. Bạn có thể thay thế nó bằng Convert.ToString()giá trị null.


0

Tôi thực sự đã gặp lỗi này vì tôi đã kiểm tra InnerHtml cho một số nội dung được tạo động - tức là một điều khiển là runat = server.

Để giải quyết điều này, tôi đã phải loại bỏ từ khóa "tĩnh" trên phương thức của mình và nó chạy tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.