C# CS0120:非静态字段、方法或属性需要对象引用';foo';
考虑:C# CS0120:非静态字段、方法或属性需要对象引用';foo';,c#,C#,考虑: namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //int[
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)”需要对象引用
看起来您正在从静态方法(特别是
SumData
)调用非静态成员(属性或方法,特别是setTextboxText
)。您需要:
static void setTextboxText(int result)
{
// Write static logic for setTextboxText.
// This may require a static singleton instance of Form1.
}
Form1
的实例:
私有静态数据(对象状态)
{
int结果=0;
//int[]icount=(int[])状态;
int icount=(int)状态;
对于(int i=i计数;i>0;i--)
{
结果+=i;
系统线程线程睡眠(1000);
}
Form1 frm1=新Form1();
frm1.setTextboxText(结果);
}
传入Form1
的实例也是一个选项Form1
):
可以找到有关此错误的详细信息。您启动了一个运行静态方法
SumData
的线程。但是,SumData
调用的SetTextboxText
不是静态的。因此,您需要表单的一个实例来调用SetTextboxText
,从我看来,您给文本框一个空值,然后返回ToString()
,因为它是一个静态方法。您可以将其替换为可以启用空值的Convert.ToString()
。您的方法必须是静态的
static void setTextboxText(int result)
{
if (this.InvokeRequired)
{
this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result });
}
else
{
SetTextboxTextSafe(result);
}
}
对于这种情况,如果您想要获得表单的控件,并且收到了这个错误,那么我为您提供了一个小旁路 转到Program.cs并更改
Application.Run(new Form1());
到
现在,您可以使用访问控件
Program.form1.<Your control>
Program.form1。
另外:不要忘记将您的控制访问级别设置为Public
是的,我知道,这个答案不适合打电话的人,但它适合那些在控制方面有特殊问题的谷歌用户。感谢@COOLGAMETUBE向我透露了最终对我有用的东西。他的想法很好,但在创建表单后调用Application.SetCompatibleTextRenderingDefault时,我遇到了一个问题。因此,只要稍作改变,这对我来说是可行的:
静态类程序
{
public static Form1 Form1;//=new Form1();//将此变量放在构造函数之外
///
///应用程序的主要入口点。
///
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(form1=newform1());
}
}
我实际上遇到了这个错误,因为我正在检查InnerHtml中动态生成的一些内容,即runat=server的控件
为了解决这个问题,我必须删除我方法中的“static”关键字,它运行良好。您的问题的本质和解决方案是:
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)
}
}
}
使用系统;
名称空间myNameSpace
{
班级计划
{
私有无效方法()
{
控制台。WriteLine(“你好,世界!”);
}
静态void Main(字符串[]参数)
{
method();//这个答案似乎再次说明了问题。它没有解释为什么会产生错误。@Robert,其他答案也没有。……这个注释是无意义的。这个特定的方法显式地访问实例属性(特别是This.invokererequired
和This.Invoke
),因此不能成为静态的。
Program.form1.<Your control>
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());
}
}
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)
}
}
}