2011-12-23 50 views
0

在vb6中,当值更改时,您可以立即看到文本框更新,但我在.net注意到它将不会更新,直到您退出的方法退出。我的一个初步问题是在方法完成之前是否有办法更新文本框。奇怪的形式行为。文本只有在设置文本属性后才会出现在文本框中

问题是我有两个文本框的文本属性被设置,当方法完成时,只有其中一个在屏幕上一致地更新。另一个通常不会,但有时会。这是零星的。我从字面上打电话过来确认我没有服用疯狂的药片,当然,当她过来时它开始工作(尽管我没有改变代码)。然后,当质量保证人员出现时,它再次停止工作(再次,未做任何代码更改)。

我一直在做的就是设置断点并逐步浏览代码,试图找出是什么让这个文本框被更新。在程序结束时,在它退出之前,我可以检查Text属性并且它具有正确的值,但只要方法结​​束,它就会消失。

我会尝试尽快得到一段代码,但同时我很想知道是否有其他人有过这个问题,以及关于如何调试B/C的任何好的想法,我有点沮丧!表单上有一个计时器,它在某个点被启用,并在运行时禁用自身...在此计时器中设置一个断点,以验证它不是导致断点不被击中的罪魁祸首。但我想知道是否可能会有其他异步过程,我可能会错过...我不这么认为,但如果你能告诉我任何事情,我应该寻找,我可能没有想过请做。

编辑:我会发布代码段,但我想发布的代码段不会重现问题,并且我没有将问题隔离到足够小的代码段,以便实际发布。我会添加更多的信息,但:

完成更新这些文本框的方法后,控件返回到窗体。没有其他进程正在进行。我一直在想,也许一些代码正在运行的地方是空白的文本框,但通过代码的彻底审视已经证实,这绝对不是这种情况...当方法完成时没有其他事情发生。

我注意到,当我调试时,有时会正常工作,在罕见的情况下,甚至在正常运行时也能正常工作。我添加了一个DoEvents()来查看它是否可以工作,并且它是第一次......但是之后没有继续工作。出于挫折感,我在每一个之后加入了重复的调用来设置文本框和DoEvents(),并且没有使它完美。最后我添加了一个线程调用Sleep()300毫秒,现在看起来好多了。

请记住,表单上还有另一个几乎相同的文本框,它在相同的过程中被设置,并且从来没有任何更新问题。我已经搜索了两个控件之间的区别,除了大小,位置和名称之外,我找不到任何区别。

+0

更新代码 – Nighil 2011-12-23 04:30:18

+0

@Nighil的问题,我想你忽略了,我说的部分:“我会尝试尽快得到一个代码片段:) :) – 2011-12-23 04:32:58

+1

在VB 6和VB.NET之间没有什么独特之处。 'DoEvents'是黑客解决方案,但它不是一个好的解决方案。这个教训永远不会在你的UI(主)线程上做长时间运算或其他工作;它会导致UI冻结。 BackgroundWorker组件是为这个应用程序量身定制的。 MSDN页面有一个很好的例子,你可以在这里找到很多其他人问这个问题。 – 2011-12-23 10:34:58

回答

1

我想你可以在设置文本框文本值后添加:Application.DoEvents()。它通常不喜欢使用DoEvents,尽管它可以解决你的问题。

+0

我修复了在vb6中使用DoEvents造成的一个很大的bug,但只要你真正理解它在做什么,我就没有问题了。我想立即更新的唯一原因是出于调试目的,所以我认为应该这样做。谢谢你提醒我! – 2011-12-23 04:41:58

+0

关于DoEvents还有很多需要说明的地方,如果你搜索它们(现在找不到我最喜欢的那个,来自Hans Passant,我认为 - 非常好),你可以在各种答案中阅读。 – TheBlastOne 2011-12-23 17:32:31

+0

@TheBlastOne是的,我已经阅读了一堆,这个名字听起来很熟悉,所以也许我读了你想的那个。我是那种总是要知道所有关于这样的东西的利弊的人......当人们对事物做出一揽子决定时,我讨厌我。我喜欢理解它们并在适当的时候使用它们。 – 2011-12-23 18:36:45

0

我想你最好使用Invalidate();这将导致控制重绘yourtextbox.Invalidate();

您可以使用Threading用于此目的

+0

尝试过,但不会立即更新。仍然等待,直到方法完成并且行为与如果我没有调用它相同。 – 2011-12-23 05:10:51

+0

我不'认为'线程在这里会有所帮助。使用线程,我将不得不调用Invoke(),以便在主线程上发生更新...但我希望在更新主线程中已有的方法时进行更新。我可能是错误的,但现在DoEvents()足以用于调试目的。 – 2011-12-23 18:34:24