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.Форма 1.setTextboxText (int)
6 ответов:
похоже, что вы вызываете не статическое свойство статического метода. Вам нужно будет либо сделать свойство статическим, либо создать экземпляр 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.
для этого случая, когда вы хотите получить контроль над формой и получаете эту ошибку, то у меня есть небольшой обход для вас.
перейдите в свою программу.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>кроме того: не забудьте установить уровень управления доступом к общественности.
и да, я знаю, этот ответ не подходит для вызывающего вопроса, но он подходит для гуглеров, у которых есть этот конкретный проблема с элементами управления.
ваш метод должен быть статическим
static void setTextboxText(int result) { if (this.InvokeRequired) { this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); } else { SetTextboxTextSafe(result); } }
от моего взгляда вы даете нулевое значение текстовому полю и возвращаете в
ToString()Как это статический метод. Вы можете заменить его наConvert.ToString()что может разрешить значение null.
кредит @COOLGAMETUBE за то, что он подсказал мне, что в конечном итоге работает на меня. Его идея была хороша, но у меня была проблема, когда приложение.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()); } }
Comments