[英]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.