关于C#:从其他类访问文本框

Access textbox from another class

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

应使用void AddLog从类Log访问textbox 1。

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

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

我将Tabbx1的修改器设置为公共,以便从AdLogo调用它。当我调用这个函数时,什么也不会发生,在ToBox1中什么都不会显示出来…

我已经搜索过了,但没有发现什么能真正帮到我。


试试这个——

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  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;
    }
}

这样就可以了。需要传递要修改的对象的引用。


当前代码的结构方式是,每次调用AddLog时都创建一个new表单。这不是可见的现有表单,而是未显示的新表单。您正在将变量s的内容添加到新表单的TextBox中。表单从未显示过,而且由于它是一个局部变量,因此在该方法运行完成后,它可以进行垃圾收集。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Log
{
    private Form1 _form;
    public Log(Form1 formToUpdate)
    {
        _form = formToUpdate;
    }

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

但是现在您的日志类绑定到一个非常特定的表单,并且它直接与表单上不属于自己的特定UI控件混淆。这是非常糟糕的设计。

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

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


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

意味着在窗体中创建新的ReXTrimeBox,而不是当前ReXTrimBox1。

应该是

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