从外部类更新 Form1 的组件



我的项目的目录结构:

First_GUI
|_ First_GUI.sln
|_ First_GUI (Directory of same name)
  |_ Form1.cs
  |_ Insider (a directory inside First_GUI)
    |_ TestInnerClass.cs

上周开始了 C#,我正在尝试制作一个 GUI 应用程序。 Form1是主要形式,有TextBoxButtonLabel

用户在此文本框中输入一个值,当单击按钮时,该字符串的值将发送到驻留在Insider目录中的类。接收此值的类命名为 TestInnerClass

TestInnerClass执行一些操作,例如在收到的字符串末尾添加一些额外的字符。现在,我需要它来更新我们在Form1中的Label并将新的字符串值放入其中。

TestInnerClass有更多的指令要做,所以它应该实时进行和更新Form1

我已经尝试了过去 2 个小时,但我仍然没有找到完成此操作的方法。

我试图使Form1 Label Public可以从任何地方访问,然后在TestInnerClass中执行此操作:

string newString = "Should update!";
Form1 frm1 = new Form1();
frm1.Label.Text = newString;

这行不通。

要访问另一个线程属性(在您的情况下是 Form1 的 GUI 线程(,您需要像这样调用线程:

frm1.Invoke( new Action(() => 
{ 
    frm1.label.Text = "Test"; 
} ));

调用是必需的,因为 .net 中窗口的 GUI(无论窗体还是 WPF(在其自己的线程中运行。线程并行执行代码,因此无论后台发生什么计算,GUI 始终响应用户。

长话短说:

 -> Entrypoint of your program
    |
    | -> Thread 1 (testInnerClass)
         |
         | -> Thread 2 (frm1.Show())
    |
    | -> Invoke Thread 2
    | -> set Property
         |
         | -> resume thread 2

调用Show()时,您的表单位于另一个线程中。调用会暂停线程,您可以更改属性。完成后,它将恢复。

这有效,但是在重新阅读您的问题后,它可能不是最佳解决方案,因此这是另一种可能更好的解决方案:

编辑 Form1 的构造函数以:

public Form1 (string textForMyLabel) {
    Initialize();
    label1.Text = textForMyLabel;
}

然后使用Form1 frm = new Form1(newString);创建表单然后,在调用 Show() -Method 之前,将填充您的标签。但这只适用于 Form1 的每个实例一次。

最新更新