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)에 개체 참조가 필요합니다.
정적 메소드에서 비 정적 속성을 호출하는 것 같습니다. 속성을 정적으로 만들거나 Form1 인스턴스를 만들어야합니다.
static 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);
}
Form1 frm1 = new Form1();
frm1.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을 확인했기 때문에 실제로이 오류가 발생했습니다.
이 문제를 해결하려면 메서드에서 "정적"키워드를 제거해야했고 정상적으로 실행되었습니다.
'IT story' 카테고리의 다른 글
객체 지향 프로젝트를 어떻게 디자인합니까? (0) | 2020.04.17 |
---|---|
(lambda) 함수 클로저는 무엇을 캡처합니까? (0) | 2020.04.17 |
Collections.emptyList () 대 새 인스턴스 (0) | 2020.04.17 |
Twitter Bootstrap 3의 IE8 문제 (0) | 2020.04.17 |
jquery Ajax 웹 서비스에 JSON 게시 (0) | 2020.04.17 |