【问题标题】:Change label text in Static void C#在静态 void C# 中更改标签文本
【发布时间】:2011-07-14 00:00:34
【问题描述】:

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

为此,我在标签所在的表单上创建了这个

public static void changeText(string text)
{
     L1.text = text;
}

此代码在带有按钮的表单上

mainForm.changeText(this.Text);

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

这似乎是一个愚蠢的问题,但我还是 C# 的新手,所以请帮助我。

【问题讨论】:

标签: c# text static label void


【解决方案1】:

关于静态和非静态成员

有两种类型的成员:非静态和静态。非静态成员也称为实例成员,因为它们出现在该类型的对象实例中。静态成员绑定到类型本身,而不是它的对象实例,因此您可以在不实际实例化类型的情况下使用它们。

考虑以下几点:

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 和 @987654323 @。

【讨论】:

    【解决方案2】:

    L1 不是静态的,所以你不能有一个静态函数与之交互。拥有一个 static 可以让您编写类似MainForm.changeText(...) 的东西,但在这种情况下,L1 是什么? 我想我们可以说:

    1. 你不需要一个函数来改变标签文本,属性Text已经写好了
    2. 如果需要一些逻辑来破坏 tet,然后您可以:

    考虑您需要的功能是否如此通用,以至于可以应用于您的应用程序中的许多标签,在这种情况下an extension method 会很好。在其他情况下,如果您希望主窗体中的函数在某处设置文本,并且该位置可以更改,或者文本需要一些修饰,则 member 函数会很好,并且可能是@987654322 @会更好。

    【讨论】:

    • 你能给我一个例子来说明如何做到这一点,我还是很新。
    • 把changeText中的“static”去掉,就变成了普通的成员函数
    • 对不起,但这听起来可能很愚蠢,如果它不是静态的,我不完全确定如何从其他表单访问它。请给我一个代码示例,我将不胜感激。
    • 先将函数设为public,然后需要在另一个中引用mainform,然后调用mainForm.changeText
    • 谢谢你,非常感谢你的帮助!
    【解决方案3】:

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

    【讨论】:

    • 如果它不是静态的,我将如何从其他表单访问 void
    • 您可以将表单的引用传递给您正在调用该方法的类。
    【解决方案4】:

    该错误表示您的静态函数正在访问非静态变量(控件 L1)。

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

    【讨论】:

    • 最好使函数非静态。
    • 视情况而定,不使用静态并不总是“更好”。我刚刚解释了静态函数的工作原理。
    • 为什么要引用静态表单上的控件?
    • 叹息...这家伙是一个初学者,甚至不知道静态是如何工作的。也许你认为我会建议他使用委托功能,先生。专家?它被称为逐步学习。本次聊天结束。
    • 好的@ngduc,但你建议一个错误的做法,所以编辑答案:)
    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多