我想从另一个类访问文本框。
应使用Log
从<{1}}类访问Textbox1。
因此,在我的应用程序中的任何地方,我想使用void AddLog
,为了在日志窗口中添加一些文本(Log.AddLog("....")
),我为此编写了一个函数(它是&#39; s AddLog):
textbox1
我将textbox1的修饰符设置为public,以便从AddLog调用它。当我调用此函数时,没有任何反应,textbox1中不会显示任何内容....
我已经搜索过,但没有发现任何真正帮助过我的事。
答案 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;
}