考虑:
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)
需要对象引用
答案 0 :(得分:320)
看起来您正在从静态方法调用非静态属性。您需要将属性设置为static,或者创建Form1的实例。
static void SetTextboxTextSafe(int result)
{
label1.Text = result.ToString();
}
OR
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);
}
有关此错误的详细信息,请访问on MSDN。
答案 1 :(得分:19)
启动一个运行静态方法SumData
的线程。但是,SumData
调用SetTextboxText
并非静态。因此,您需要一个表单实例来调用SetTextboxText
。
答案 2 :(得分:10)
对于这种情况,如果你想获得一个表格的控制并且收到这个错误,那么我有一点绕道。
转到Program.cs并更改
Application.Run(new Form1());
到
public static Form1 form1 = new Form1(); // Place this var out of the constructor
Application.Run(form1);
现在您可以使用
访问控件了Program.form1.<Your control>
另外:不要忘记将您的控制访问级别设置为公开。
是的,我知道,这个答案不适合问候者,但它适合那些控件存在此特定问题的google。
答案 3 :(得分:6)
您的方法必须是静态的
static void setTextboxText(int result)
{
if (this.InvokeRequired)
{
this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result });
}
else
{
SetTextboxTextSafe(result);
}
}
答案 4 :(得分:1)
从我看来,你给文本框一个空值并返回ToString()
,因为它是一个静态方法。您可以将其替换为可以启用空值的Convert.ToString()
。
答案 5 :(得分:1)
向@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());
}
}
答案 6 :(得分:1)
我实际上收到了此错误,因为我正在检查InnerHtml中是否动态生成了某些内容,即runat = server的控件。
要解决此问题,我必须在方法上删除“ static”关键字,并且运行良好。
答案 7 :(得分:0)
问题的本质和解决方案是:
using System;
namespace myNameSpace
{
class Program
{
private void method()
{
Console.WriteLine("Hello World!");
}
static void Main(string[] args)
{
method();//<-- Compile Time error because an instantiation of the Program class doesnt exist
Program p = new Program();
p.method();//Now it works. (You could also make method() static to get it to work)
}
}
}