考虑:
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)需要对象引用
小智.. 355
看起来您正在从静态方法调用非静态属性.您需要将属性设置为静态,或者创建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上找到.
看起来您正在从静态方法调用非静态属性.您需要将属性设置为静态,或者创建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
.
在这种情况下,如果您希望获得表单控件并且收到此错误,那么我有一点绕道.
转到Program.cs并进行更改
Application.Run(new Form1());
至
public static Form1 form1 = new Form1(); // Place this var out of the constructor Application.Run(form1);
现在您可以访问控件了
Program.form1.
另外:不要忘记将Control-Access-Level设置为Public.
是的,我知道,这个答案不适合调用者的问题,但它适合具有控件的这个特定问题的googlers.
你的方法必须是静态的
static void setTextboxText(int result) { if (this.InvokeRequired) { this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); } else { SetTextboxTextSafe(result); } }