首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#启用菜单项

C#启用菜单项
EN

Stack Overflow用户
提问于 2010-01-11 07:37:57
回答 2查看 952关注 0票数 0

关于下载文件,我有一个try-catch语句。下载文件后,我会启用其中一个菜单项,然后关闭设置为一分钟后重试下载的计时器。

我的问题是,由于某种原因,我的trafficManagementToolStripMenuItem.Enabled = true;行正在激活catch语句,即使菜单项已被启用。文件可以正确下载,当我注释掉这一行时,它可以很好地工作。但每次我运行它时,我都会收到“错误”消息框,并且计时器并未被禁用,即使菜单项在下载完成后正确启用。

有什么想法吗?

代码语言:javascript
复制
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");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-11 07:44:04

你没有说异常是什么,但我猜你是在后台线程中运行你的下载例程,对吗?您只能从创建控件的线程访问控件:主UI线程。从后台线程访问诸如ToolStripMenuItem之类的控件将导致异常。

如果是这种情况,请使用Control.Invoke或Control.BeginInvoke方法在ToolStripMenuItem的线程上运行.Enabled = true调用。为此,您需要一个控件(不幸的是,ToolStripMenuItem只是一个组件)。我假设您可以从某个地方获得对包含表单的引用。现在你可以这样写了:

代码语言:javascript
复制
Action enableAction = delegate() { trafficManagementToolStripMenuItem.Enabled = true; }
form.BeginInvoke(enableAction);

这会使enableActionform的正确UI线程上运行。

票数 4
EN

Stack Overflow用户

发布于 2010-01-11 08:12:06

把你的目标改成

代码语言:javascript
复制
catch (Exception ex) 
{ 
    timer1.Enabled = true; 
    MessageBox.Show("error", ex.Message); 
}

这至少会给出实际的错误消息。

我猜这是因为您没有在UI线程中运行,需要使用Control.Invoke,请看一下msdn上的http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2039129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档