如何从静态方法访问控件?

tim*_*myg 6 .net c# winforms

我在C#.NET中有一个应用程序,它有一个MainForm和几个类.

其中一个类接收来自网络的传入数据消息.我需要将这些消息的文本附加到多行文本框中MainForm.

我可以MainForm通过使方法静态将消息发送到方法,但静态方法无法访问MainForm控件.

TheIncomingDataClass.cs

namespace TheApplicationName
{
     class TheIncomingDataClass
     {

     public void IncomingMessage(IncomingMessageType message)
     {
          TheApplicationName.MainForm.ReceiveMSG(message);
     }
Run Code Online (Sandbox Code Playgroud)

MainForm.cs

public static void ReceiveMSG(string message)
{
     txtDisplayMessages.AppendText(message); //This line causes compile error
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

非静态字段,方法或属性'TheApplicationName.MainForm.txtDisplayMessages'需要对象引用

Ann*_*ath 9

静态方法无法访问像txtDisplayMessages这样的成员,因为它不是该实例的一部分.我建议你做一些关于静态方法和诸如此类的概念的阅读,因为这是一个相当语言不可知的概念.最好通过删除静态修饰符来实现该方法,因为它不需要是静态的 - 它似乎需要由该对象的特定实例调用.


P D*_*ddy 7

为了继续你一直在做的方式,你的" TheIncomingDataClass"应该引用MainForm它应该与之对接的对象.当您创建此类的实例(可能来自实例方法MainForm)时,您将需要传入对此MainForm对象的引用.

class TheIncomingDataClass{
    MainForm form;

    public TheIncomingDataClass(MainForm form){
        this.form = form;
    }
}

class MainForm : Form{
    MainForm(){
        new TheIncomingDataClass(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,正如Bugs所建议的那样,你可能会更好地将这个事件作为事件TheIncomingDataClass并订阅它MainForm.

class IncomingMessageEventArgs : EventArgs{
    IncomingMessageType message;

    public IncomingMessageType Message{get{return message;}}

    public IncomingMessageEventArgs(IncomingMessageType message){
        this.message = message;
    }
}

class TheIncomingDataClass{
    public event EventHandler<IncomingMessageEventArgs> MessageReceived;

    protected virtual void OnMessageReceived(IncomingMessageEventArgs e){
        if(MessageReceived != null)
            MessageReceived(this, e);
    }

    public void IncomingMessage(IncomingMessageType message){
        OnMessageReceived(new IncomingMessageEventArgs(message));
    }
}

class MainForm : Form{
    MainForm(){
        new TheIncomingDataClass().MessageReceived +=
            (s, e)=>txtDisplayMessages.AppendText(e.Message.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)