Zvážte:
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();
}
}
}
Prečo dochádza k tejto chybe?
Pre nestatické pole, metódu alebo vlastnosť je potrebný odkaz na objekt 'WindowsApplication1.Form1.setTextboxText(int)
Vyzerá to, že voláte nestatickú vlastnosť zo statickej metódy. Budete musieť buď vytvoriť statickú vlastnosť, alebo vytvoriť inštanciu Form1.
static void SetTextboxTextSafe(int result)
{
label1.Text = result.ToString();
}
ALEBO
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);
}
Viac informácií o tejto chybe nájdete na MSDN.
Podľa môjho pohľadu dáte textovému poľu nulovú hodnotu a vrátite ju v metóde ToString()
, pretože je to statická metóda. Môžete ju nahradiť metódou Convert.ToString()
, ktorá dokáže nulovú hodnotu povoliť.