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