【问题标题】:FormName.ButtonName.Visible = True - not working (vb.net)FormName.ButtonName.Visible = True - 不工作(vb.net)
【发布时间】:2012-11-29 20:56:05
【问题描述】:

我将首先给出一个我正在处理的简化示例

我有一个 Windows 窗体 - 让我们称之为“formA”,在 formA 上我有一个按钮,在按钮的属性中我设置为可见 = false。 我有一个名为 MainLoop 的不同类

Public class MainLoop


 sub new()
 end sub

 public sub run()
       If someCondition then
           formA.ButtonName.Visible = True
       End if


 end sub
 end class

我在这个应用程序中运行了不止一个线程,并且一个线程一直通过这个“公共子运行”循环运行,直到满足某些条件。通过调试和单步执行应用程序,我确信它正在运行设置可见性 = true 的行。但是按钮只是没有出现在我的表单上。我已经确认这不是一个简单的拼写错误或任何其他问题 - 似乎我在这里遗漏了一个基本逻辑。

我试过了

dim TempForm as new formA

然后在我尝试的 IF 语句中

 TempForm.ButtonName.Visible = true

但这正在创建表单的一个新实例 - 它实际上并没有设置我正在使用的按钮的当前表单。

感谢任何帮助。

【问题讨论】:

  • 在需要 对象变量 的地方使用 类型名称 是一个可怕的 vb.net 陷阱。当您使用线程时,它永远不会失败,它为您提供了一个新的表单对象。使用 TempForm 是一种解决方法的尝试,但落入了完全相同相同的陷阱,您不想更改新表单实例上按钮的可见性。您需要用户正在查看的那个。通过停止尝试从线程更新 UI 来取得成功。 BackgroundWorker 是样板类,可让您远离此类麻烦。

标签: vb.net winforms multithreading


【解决方案1】:

如果您在 UI 线程以外的线程上设置可见性,则必须调用它才能使其可见。您不能从另一个线程触摸 UI 线程上的任何内容。

【讨论】:

    【解决方案2】:

    对于任何想知道答案的人,

    Control.Invoke 方法(Delegate、Object())

    教程可以找到here

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 2019-05-02
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多