我正在使用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!");
}
}
我该如何改变这种行为? 它是否存在更有效的另一种方式?
答案 0 :(得分:1)
有很多更好的方法可以做你想做的事情。这取决于您的应用程序的结构。
您可能想要创建一个类来进行日志记录。在此类中,您将创建在更改/添加日志时触发的事件。然后,您的应用程序中的任何模块都可以调用此日志记录类,您要监视日志记录的任何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.Log("message");
您的任何表单都可以订阅所有日志事件,如下所示:
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();
}
您可以轻松地创建自己的类来表示包含您希望存储/组织/显示的任何数据的日志条目,而不是记录字符串。
答案 1 :(得分:1)
只是一个想法: 为什么不实现将要写入文本框的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);
}
}
在您的MainForm ctor中,
public MainForm()
{
var tl - new MyTraceListener(this.textBox);
Trace.Listeners.Add(tl);
}
通过覆盖其他方法,您可以自定义输出。
答案 2 :(得分:0)
您可以在otherClass
中创建一个活动,并将其注册到MainForm
。
以下是事件的简单示例:http://www.codeproject.com/KB/cs/simplesteventexample.aspx