我的项目目录结构:
First_GUI
|_ First_GUI.sln
|_ First_GUI (Directory of same name)
|_ Form1.cs
|_ Insider (a directory inside First_GUI)
|_ TestInnerClass.cs
我上周开始使用C#,我正在尝试制作GUI应用程序。 Form1
是包含TextBox
,Button
和Label
的主要表单。
用户在此文本框中输入值,当单击按钮时,该字符串的值将发送到驻留在Insider
目录中的类。接收此值的类名为TestInnerClass
。
这个TestInnerClass
执行一些操作,比如在收到的字符串末尾添加一些额外的字符。现在,我需要它来更新我们在Label
中的Form1
并将新的字符串值放入其中。
TestInnerClass
有更多说明要做,所以它应该继续并实时更新Form1
。
过去2个小时我一直在尝试,但我仍然没有办法完成这项任务。
我已尝试将Label
Form1
Public
作为TestInnerClass
从任意位置访问,然后在string newString = "Should update!";
Form1 frm1 = new Form1();
frm1.Label.Text = newString;
中执行此操作:
documentType: IDocument[] = [
{
"type": "A",
"checked": false,
},
{
"type":"B",
"checked": false,
},
{
"type":"C" ,
"checked": false,
}];
这不起作用。
答案 0 :(得分:1)
要访问另一个Threads属性(在您的情况下是Form1的GUI Thread),您需要像这样调用Thread:
frm1.Invoke( new Action(() =>
{
frm1.label.Text = "Test";
} ));
Invoke是必需的,因为.net中的Window的GUI(如果Forms或WPF无关紧要)在它自己的Thread中运行。线程并行执行代码,因此无论后台发生什么计算,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()
- 方法之前,您的标签将被填充。
但是这仅适用于Form1的每个实例。