考虑:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么会出现此错误?
非静态字段,方法或属性'WindowsApplication1.Form1.setTextboxText(int)需要对象引用
小智 355
看起来您正在从静态方法调用非静态属性.您需要将属性设置为静态,或者创建Form1的实例.
static void SetTextboxTextSafe(int result)
{
label1.Text = result.ToString();
}
Run Code Online (Sandbox Code Playgroud)
要么
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);
}
Run Code Online (Sandbox Code Playgroud)
有关此错误的更多信息可以在MSDN上找到.
Bri*_*sen 19
您启动一个运行静态方法的线程SumData
.但是,SumData
呼叫SetTextboxText
不是静态的.因此,您需要一个表单实例来调用SetTextboxText
.
COO*_*UBE 11
在这种情况下,如果您希望获得表单控件并且收到此错误,那么我有一点绕道.
转到Program.cs并进行更改
Application.Run(new Form1());
Run Code Online (Sandbox Code Playgroud)
至
public static Form1 form1 = new Form1(); // Place this var out of the constructor
Application.Run(form1);
Run Code Online (Sandbox Code Playgroud)
现在您可以访问控件了
Program.form1.<Your control>
Run Code Online (Sandbox Code Playgroud)
另外:不要忘记将Control-Access-Level设置为Public.
是的,我知道,这个答案不适合调用者的问题,但它适合具有控件的这个特定问题的googlers.
小智 7
你的方法必须是静态的
static void setTextboxText(int result)
{
if (this.InvokeRequired)
{
this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result });
}
else
{
SetTextboxTextSafe(result);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
感谢@COOLGAMETUBE 向我透露了最终对我有用的方法。他的想法很好,但是当在创建表单后调用 Application.SetCompatibleTextRenderingDefault 时,我遇到了问题。因此,经过一点改变,这对我有用:
static class Program
{
public static Form1 form1; // = new Form1(); // Place this var out of the constructor
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(form1 = new Form1());
}
}
Run Code Online (Sandbox Code Playgroud)