.net Windows窗体文本框刷新

.net Windows窗体文本框刷新,.net,winforms,.net,Winforms,我在Windows窗体用户控件上有一个文本框,我正试图从解决方案中的其他位置更新该控件的内容 我正在动态地将UserControl添加到表单中,并且UserControl上有一个静态实例属性,以便可以从引用库访问它 为了简洁起见,我排除了双锁检查 public partial class MyForm : Form { private MyControl ctl; public MyForm() { ctl = new MyControl(); MyCon

我在Windows窗体用户控件上有一个文本框,我正试图从解决方案中的其他位置更新该控件的内容

我正在动态地将UserControl添加到表单中,并且UserControl上有一个静态实例属性,以便可以从引用库访问它

为了简洁起见,我排除了双锁检查

public partial class MyForm : Form {

   private MyControl ctl;

   public MyForm() {
      ctl = new MyControl();
      MyControl.Instance = ctl;
      Controls.Add(ctl);
   }

}


public partial class MyControl : UserControl {

   public static MyControl Instance;

   public void LogMessage(string msg) {

       if (MyInnerTextBox.InvokeRequired) {
           MyInnerTextBox.Invoke(LogMessage, msg);
           return;
       }

       MyInnerTextBox.AppendText(msg);
       MyInnerTextBox.Refresh();
       this.Refresh();
   }

}
当我从另一个类调用
MyControl.Instance.LogMessage(“blah”)
时,我的文本似乎被添加到MyControl控件的另一个实例中。。。不是表单上的实例


我错过了什么?静态实例引用不允许我引用MyForm上MyControl的实例吗?

静态
实例
MyControl的所有实例共享。如果您有多个
MyForm
实例,则每个实例都将更改为
Instance
引用,因此所有
MyForm
实例都将指向同一个
MyControl
实例

更新 由于只有一个
MyForm
实例,这肯定是不寻常的

但是,如果您想要的是一个日志系统,那么您应该真正解耦这个系统,并拥有一个执行日志记录并触发事件的类,然后让表单侦听该日志记录类上的
MessageLogged
事件,并相应地更新文本框。比如:

static class Logger
{
  public static event EventHandler<MessageLogEventArgs> MessageLogged;

  public static void LogMessage(object caller, string message)
  {
    if (MessageLogged != null)
    {
       MessageLogged(caller, new MessageLogEventArgs(message);
    }
  }
}

不是。在整个应用程序中只有一个MyControl.instance实例(因为它是静态的)。每次设置它时,都会覆盖它的上一个实例。基本上,最后一个获胜


您必须在MyForm中为MyControl实例创建一个公共getter(或者将其设置为公共成员变量)。这样设置文本。i、 e.myForm1.ctl.LogMessage(“blah”)。

为简洁起见,我排除了MessageLogEventArgs类,您需要创建它。这样做了。。。额外的间接层次让我得到了我所寻找的日志记录。谢谢!杰出的我总是乐于帮助而不是阻碍。:)
public partial class MyForm : Form {

   private MyControl ctl;

   public MyForm() {
      ctl = new MyControl();
      Controls.Add(ctl);

      Logger.MessageLogged += MyMessageLogHandler;
   }

   private void MyMessageLogHandler(object sender, MessageLogEventArgs e)
   {
      this.ctl.LogMessage(e.Message);
   }
}

public partial class MyControl : UserControl {

   public void LogMessage(string msg) {

       if (MyInnerTextBox.InvokeRequired) {
           MyInnerTextBox.Invoke(LogMessage, msg);
           return;
       }

       MyInnerTextBox.AppendText(msg);
       MyInnerTextBox.Refresh();
       this.Refresh();
   }
}