考慮する:
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
setTextboxText
静的メソッド (具体的には ) から非静的メンバー (具体的にはプロパティまたはメソッド ) を呼び出しているようですSumData
。次のいずれかを行う必要があります。
- 可能であれば、
setTextboxText
静的にします。
static void setTextboxText(int result)
ただし、この場合、setTextboxText はインスタンス変数へのアクセスを必要とするため、静的にすることはできません。
代わりに、次のようにします。
setTextboxText
Form1 の静的シングルトン経由で呼び出します。
class Form1
{
public static Form1 It; // Singleton.
public Form1()
{
It = this;
}
private static void SumData(object state)
{
...
It.setTextboxText(result);
}
}
Form1
呼び出しメソッド内でのインスタンスを作成します。private static void SumData(object state) { int result = 0; //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); }
ただし、Form1 のインスタンスが既に存在する場合、これは必要な動作を行いません。
のインスタンスを渡すことForm1
もオプションになります。呼び出しメソッドを非静的インスタンスメソッド(
Form1
)にします。private void SumData(object state) { int result = 0; //int[] icount = (int[])state; int icount = (int)state; for (int i = icount; i > 0; i--) { result += i; System.Threading.Thread.Sleep(1000); } setTextboxText(result); }
このエラーに関する詳細情報はMSDNで。