2011-12-24 66 views
2

我正在使用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

你为什么使用发送消息功能?这不是更好,你称它为mainForm = new MainForm(); mainForm.textbox1。文本= “SomeText” 则会; – 2011-12-24 05:41:44

+0

不错的主意,它的工作原理,但我使用sendMessage()将消息添加到日志文件 – auraham 2011-12-24 05:54:27

+0

如何在主窗体中使用sendMessage()函数? – 2011-12-24 05:56:16

回答

0

有很多更好的方法做你正在尝试做的。这取决于您的应用程序的结构。

您可能想要创建一个类来执行日志记录。在这个类中,您将创建一个在日志更改/添加时触发的事件。然后在你的应用程序的任何模块可以调用这个日志类,任何任何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

只是一个想法: 为什么不实现将要写入文本框并在应用程序的任何地方使用Trace.Write的TraceListener。

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

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

} 

在你的MainForm构造函数,

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

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