簡體   English   中英

C#:如何在另一個類中更改form1中的標簽文本?

[英]C#: How can i change the text of a label thats in form1 from another class?

我試圖從一個類改變標簽的文本,但一直沒有成功。

我所擁有的是使用get {}和set {}更新類中的變量。 我知道我需要在set {}中放置或執行某些操作,以便將更新值從類發送回form1類,以便它可以更新標簽。

誰能告訴我怎么能做到這一點? 或者如果有辦法在課堂上更新標簽,那就更好了。

我希望這是有意義的,並提前感謝。

您可能需要考慮使用委托或事件,並讓您的類將事件提升回表單,這樣您的類就不會知道您的表單。

class SomeClass
{
    public delegate void UpdateLabel(string value);

    public event UpdateLabel OnLabelUpdate;

    public void Process()
    {
        if (OnLabelUpdate != null)
        {
            OnLabelUpdate("hello");
        }
    }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void UpdateLabelButton_Click(object sender, EventArgs e)
    {
        SomeClass updater = new SomeClass();
        updater.OnLabelUpdate += new SomeClass.UpdateLabel(updater_OnLabelUpdate);
        updater.Process();
    }

    void updater_OnLabelUpdate(string value)
    {
        this.LabelToUpdateLabel.Text = value;
    }
}

如果我理解你的問題,你就有一個表單類“form1”。 正在顯示該類的實例。 那個表格上面有一個標簽。 您正在另一個類中運行方法。 您希望該方法更新form1上的標簽。

如果這是正確的,那么,這就像方法需要更改另一個類實例的屬性的任何其他情況一樣。 另一個類中的方法需要對表單實例的引用。 當您調用方法時,而不是這樣做:

OtherClass oc = new OtherClass();
oc.OtherMethod();

做這個:

OtherClass oc = new OtherClass();
oc.OtherMethod(this);

更改Othermethod的定義:

public void Othermethod(form1 theForm) {
    theForm.TheLabel.Text = "New Text!";
}

那一切都應該開心!

既然你沒有發布你的代碼,我不知道為什么它不起作用。 但你想要的很容易。

public class FormA : Form
{
  // ...

  public string Label1Value
  {
    get { return this.label1.Text; }
    set { this.label1.Text = value; }
  }
  // ...
}

並且您可以輕松地以任何其他形式或代碼使用它(除非它在另一個線程中。)

public class FormB : Form
{
  private void Button1_Click(object sender, MouseEventArgs e)
  {
    formA.Label1Value = "FormB was clicked";
  }
}

更新

如果你想使用像Davide建議的事件,你可以做這樣的事情。

public class EULAEventArgs : EventArgs
{
  public string Signature { get; set; }
}

public class FormB : Form
{
  public event EventHandler<EULAEventArgs> EULAAccepted;
  protected virtual void OnEULAAccepted(EULAEventArgs e)
  {
    if (EULAAccepted != null)
      EULAAccepted(this, e);
  }

  public void Button1_Clicked(...)
  {
    OnEULAAccepted(new EULAEventArgs { Signature = "..." });
  }
}

public class FormA : Form
{
  public FormA()
  {
    // ...
    formB.EULAAccepted += EULAAccepted;
  }

  private void EULAAccepted(object sender, EULAEventArgs e)
  {
    this.label1.Text = String.Format("Thank you {0} for accepting the EULA.",
                                              e.Signature);
  }
}

我不確定我理解你的問題,但我會盡力給出答案。 您可以為包含Label.Text屬性的Form類提供公共屬性。 然后,您可以在代碼中的任何其他位置使用此屬性,包括其他類。

這回答了你的問題嗎? 如果不是這可能是因為我不理解您的問題,請編輯並更具體。

是{}更新變量,然后表單在與表單相同的線程中運行? 如果是這樣,那么你可以做John Saunders所說的,但是如果你需要從另一個線程更新表單上標簽的Text屬性,那么你需要從set方法調用類似的東西:

theForm.TheLabel.Invoke(theForm.DelegateThatUpdatesLabel("New Text!"));

暫無
暫無

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

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