【问题标题】:how to send text to textbox through a different class?如何通过不同的类将文本发送到文本框?
【发布时间】:2011-12-24 14:48:27
【问题描述】:

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

  }
}

我怎样才能改变这种行为? 它是否存在另一种更有效的方式?

【问题讨论】:

  • 为什么要使用发送消息功能?叫它 mainForm = new MainForm(); 不是更好吗? mainForm.textbox1.text="sometext";
  • 好主意,它有效,但我也使用 sendMessage() 将消息添加到日志文件中
  • 在主窗体中添加 sendMessage() 函数怎么样?

标签: c# textbox


【解决方案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();
}

您可以轻松地创建自己的类来表示包含您希望存储/组织/显示的任何数据的日志条目,而不是记录字符串。

【讨论】:

    【解决方案2】:

    只是一个想法: 为什么不实现将写入文本框的 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);
    }
    

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

    【讨论】:

      【解决方案3】:

      您可以在otherClass 中创建一个事件并将其注册到您的MainForm

      这是一个简单的事件示例:http://www.codeproject.com/KB/cs/simplesteventexample.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 1970-01-01
        • 2020-02-20
        相关资源
        最近更新 更多