我试图从一个类中更改标签的文本但是没有成功。
我所拥有的是使用get {}和set {}更新类中的变量。我知道我需要在set {}中放置或执行某些操作,以便将更新值从类发送回form1类,以便它可以更新标签。
谁能告诉我怎么能做到这一点?或者如果有办法在课堂上更新标签,那就更好了。
我希望这是有意义的,并提前感谢。
答案 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!"));