-1

试图通过接口和委托从另一个线程更新我的标签。在调试模式下,它说标签属性设置为消息。但我在表格本身看不到任何东西。

在 .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类处理接口的方式导致了问题。但我无法弄清楚为什么或究竟是什么。

4

1 回答 1

1

当您在代码中调用时,之前加载的Text属性ColoLbl不会更改,因为已初始化为的. 它可能只在创建的新实例中发生变化Form1iMessageListener.SetMessage("Show my message");iMessageListener Form1();

IMessageListener iMessageListener = new Form1();

如果您尝试更改之前初始化的ColoLblForm1,请不要初始化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");

谢谢,
我希望你觉得这有帮助:)

于 2012-12-17T10:31:30.877 回答