从另一个类访问文本框

时间:2015-05-12 14:48:10

标签: c# winforms textbox

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

应使用Log从<{1}}类访问Textbox1。

因此,在我的应用程序中的任何地方,我想使用void AddLog,为了在日志窗口中添加一些文本(Log.AddLog("....")),我为此编写了一个函数(它是&#39; s AddLog):

textbox1

我将textbox1的修饰符设置为public,以便从AddLog调用它。当我调用此函数时,没有任何反应,textbox1中不会显示任何内容....

我已经搜索过,但没有发现任何真正帮助过我的事。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

但是现在你将Log类绑定到一个非常具体的表单,并且它直接搞乱了该表单上的特定UI控件并不拥有。这是非常糟糕的设计。

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

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

答案 1 :(得分:1)

试试这个 -

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

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

答案 2 :(得分:0)

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

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

应该是

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