从外部类更新Form1的组件

时间:2017-03-24 09:38:52

标签: 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是包含TextBoxButtonLabel的主要表单。

用户在此文本框中输入值,当单击按钮时,该字符串的值将发送到驻留在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,
    }];

这不起作用。

1 个答案:

答案 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的每个实例。