从另一个 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;
}
}
这应该可以解决问题。您需要传递要修改的对象的引用。
我想从另一个class访问文本框。
应使用 void AddLog
.
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;
}
}
这应该可以解决问题。您需要传递要修改的对象的引用。