C# 更新表格1';从外部类中删除组件

C# 更新表格1';从外部类中删除组件,c#,winforms,visual-studio,class,real-time,C#,Winforms,Visual Studio,Class,Real Time,我的项目的目录结构: First_GUI |_ First_GUI.sln |_ First_GUI (Directory of same name) |_ Form1.cs |_ Insider (a directory inside First_GUI) |_ TestInnerClass.cs 我上周开始使用C#,我正在尝试制作一个GUI应用程序Form1是主要表单,它有一个文本框、一个按钮和一个标签 用户在此文本框中输入一个值,单击按钮时,该字符串的值将发送到Insid

我的项目的目录结构:

First_GUI
|_ First_GUI.sln
|_ First_GUI (Directory of same name)
  |_ Form1.cs
  |_ Insider (a directory inside First_GUI)
    |_ TestInnerClass.cs
我上周开始使用C#,我正在尝试制作一个GUI应用程序
Form1
是主要表单,它有一个
文本框
、一个
按钮
和一个
标签

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

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

testinerclass
有更多的指令要执行,因此它应该实时执行并更新
Form1

我已经试了两个小时了,但我仍然没有找到一个方法来完成这件事

我尝试将
表单1的
标签
作为
公共
从任何地方访问,然后在
测试类
中执行此操作:

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=newform1(newString)创建表单
然后在调用
Show()
-方法之前,标签将被填充。
但这只对Form1的每个实例有效一次。

Form1 frm1=new Form1()之后尝试了它行及其抛出的
Invoke或BeginInvoke。
然后执行
frm1.Show()
。但可能有更好的方法来实现这一点,比如像Singelton这样的配置上下文。哦,天哪,它成功了!非常感谢你!。这个“调用”是什么?你能详细解释一下吗?我会给我的回答添加一个解释。我再次运行了这个,现在我看到它正在打开表单的另一个实例。这将是一个问题,因为如果有太多的输入或我需要更改的次数,应用程序将产生大量实例。没有任何东西可以编辑当前运行帧吗?