簡體   English   中英

更改靜態無效C#中的標簽文本

[英]Change label text in Static void C#

我想在按下按鈕時將一種形式的標簽文本更改為另一種形式的按鈕文本。

為此,我在標簽所在的表單上創建了此標簽

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

該代碼在帶有按鈕的表單上

mainForm.changeText(this.Text);

然后給出錯誤: 非靜態字段,方法或屬性需要對象引用。

這似乎是一個愚蠢的問題,但是我對C#還是陌生的,所以請幫助我。

關於靜態和非靜態成員

類型成員有兩種:非靜態成員和靜態成員。 非靜態成員也稱為實例成員,因為它們出現在類型的對象實例中。 靜態成員綁定到類型本身,而不是對象實例,因此您可以在不實際實例化類型的情況下使用它們。

考慮以下:

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 Forms應用程序,您仍然可以使用Application.OpenForms 這將返回一個只讀集合,其中包含應用程序的所有當前打開的表單。 您可以使用它來查找要更改的表單的對象實例,然后執行該更改。

請注意,如果是多線程情況(即,靜態方法在不同於GUI線程的線程中運行),則必須使用某種同步機制,例如InvokeRequiredInvoke()

您不想為此使用靜態方法,因為L1是mainForm類的成員。

L1不是靜態的,因此您不能具有與之交互的靜態函數。 有了靜態變量,您就可以編寫MainForm.changeText(...)類的東西,但是在這種情況下,L1是什么? 我想我們可以說:

  1. 您不需要更改標簽文本的功能,屬性Text已被寫入
  2. 如果需要一些邏輯來處理tet,則可以:

考慮一下您所需的功能是否如此通用,可以在您的應用程序中應用於許多標簽,在這種情況下,擴展方法會很好。 在其他情況下,如果希望主窗體中的函數將文本設置在某個地方,並且此位置可以更改,或者文本需要進行一些修飾,則成員函數會很好,而DataBinding可能會更好。

該錯誤表示您的靜態函數正在訪問非靜態變量(控件L1)。

靜態函數只能訪問靜態變量。 您可以將L1更改為靜態變量以使其起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM