2011-12-24 8 views
2

私はWindowsフォームアプリケーションプロジェクトでC#で作業しています。 MainFormと呼ばれるグラフィカルなメインフォームがあり、テキストボックスはログビューアのように機能します。また、テキストボックスを通じて仕事に関する情報を送る必要がある多くのクラスがあります。テキストを別のクラスを介してテキストボックスに送る方法は?

私はすでにこのコードをProgram.csに入れています。それは私がこれを持ってMainForm.csの内部パブリックメンバー

public static MainForm mainForm; 

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

    // Application.Run(new MainForm()); I commented this default line 
    } 

を作成します。

public void sendMessage(string message) 
{ 
// puts message in textbox... 
} 

最後に、私はこの方法により、他のクラスからアクセスすることができます。

class otherClass 
{ 
    ... 

    private void someFunction(){ 
    ... 


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

    } 
} 

どのようにすることができますがこのbehaivorを変える? もう一つ効率的に存在しますか?

+0

なぜメッセージ送信機能を使用しますか?あなたはそれをmainForm = new MainForm()と呼ぶほうがいいでしょう。 mainForm.textbox1。テキスト= "sometext"; –

+0

良いアイデア、それは動作しますが、sendMessage()を使用してメッセージをログファイルにも追加します – auraham

+0

メインフォームにsendMessage()関数があるのはどうですか? –

答えて

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

ちょっとしたアイデア: テキストボックスに書き込むTraceListenerを実装し、アプリケーションのどこでもTrace.Writeを使用するのはなぜですか?あなたのMainFormのCTORで

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); 
} 

他のメソッドをオーバーライドすることで、あなたの出力をカスタマイズすることができます。

関連する問題