当我按下按钮时,我想将一个表单上的标签文本更改为另一个表单上的按钮文本。
为此,我在标签为
的表单上创建了这个public static void changeText(string text)
{
L1.text = text;
}
此代码位于带有按钮
的表单上mainForm.changeText(this.Text);
然后给出错误:非静态字段,方法或属性需要对象引用...
这可能看起来像是一个愚蠢的问题,但我仍然是C#的新手,所以请帮助我。
答案 0 :(得分:4)
有两种类型的成员:非静态和静态。非静态成员也称为实例成员,因为它们出现在该类型的对象实例中。静态成员绑定到类型本身,而不是其对象实例,因此您可以在不实际实例化类型的情况下使用它们。
请考虑以下事项:
class MyClass
{
// static member: can NOT reference 'this', as it is not in the context of an object instance of the type
public static bool IsTrue()
{
return true;
}
// constructor: this runs whenever the type is instantiated
public MyClass()
{
}
// instance member: can access to 'this', which references the context object instance of the type
public int GetNumber()
{
return 42;
}
}
您可以使用以下类型:
if(MyClass.IsTrue()) // static call
{
var myObject = new MyClass(); // constructor call
int result = myObject.GetNumber(); // instance member call
Console.WriteLine(result);
}
如果您完全确定在静态方法中需要该逻辑,则需要获取要更改的表单的对象实例。 不幸的是,单身人士不能很好地工作,因为VS设计师需要创建你的Form的对象实例,这显然违反了单例模式。
您仍然可以使用的是(如果是Windows窗体应用程序):Application.OpenForms。这将返回一个只读集合,其中包含应用程序的所有当前打开的表单。您可以使用它来查找要更改的表单的对象实例,然后执行该更改。
请注意,如果这是多线程情况(即静态方法在与GUI线程不同的线程中运行),则必须使用某种同步机制,例如InvokeRequired和Invoke()
答案 1 :(得分:2)
您不希望为此使用静态方法,因为L1是mainForm类的成员。
答案 2 :(得分:2)
L1不是静态的,所以你不能让静态函数与它交互。有一个静态让你能够写出像MainForm.changeText(...)
这样的东西,但在这种情况下什么是L1?
我想我们可以说:
考虑一下您所需的功能是否如此通用,可以应用于您应用中的多个标签,在这种情况下an extension method会很好。在其他情况下,如果您希望主窗体中的函数在某处设置文本,并且此位置可以更改,或者文本需要一些修改,成员函数将是好的,可能是{{ 3}}会更好。
答案 3 :(得分:0)
错误意味着您的静态函数正在访问非静态变量(控件L1)。
静态函数只能访问静态变量。您可以将L1更改为静态变量以使其正常工作。