试图通过接口和委托从另一个线程更新我的标签。在调试模式下,它说标签属性设置为消息。但我在表格本身看不到任何东西。
在 .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
类处理接口的方式导致了问题。但我无法弄清楚为什么或究竟是什么。