【问题标题】:Access textbox from another class从另一个类访问文本框
【发布时间】:2023-04-04 05:50:01
【问题描述】:

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

应该从类Log 访问Textbox1,使用void AddLog。

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

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

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

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

【问题讨论】:

  • new operator - "用于创建对象"
  • 新表单确实有它的richTextBox1 文本正确附加了字符串s 的内容,关于在类之间传递对象有很多重复的问题,我觉得很难想到没有任何帮助..您搜索了什么,您尝试了什么没有用?
  • 我的解决方案与您已经找到的解决方案完全相同,到目前为止您尝试了哪些没有奏效的方法?
  • 我编辑了您的问题以删除我的反对意见,但请阅读How to Ask。我建议你尝试自己解决你的问题,如果你仍然卡住,然后再回来提出一个更详细的问题(提示:传递参考)
  • @Sayse 的第一条评论 有帮助的原因是您的方法创建了一个 Form1 的新实例。但是一旦方法退出,该实例就不再可访问并被处置。您的总体思路是正确的,但您需要了解范围。两个例子可以找到here和this answer的前半部分。

标签: c# winforms textbox


【解决方案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】:

    当前代码的结构方式是,每次调用 AddLog 时都会创建一个 new 表单。这不是可见的现有表单,而是未显示的新表单。您正在将变量 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 的构造函数采用该接口类型而不是特定的具体类型。

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

    【讨论】:

    • 谢谢,但是怎么称呼呢?我不能称它为 Log.AddLog()!
    • 你没有给我们足够的信息。谁将创建和拥有Log 类的实例?您还没有告诉我们您希望它如何工作,也没有向我们展示调用AddLog 方法的代码。您应该编辑您的问题以提供足够的信息并澄清您的问题。
    • 好的。我以为我表达得很清楚,但这里是我的一些想法: Log.cs 是一个类。我想将它用作类来写入日志文件(到目前为止已完成)和主窗口中的文本框(它是 form1)。现在我想用 Log.AddLog(s) 从任何地方访问 Log.cs 来显示一些消息,你知道吗?
    • 您不能从类名Log 中调用AddLog 方法,因为它是一个实例方法。您要么需要创建一个实例(使用new),然后将该引用传递给需要它的每个人,要么将其更改为静态方法(并且可能将类也更改为静态)。如果您不了解实例和静态方法之间的区别,您将不得不做一些研究。这些是基本的 C# 概念,在继续之前,您必须了解基础知识。
    【解决方案3】:
    new Form1().richTextBox1.Text += Environment.NewLine + s;
    

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

    应该是

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

    【讨论】:

    • 仅当 AddLog 是具有 RichTextBox 的表单上的方法时。
    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 2017-06-15
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多