Рассмотрим:
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
вам нужен экземпляр вашей формы.
Для этого случая, где вы хотите, чтобы получить контроль формы, и получаете эту ошибку, то я немного байпас для вас.
Перейти к вашей программе.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);
}
}
Кредит на @COOLGAMETUBE за подсказку, что в конечном итоге работает для меня. Его идея была хорошей, но у меня была проблема, когда приложение.SetCompatibleTextRenderingDefault был вызван после того, как форма уже была создана. Так что с небольшими изменениями, это работает для меня:
в <предварительно><код> статический класс Program { публичный статический форму form1 форма form1; // = новые формы form1(); // поместить этот вар из конструктора
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(form1 = new Form1());
}
}
Насколько я понимаю, вы даете нулевое значение текстовому полю и возвращаете его в ToString()
, поскольку это статический метод. Вы можете заменить его на Convert.ToString()
, который может включить нулевое значение.
Я на самом деле получил эту ошибку, потому что я проверял innerHTML для некоторых контент, который был динамически сгенерирован, т. е. управления, атрибут runat=сервер.
Чтобы решить это, я должен был удалить в "статический" с сайта на мой метод, и он побежал штрафа.