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

时间:2009-04-11 22:28:50

标签: c# visual-studio-2008

我试图从一个类中更改标签的文本但是没有成功。

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

谁能告诉我怎么能做到这一点?或者如果有办法在课堂上更新标签,那就更好了。

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

5 个答案:

答案 0 :(得分:3)

您可能需要考虑使用委托或事件,并让您的课程将事件提升回表单,这样您的课程就不会知道您的表单。

示例

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

答案 1 :(得分:1)

如果我理解你的问题,你就有一个表单类“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!";
}

然后一切都应该开心!

答案 2 :(得分:1)

由于你还没有发布你的代码,我不知道为什么它不起作用。但你想要的很容易。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

是否正在更新变量的集合{},然后表单在与表单相同的线程中运行?如果是这样,那么你可以做John Saunders所说的,但如果你需要从另一个线程更新表单上标签的Text属性,那么你需要从set方法调用类似的东西:

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