C#:如何从另一个类更改form1中标签的文本?

C#:如何从另一个类更改form1中标签的文本?,c#,visual-studio-2008,C#,Visual Studio 2008,我正试图从类中更改标签的文本,但未成功 我所拥有的是,我正在使用get{}和set{}更新类中的一个变量。我知道我需要在集合{}中放置或执行一些操作,以使它将更新值从类发送回form1类,以便它可以更新标签 有人能告诉我如何才能做到这一点吗?或者,如果有一种方法可以从类内部更新标签,那就更好了 我希望这是有意义的,并提前表示感谢。如果我理解你的问题,你有一个表单类,“form1”。正在显示该类的实例。那张表格上有标签。您正在另一个类中运行一个方法。您希望该方法更新form1上的标签 如果这是正确

我正试图从类中更改标签的文本,但未成功

我所拥有的是,我正在使用get{}和set{}更新类中的一个变量。我知道我需要在集合{}中放置或执行一些操作,以使它将更新值从类发送回form1类,以便它可以更新标签

有人能告诉我如何才能做到这一点吗?或者,如果有一种方法可以从类内部更新标签,那就更好了


我希望这是有意义的,并提前表示感谢。

如果我理解你的问题,你有一个表单类,“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; }
  }
  // ...
}
您可以轻松地在任何其他形式或代码中使用它(除非它在另一个线程中)


更新 如果您想使用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);
  }
}
公共类EULAEventArgs:EventArgs
{
公共字符串签名{get;set;}
}
公共类表格B:表格
{
公共事件事件处理程序EULAAccepted;
受保护的虚拟空间(EULAEventArgs e)
{
如果(EULAAccepted!=null)
EULA接受(本,e);
}
公共无效按钮1\u已单击(…)
{
已接受(新的EULAEventArgs{Signature=“…”});
}
}
公开课表格:表格
{
公开形式()
{
// ...
formB.EULAAccepted+=EULAAccepted;
}
私有无效EULAAccepted(对象发送方,EULAEventArgs e)
{
this.label1.Text=String.Format(“感谢{0}接受EULA。”,
e、 签名);
}
}

我不确定我是否理解你的问题,但我会尽力给出答案。可以为包装Label.Text属性的表单类提供公共属性。然后可以从代码中的任何其他位置(包括其他类)使用此属性


这回答了你的问题吗?如果不是,这可能是因为我不理解你的问题,请编辑和更具体。

你可能想考虑使用委托或事件,并让你的类将事件提升到表单,这样你的类将不知道你的表单。

示例

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;
    }
}

正在更新变量的集合{},然后表单与表单在同一线程中运行吗?如果是这样,那么您可以按照John Saunders所说的做,但是如果您需要从不同的线程更新表单上标签的文本属性,那么您需要从set方法调用类似这样的操作:

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

+答案是1。但是,难道OtherMethodCheck调用不需要安全吗?谁也不知道其他类是否会脱离UI线程。因为OP是初学者,我想我最好不要在答案中加入线程。
theForm.TheLabel.Invoke(theForm.DelegateThatUpdatesLabel("New Text!"));