2011-12-23 46 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