【问题标题】:Updating Form1's components from an external class从外部类更新 Form1 的组件
【发布时间】:2017-03-24 09:38:51
【问题描述】:

我的项目目录结构:

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 小时我一直在尝试,但我仍然没有找到完成此任务的方法。

我尝试将Form1Label 设置为Public,以便从任何地方访问,然后在TestInnerClass 中执行此操作:

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

这不起作用。

【问题讨论】:

    标签: c# winforms visual-studio class real-time


    【解决方案1】:

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

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

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

    长话短说:

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

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

    这可行,但在重新阅读您的问题后,它可能不是最佳解决方案,所以这里有另一个可能更好的解决方案:

    将Form1的构造函数编辑为:

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

    然后使用Form1 frm = new Form1(newString); 创建表单 那么您的标签将在您调用Show()-方法之前被填充。 但这只对 Form1 的每个实例有效一次。

    【讨论】:

    • Form1 frm1 = new Form1(); 行之后尝试了它并抛出了Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
    • 然后在之前执行frm1.Show()。但是可能有更好的方法来做到这一点,比如像 Singelton 这样的配置上下文。
    • 天哪,成功了!非常感谢!。这个“调用”是什么?你能详细说明一下吗?
    • 我会为我的答案添加解释
    • 我再次运行它,现在我看到它正在打开另一个表单实例。这将是一个问题,因为如果有太多输入或需要更改的时间,应用程序将生成大量实例。没有什么可以编辑当前运行的帧吗?
    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多