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