簡體   English   中英

C#啟用菜單項

[英]C# enabling menu item

關於下載文件,我有一條try-catch語句。 下載文件后,我將啟用我的菜單項之一,然后關閉計時器設置,以在一分鍾內重試下載。

我的問題是由於某種原因我的trafficManagementToolStripMenuItem.Enabled = true; 即使啟用了菜單項,該行仍在激活catch語句。 該文件正確下載,當我注釋掉該行時,它可以正常運行。 但是每次運行它時,都會出現“錯誤”消息框,即使下載完成后菜單項已正確啟用,計時器也不會被禁用。

有任何想法嗎?

try
{
    ////downloads Data

    string address = "http://website.file.txt";
    string filename = "vsd.txt";
    WebClient client = new WebClient();
    client.DownloadFile(address, filename);
    trafficManagementToolStripMenuItem.Enabled = true;
    timer1.Enabled = false;
}
catch
{
    timer1.Enabled = true;
    MessageBox.Show("error", "test");
}

您沒有說什么例外,但是我猜您正在后台線程中運行下載例程,對嗎? 您只能從創建控件的線程(主UI線程)訪問控件。 從后台線程訪問諸如ToolStripMenuItem之類的控件將導致異常。

如果是這種情況,請使用Control.Invoke或Control.BeginInvoke方法在ToolStripMenuItem的線程上運行.Enabled = true調用。 為此,您需要一個控件(不幸的是ToolStripMenuItem只是一個組件)。 我假設您可以從某處獲得對包含Form的引用。 現在,您可以編寫以下代碼:

Action enableAction = delegate() { trafficManagementToolStripMenuItem.Enabled = true; }
form.BeginInvoke(enableAction);

這將導致enableAction到正確的UI線程上運行form

改變你的收獲

catch (Exception ex) 
{ 
    timer1.Enabled = true; 
    MessageBox.Show("error", ex.Message); 
}

這至少會給您實際的錯誤信息。

我猜是因為您沒有在UI線程中運行,而需要使用Control.Invoke,請看一下http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control。 msdn上的invokerequired.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM