在静态void C#中更改标签文本

时间:2011-03-12 09:54:11

标签: c# text static label void

当我按下按钮时,我想将一个表单上的标签文本更改为另一个表单上的按钮文本。

为此,我在标签为

的表单上创建了这个
public static void changeText(string text)
{
     L1.text = text;
}

此代码位于带有按钮

的表单上
mainForm.changeText(this.Text);

然后给出错误:非静态字段,方法或属性需要对象引用...

这可能看起来像是一个愚蠢的问题,但我仍然是C#的新手,所以请帮助我。

4 个答案:

答案 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线程不同的线程中运行),则必须使用某种同步机制,例如InvokeRequiredInvoke()

答案 1 :(得分:2)

您不希望为此使用静态方法,因为L1是mainForm类的成员。

答案 2 :(得分:2)

L1不是静态的,所以你不能让静态函数与它交互。有一个静态让你能够写出像MainForm.changeText(...)这样的东西,但在这种情况下什么是L1? 我想我们可以说:

  1. 您不需要更改标签文本的功能,属性Text已经写入
  2. 如果需要一些逻辑来破坏tet,你可以:
  3. 考虑一下您所需的功能是否如此通用,可以应用于您应用中的多个标签,在这种情况下an extension method会很好。在其他情况下,如果您希望主窗体中的函数在某处设置文本,并且此位置可以更改,或者文本需要一些修改,成员函数将是好的,可能是{{ 3}}会更好。

答案 3 :(得分:0)

错误意味着您的静态函数正在访问非静态变量(控件L1)。

静态函数只能访问静态变量。您可以将L1更改为静态变量以使其正常工作。