C # включающий пункт меню - PullRequest
       10

C # включающий пункт меню

0 голосов
/ 11 января 2010

У меня есть оператор 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");
}

Ответы [ 2 ]

4 голосов
/ 11 января 2010

измените ваш улов на

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

Это по крайней мере даст вам фактическое сообщение об ошибке.

Я предполагаю, что это потому, что вы не работаете в потоке пользовательского интерфейса и вам нужночтобы использовать Control.Invoke, взгляните на http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx на msdn

4 голосов
/ 11 января 2010

Вы не говорите, что является исключением, но я предполагаю, что вы запускаете процедуру загрузки в фоновом потоке, верно? Вы можете получить доступ к элементам управления только из потока, который их создал: основного потока пользовательского интерфейса. Доступ к элементу управления, например, ToolStripMenuItem из фонового потока, вызовет исключение.

В этом случае используйте метод Control.Invoke или Control.BeginInvoke для запуска вызова .Enabled = true в потоке ToolStripMenuItem. Для этого вам понадобится элемент управления (к сожалению, ToolStripMenuItem является только компонентом). Я предполагаю, что вы можете получить ссылку на содержащую форму откуда-то. Теперь вы можете написать это:

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

Это заставляет enableAction работать в правильном потоке пользовательского интерфейса для form.

...