[C#] CS0120 : 비 정적 필드, 메서드 또는 속성 ‘foo’에 개체 참조가 필요합니다.

치다:

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)에 개체 참조가 필요합니다.



답변

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 에서 찾을 수 있습니다 .


답변

정적 메소드를 실행하는 스레드를 시작합니다 SumData. 그러나 정적이 아닌 SumData호출 SetTextboxText. 따라서 호출하려면 폼의 인스턴스가 필요합니다 SetTextboxText.


답변

이 경우 양식의 Control을 얻고이 오류가 발생하면 약간의 우회가 있습니다.

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>

또한 Control-Access-Level을 Public으로 설정하는 것을 잊지 마십시오.

그리고 네,이 답변은 질문 발신자에게는 적합하지 않지만 통제와 관련 하여이 특정 문제가있는 Google 직원에게는 적합합니다.


답변

메소드는 정적이어야합니다

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


답변

나를 위해 일한 결과를 알려준 @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()); } }


답변

내 생각에 텍스트 상자에 null 값을주고 ToString()정적 메서드이므로 a를 반환 합니다. Convert.ToString()널값을 사용 가능하게하는 것으로 바꿀 수 있습니다 .


답변

동적으로 생성 된 일부 내용 (예 : runat = server 인 컨트롤)에 대해 InnerHtml을 확인했기 때문에 실제로이 오류가 발생했습니다.

이 문제를 해결하려면 메서드에서 “정적”키워드를 제거해야했고 정상적으로 실행되었습니다.