尝试通过接口和委托从另一个线程更新我的标签。在调试模式下,它表示label属性设置为消息。但我在表格本身看不到任何东西。
在.NET 4.0中工作
我正在使用的一个小代表:
我的界面:
public interface IMessageListener
{
void SetMessage(string message);
}
我实施它的表单:
public partial class Form1 : Form, IMessageListener
{
...
public void SetMessage(string message)
{
SetControlPropertyValue(ColoLbl, "Text", message);
}
delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
private void SetControlPropertyValue(Control oControl, string propName, object propValue)
{
if (oControl.InvokeRequired)
{
SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
oControl.Invoke(d, new object[] { oControl, propName, propValue });
}
else
{
Type t = oControl.GetType();
PropertyInfo[] props = t.GetProperties();
foreach (PropertyInfo p in props.Where(p => p.Name.ToUpper() == propName.ToUpper()))
{
p.SetValue(oControl, propValue, null);
}
}
}
}
我尝试通过界面设置消息的类。这个类是从另一个线程运行的:
public class Controller
{
IMessageListener iMessageListener = new Form1();
...
public void doWork()
{
iMessageListener.SetMessage("Show my message");
}
}
代码编译得很好,在调试时,标签的属性确实设置了,它只是因为某些原因而没有在表单上显示。
我怀疑它是在某个地方错过了一行,或者是Controller
类处理导致问题的界面的方式。但我无法弄清楚为什么或究竟是什么。
答案 0 :(得分:1)
当您在代码中调用Text
时,ColoLbl
的{{1}}属性在先前加载的Form1
中不会发生变化,因为iMessageListener.SetMessage("Show my message");
已初始化为新 iMessageListener
。 它可能只会在创建的新实例中发生变化。
Form1();
如果您尝试更改之前初始化的IMessageListener iMessageListener = new Form1();
中的ColoLbl
值,请不要初始化Form1
的新实例。相反,请初始化Form1
,该IMessageListener
链接到之前创建的Form1
。
示例强>
//myFormSettings.cs
class myFormSettings
{
public static Form1 myForm1; //We will use this to save the Form we want to apply changes to
}
//Form1.cs
private void Form1_Load(object sender, EventArgs e)
{
myFormSettings.myForm1 = this; //Set myForm1(the form we will control later) to this
Form2 X = new Form2(); //Initialize a new instance of Form2 as X which we will use to control this form from
X.Show(); //Show X
}
//Form2.cs
IMessageListener iMessageListener = myFormSettings.myForm1;
iMessageListener.SetMessage("Show my message");
谢谢, 我希望你觉得这很有帮助:)