Подумай:
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
.
Як я зрозумів, ви передаєте нульове значення в текстове поле і повертаєте його в ToString()
, оскільки це статичний метод. Ви можете замінити його на Convert.ToString()
, який може дозволити передачу нульового значення.