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)
Ответы
Ответ 1
Похоже, вы вызываете нестационарное свойство из статического метода. Вам нужно либо сделать свойство static, либо создать экземпляр 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.
Ответ 2
Вы запускаете поток, который запускает статический метод SumData
. Однако SumData
вызывает SetTextboxText
, который не является статичным. Таким образом, вам нужен экземпляр вашей формы для вызова SetTextboxText
.
Ответ 3
В этом случае, когда вы хотите получить элемент управления формы и получаете эту ошибку, у меня есть небольшой обход для вас.
Перейдите в свою 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>
Также: не забудьте установить свой уровень доступа на уровне управления.
И да, я знаю, этот ответ не подходит для вызывающего вопроса, но он подходит для гуглеров, у которых есть эта проблема с элементами управления.
Ответ 4
Ваш метод должен быть статическим
static void setTextboxText(int result)
{
if (this.InvokeRequired)
{
this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result });
}
else
{
SetTextboxTextSafe(result);
}
}
Ответ 5
Приобретите @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());
}
}
Ответ 6
Из моего поиска вы даете пустое значение в текстовое поле и возвращаете его в ToString()
, так как это статический метод. Вы можете заменить его на Convert.ToString()
, который может включить нулевое значение.
Ответ 7
Я действительно получил эту ошибку, потому что я проверял InnerHtml для некоторого контента, который был сгенерирован динамически - то есть элемент управления, который является runat = server.
Чтобы решить эту проблему, мне пришлось удалить ключевое слово "static" в моем методе, и он работал нормально.