C# 如何通过其他类将文本发送到textbox?

C# 如何通过其他类将文本发送到textbox?,c#,textbox,C#,Textbox,我与c#一起在一个Windows窗体应用程序项目中工作。有一个名为MainForm的图形主窗体,带有一个文本框,它的工作方式类似于日志查看器。此外,还有许多类必须通过文本框发送有关其工作的信息 我在Program.cs中已经有了这个代码。它创建一个公共成员 public static MainForm mainForm; public static Main() { ... mainForm = new MainForm(); Application.Run

我与c#一起在一个Windows窗体应用程序项目中工作。有一个名为MainForm的图形主窗体,带有一个文本框,它的工作方式类似于日志查看器。此外,还有许多类必须通过文本框发送有关其工作的信息

我在Program.cs中已经有了这个代码。它创建一个公共成员

  public static MainForm mainForm;

  public static Main()
  {
    ...
    mainForm = new MainForm();
    Application.Run(mainForm);

    // Application.Run(new MainForm());  I commented this default line
  }
在MainForm.cs中,我有以下内容:

public void sendMessage(string message)
{
// puts message in textbox...
}
最后,我可以通过以下方式从另一个类访问:

class otherClass
{
  ...

  private void someFunction(){
    ...


    Program.mainForm.sendMessage("send to log!");

  }
}
我怎样才能改变这种行为?
它是否存在另一种更有效的方式?

您可以在
otherClass
中创建一个事件,并将其注册到您的
MainForm


下面是一个简单的事件示例:

有很多更好的方法来完成您正在尝试的任务。这取决于应用程序的结构

您可能想创建一个类来进行日志记录。在这个类中,您将创建一个事件,该事件在日志被更改/添加到时被激发。然后,应用程序中的任何模块都可以调用此日志类,您想要监视日志记录的任何UI元素都可以订阅以下事件:

public static class MyLogger
{
    private static List<string> log = new List<string>();

    public static event EventHandler LogAdded;

    public static void Log(string message)
    {
        log.Add(message);

        if (LogAdded != null)
            LogAdded(null, EventArgs.Empty);
    }

    public static string GetLastLog()
    {
        if (log.Count > 0)
            return log[log.Count - 1];
        else
            return null;
    }
}
MyLogger.LogAdded += new EventHandler(MyLogger_LogAdded);
您的任何表单都可以订阅所有日志事件,如下所示:

public static class MyLogger
{
    private static List<string> log = new List<string>();

    public static event EventHandler LogAdded;

    public static void Log(string message)
    {
        log.Add(message);

        if (LogAdded != null)
            LogAdded(null, EventArgs.Empty);
    }

    public static string GetLastLog()
    {
        if (log.Count > 0)
            return log[log.Count - 1];
        else
            return null;
    }
}
MyLogger.LogAdded += new EventHandler(MyLogger_LogAdded);
请记住,在关闭/释放表单时删除如下事件:

MyLogger.LogAdded -= new EventHandler(MyLogger_LogAdded);
你会这样回应这个事件:

void MyLogger_LogAdded(object sender, EventArgs e)
{
    textBox.Text = textBox.Text + Environment.NewLine + MyLogger.GetLastLog();
}
不需要记录字符串,您可以轻松地创建自己的类来表示包含任何要存储/组织/显示的数据的日志条目。

只是一个想法: 你为什么不实现TraceListener,它将写入你的文本框并使用Trace.write在你的应用程序中无处不在

class MyTraceListener : TraceListener
{
TextBox textBox;
public MyTraceListener(TextBox textBox)
{
this.textBox = textBox;
}

public override void Write(string value)
{
this.textBox.AppendText(value);
}

}
在主窗体中

public MainForm()
{
var tl - new MyTraceListener(this.textBox);
Trace.Listeners.Add(tl);
}

通过覆盖其他方法,您可以自定义输出。

为什么要使用发送消息功能?你叫它mainForm=newmainform()不是更好吗;mainForm.textbox1.text=“sometext”;好主意,它可以工作,但我使用sendMessage()将消息添加到日志文件中。在主窗体中使用sendMessage()函数怎么样?