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这样的配置上下文。哦,天哪,它成功了!非常感谢你!。这个“调用”是什么?你能详细解释一下吗?我会给我的回答添加一个解释。我再次运行了这个,现在我看到它正在打开表单的另一个实例。这将是一个问题,因为如果有太多的输入或我需要更改的次数,应用程序将产生大量实例。没有任何东西可以编辑当前运行帧吗?