2013-07-31 49 views
-1

我是VB和.Net的新手,我有一个任务,我无法继续。从vb.net的线程访问动态创建的表单元素

  1. 我启动一个线程屏蔽1负载时。用户然后转到screen2。
  2. 在screen2上线程仍在后面运行。当用户上画面2执行的操作(比如单击)时,它会触发线程基于画面2访问元素
  3. 元素在屏幕2被动态创建和IDE没有设计。

因此,本质上在一个表单上创建的线程需要访问另一个表单上动态创建的表单元素。

如果我的问题太简单了,请原谅我。如果不清楚,请让我知道,我会重写它。

注意:我说的元素基本上是流布局面板内的图片框。

预先感谢 所有帮助被热切期待和感激(现在咬指甲)。

编辑

  1. 比方说,一个名为ctThread线程在仪表盘屏幕

    ctThread.start()

  2. 此线程循环运行的,等待一个触发事件开始。

  3. 同时用户已经到了一个名为QuizScreen屏幕,并在此屏幕(形式)我要更新一些动态创建的元素的名字,我知道。

  4. 所以当时间是正确的,其正在等待(监听线程),它会调用下面的子ctThread。

public sub changeComputerStatus(ByVal node) 
    Dim flowpanel As FlowLayoutPanel = CType(QuizScreen.FlowLayoutPanel1.Controls("flow_" + node), FlowLayoutPanel) 
    Dim pictControl As PictureBox = CType(flowpanel.Controls("pict_" + node), PictureBox) 
    pictControl.Image = System.Drawing.Image.FromFile(Application.StartupPath & "\images\application-on.png") 
end sub 

这里节点不断变化。这就是我区分我创建的每个控件的方式。

注意:此线程在名为dashboardscreen的屏幕中启动,用户现在位于不同的屏幕QuizScreen上。

上面给出的子代的第一行运行并不返回流程面板。因此,当它进入下一行时,它不能使用任何内容作为参考。因此,上面提到的错误。

+1

此任务的哪一部分是您遇到的问题?你有没有尝试过,它不能正常工作?或者你得到一个错误?或者你只是要求提供关于如何去做类似的事情的一般建议? –

+0

嗨史蒂文感谢您的回复。在尝试访问动态创建的元素时出现错误。错误是“对象引用未设置为对象的实例”。如果我尝试使用表单上的事件访问相同的元素(动态元素),我可以做到这一点。但是在线程中尝试相同的代码时。它由于某种原因没有找到元素。 –

+0

我是一个web开发者(php/python),基本上在vb.net项目中被捕获。应用程序开发对我来说是非常新的。 –

回答

1

两件事。

  1. 您必须知道的最重要的事情是您无法直接从后台线程访问控件的属性。控件只能从前台UI线程中操作。为了从后台线程访问控制,你需要使用某种形式的异步编程,例如创建代表一个.NET 1.x - 3。5或使用新的Task<T>asyncawait关键字。

  2. 您是否真的将动态创建的控件添加到窗体的控件集合中?请注意,您仍然需要通过委托或其他异步方法访问控件,如上面1中所述。

UPDATE:

要回答下面的OP的评论的问题:你还可以Invoke一个UI对象的方法。基本上,你告诉.NET运行调用的方法,它运行在UI对象的创建线程上(在这里是UI线程),这正是你想要的。这将允许你(取决于所调用的方法或属性)再次“更新”控制“从背景”—,这是所有的手段;当调用UI对象上的方法时,invkoked方法可能使用从后台任务传递到所述方法的数据在UI线程上运行。

此外,检查出在BacgkroundWorker MSDN文档(在此被引入在.NET 2.0和由asyncawait关键字Task<T>沿.NET 4.5被替代)。有很多可用的文档可以解释如何做你正在问的问题。通过对MSDN或Bing(或您的首选搜索引擎)进行快速搜索并不难。

+0

亲爱的@fourpastmidnight自从我看到这一点以来,它已经很久了。由于我被转移到不同的任务,我离开了这个。现在我回到原来的任务。所以首先感谢您的回复。但是,我使用代表的四个午夜,它仍然不起作用。 –