2010-07-30 64 views
0

我最近開始使用.net(C#)開發一個大型項目,並且在我的代碼中遇到了一個錯誤。我最終追查到了它,但如果可能的話,我希望在修復它方面提供一些幫助。我經常需要調用一個名爲UpdateUI的方法,除非任何代碼都不會影響UI,否則這很好。此方法是公共的,而不是靜態的(儘管我已經嘗試過使用靜態方法,並且使用對象引用來達到同樣的效果),並且它與我試圖更新的Windows窗體位於同一個文件中。爲了簡單起見,我已經刪除了大部分代碼,我只是向您顯示了這些以顯示我的聲明等。我只想問一下我錯過了哪些非常簡單的漏洞,我真的不應該這麼做!無法控制Windows窗體對象與Windows窗體相同文件中的其他方法

非常感謝您閱讀本,

理查德

public partial class ScanStatus : Form 
{ 
    public ScanStatus() 
    { 
     InitializeComponent(); 

     label3.Enabled = true;     

     // Some code. When "label3.Enabled = true" is placed here, it works perfectly. 
    } 

    public void UpdateUI() 
    { 
     label3.Enabled = true; 

     // However, the above "label3.Enabled = true" does absolutely nothing, no exception, nothing. 
    }     
} 
+0

這對我來說很好。我會重新考慮你的處所;你必須錯過一些正在發生的事情。 – mquander 2010-07-30 16:23:38

+0

UpdateUI是否被調用?如果你可以發佈一個簡短但完整的例子,那真的會有所幫助... – 2010-07-30 16:27:21

+0

我可以使用斷點確認UpdateUI被調用,但是感謝提示,抱歉不提這個。 – niemiro 2010-07-30 17:51:45

回答

2

修改你的代碼中加入一行到方法:

public void UpdateUI() 
{ 
    label3.Enabled = true; 
    this.Show(); 
} 

如果我的猜測是正確的,你現在可以看到形式。一個帶有啓用標籤。

不可以,您不能使用新的操作符創建對現有窗體的引用。創建表單時必須存儲該引用,以便日後重用。

+0

感謝您的支持。我試過這個。我想我現在可能已經完成了,但需要由專家來執行。我沒有得到任何例外,只是沒有任何工作。當我添加新行時,我確實遇到了異常情況,然後加載了第二個窗口,但嚴重的是,所有標籤都被白色框覆蓋。 System.InvalidOperationException異常:DragDrop註冊未成功。 ---> System.Threading。ThreadStateException:在進行OLE調用之前,當前線程必須設置爲單線程單元(STA)模式。確保您的主要功能上標有STAThreadAttribute – niemiro 2010-07-30 17:55:47

+0

接上頁。我想我現在看到我的錯誤。這是(安全地)從背景工作者那裏調用的,這是我的問題,不是嗎?我需要從前端線程調用它?這是正確的,這是原因嗎?正如你所看到的,我對多線程相當陌生,但我可以說沒有任何東西在同一時間被訪問,我一直很小心。只是尋找異常,看看我能做些什麼。再次感謝所有人的幫助, Richard – niemiro 2010-07-30 17:58:26

+0

聽起來就像程序中的兩個錯誤。使用錯誤的表單引用*和*嘗試從錯誤的線程更新表單。先修復您的BGW代碼。 – 2010-07-30 18:02:44

2

你必須確保調用UpdateUI的代碼使用的是形式的正確實例(一個同你顯示),這樣你就沒有兩個實例,一個可見,一個隱藏。

此外,請確保UpdateUI只從UI線程調用(這是更普遍的事情,因爲這會給出一個錯誤,而不是沒有發生)。

如果這沒有幫助,請將代碼發送到您調用UpdateUI的位置(以及您獲取用於調用它的對象引用的位置)。

+0

我目前的電話是: ScanStatus ScanStatus = new ScanStatus(); ScanStatus.UpdateUI(); 這是正確的嗎?謝謝! – niemiro 2010-07-30 18:23:47

+0

@Richard:由於您正在創建'ScanStatus'的新實例,因此看起來不正確。您需要跟蹤對原始表單的引用。 – 2010-07-30 18:40:43

+0

謝謝!這是需要修復的一件更重要的事情,並且由您修復! – niemiro 2010-07-31 06:43:50

1

你是否遇到了跨線程異常?也許你正在從非UI線程更新UI。考慮使用的BeginInvoke()

+0

非常感謝。你是讓我想起前端和後端線程的人,非常感謝! – niemiro 2010-07-30 18:08:56

+0

再次感謝! Richard – niemiro 2010-07-31 06:44:47