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