2011-12-24 35 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); 
} 

通過覆蓋等方法,您可以自定義輸出。