如何通过不同的类将文本发送到文本框?

时间:2011-12-24 05:37:33

标签: c# textbox

我正在使用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!");

  }
}

我该如何改变这种行为? 它是否存在更有效的另一种方式?

3 个答案:

答案 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