【问题标题】:C#: How can I append text to a textbox on a form from a class?C#:如何从类中将文本附加到表单上的文本框?
【发布时间】:2010-01-26 15:50:59
【问题描述】:

我有一个名为“Form1.cs”的表单,它调用了一个我们将称为“Class1.cs”的类,以及另一个名为“Form2.cs”的表单。 Class1 中的子例程需要更新 Form2 中的文本框(如果该表单已打开)。文本需要在附加到文本框中的当前文本后出现,以便实时更新。我不知道如何使这项工作。我尝试了很多东西,它们没有给我错误,但它们也没有将文本写入文本框。

这里的每个请求是我当前的代码。请记住,这是在将其实施到实际项目之前解决此问题的测试项目。

Form1.cs 中的代码

namespace Test
{
    public partial class Form1 : Form
    {
        Form2 cs_form2 = new Form2();
        Class1 cs_class1 = new Class1();
        public Form1()
        {
            InitializeComponent();

        }
        public void button1_Click(object sender, EventArgs e)
        {
            cs_class1.Writelog();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            cs_form2.Show();
        }
        public void writeToTextbox()
            {
                i = 0;
                while(i<=10)
                {
                    cs_form2.testTextBox.AppendText("still works");
                    i++;
                }
            }
    }
}

Form2.cs 中的代码

namespace Test
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void clear_Click(object sender, EventArgs e)
        {

            testTextBox.Text = "";
        }

        public void AppendText()
        {
            testTextBox.AppendText("asklvhslieh");
        }
    }
}

Class1 中的代码

namespace Test
{
    class Class1
    {
        Form2 cs_form2 = new Form2();

        public void Writelog()
        {
            cs_form2.testTextBox.AppendText("asg");
        }
    }
}

【问题讨论】:

  • 如果您的代码不起作用,如果您将它放在您的帖子中会非常有帮助...最好是作为一个简短但完整的示例。

标签: c# winforms


【解决方案1】:

编辑:通过编写new Form2(),您在Class1 中的代码正在创建Form2 的新实例。
这个实例与在Form1(也可以写new Form2())中创建的另一个实例没有任何关系,它实际上是可见的。
您需要为Class1 提供Form2 的现有实例,可能使用静态属性(如下所述)。


预编辑

要将文本附加到文本框,您应该调用AppendText 方法。

要在 Form2 之外执行此操作,您应该在 Form2 上创建一个调用 AppendText 的 public 方法。

例如:

partial class Form2 : Form {
    ...
    public void AppendMyText(string text) {
        myTextbox.AppendText(text);
    }
    ...
}

要在Class1 中调用此方法,您需要引用Form2 对象。
如果您一次只有一个Form2,您可以制作一个静态属性,如下所示:

partial class Form2 : Form {
    static Form2 instance;
    public static Form2 Instance { get { return instance; } }

    protected override void OnShown(EventArgs e) {
        base.OnShown(e);
        instance = this;
    }
    
    protected override void OnClosed(EventArgs e) {
        base.OnClosed(e);
        instance = null;
    }

在Class1(或其他任何地方),然后你可以写

if (Form2.Instance != null)
    Form2.Instance.AppendMyText(someString);

请注意,您需要在 UI 线程上执行此操作;如果你在后台线程上运行,你可以调用BeginInvoke。

【讨论】:

  • 我该如何给“Class1”类提供Form1打开的当前Form2?
  • @Bryan:您可以在 Class1 的构造函数中传递对它的引用,或者在 Class1 上设置一个属性,或者按照 SLaks 的建议,拥有一个包含对它的引用的静态属性。跨度>
  • 再次不明白你的意思,请举个例子。公共静态 Form2 实例 { 获取;私人套装; } 给我一个错误,说必须声明一个主体,因为它没有被标记为抽象或外部。我应该在 get 和 set 之后放什么?
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2014-09-22
  • 2012-02-17
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多