从另一个 class 访问文本框

Access textbox from another class

我想从另一个class访问文本框。

应使用 void AddLog.

从 class Log 访问 Textbox1

所以,在我的应用程序的任何地方,我想使用 Log.AddLog("...."),以便在日志中添加一些文本 window (textbox1),我为此编写了一个函数(它是 AddLog):

public void AddLog(string s)
{
    new Form1().richTextBox1.Text += Environment.NewLine + s;
}

我将 textbox1 的修饰符设置为 public 以便从 AddLog 调用它。当我调用这个函数时,什么也没有发生,textbox1 中什么也不会显示....

我已经搜索过了,但没有找到真正帮助我的东西。

按照当前代码的结构方式,每次调用 AddLog 时都会创建一个 new 表单。这不是可见的现有形式,而是未显示的新形式。您正在将变量 s 的内容添加到此新表单上的 TextBox。表单永远不会显示,因为它是一个局部变量,所以在完成此方法后它有资格进行垃圾收集运行。

Log class 需要引用显示的现有表单,以便将其添加到正确的实例。你可以这样做:

public class Log
{
    private Form1 _form;
    public Log(Form1 formToUpdate)
    {
        _form = formToUpdate;
    }

    public void AddLog(string s)
    {
        _form.richTextBox1.Text += Environment.NewLine + s;
    }
}

但现在您的 Log class 绑定到一个非常具体的表单,它直接与不属于该表单的特定 UI 控件混在一起。这是非常糟糕的设计。

更好的方法是让日志 class 引发 Form1 订阅的事件(假设表单引用 Log实例)。您还可以为 Form1 创建一个接口来实现,然后让 Log 的构造函数采用该接口类型而不是特定的具体类型。

你需要了解引用、实例、构造函数等基础知识

new Form1().richTextBox1.Text += Environment.NewLine + s;

意味着您在表单中创建了一个新的 richTextBox,而不是当前的 richTextBox1。

应该是

public void AddLog(string s)
{
    this.richTextBox1.Text += Environment.NewLine + s;
}

试试这个 -

  public partial class Form1 : Form
  {
    Log log;
    public Form1()
    {
        InitializeComponent();
        log = new Log(richTextBox1);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        log.AddLog(DateTime.Now.ToString());
    }

    private void button2_Click(object sender, EventArgs e)
    {
        log.AddLog();
    }
}

public class Log
{
    RichTextBox rtb;
    public Log(RichTextBox rtb)
    {
        this.rtb = rtb;
    }

    public void AddLog(string msg)
    {
        rtb.Text += msg + Environment.NewLine;
    }

    public void AddLog()
    {
        rtb.Text += DateTime.Now.ToString() + Environment.NewLine;
    }
}

这应该可以解决问题。您需要传递要修改的对象的引用。