2009-04-25 6 views
0

Я не могу в это поверить, это работает в моем другом приложении, но в этом, у которого есть сходная структура - это не так!Вызов из другой темы

public string ListAdd 
    { 
     set 
     { 
      if (listView1.InvokeRequired) 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        listView1.Items.Add(value); 
       }); 
      } 
      else 
      { 
       listView1.Items.Add(value); 
      } 
     } 
    } 

Так я называю это:

 var formz = Form.ActiveForm as Form1; 
     if (formz != null) 
      formz.ListAdd = "asdasdasdasd"; 

Если я называю его из функции, где я получаю пакет (я хочу поставить его на ListView) через TCP - ничего не происходит, но если я вызовите его в том же классе, где я инициализирую WinSock - он работает.

Где может быть проблема?

EDIT: Я просто отладил приложение, formz имеет значение null в том месте, где я его называю (функция получения). Почему это пусто, но не в каком-либо другом месте?

+0

Вы не должны делать такую ​​работу в настройщике свойств, подумайте об изменении ее на метод. –

ответ

2

Я не думаю, что это решит вашу проблему, но подумал ли вы об использовании следующего шаблона для вызова? Я считаю это более читаемым. Создайте этот метод расширения.

public static class ControlExtension 
{ 
    public static void ThreadSafeInvoke(this Control control, MethodInvoker method) 
    { 
     if (control != null) 
     { 
     if (control.InvokeRequired) 
     { 
      control.Invoke(method); 
     } 
     else 
     { 
      method.Invoke(); 
     } 
     } 
    } 
} 

И тогда вы можете выполнять такие вызовы, как это.

Form form = new Form(); 

form.ThreadSafeInvoke(() => form.Text = "ThreadSafeInvoke"); 

Или несколько вызовов одновременно.

form.ThreadSafeInvoke(() =>     
{ 
    form.Text = "ThreadSafeInvoke"; 
    form.Visible = true; 
    form.WindowState = FormWindowState.Maximized; 
}); 

UPDATE

Таким образом, проблема явно Form.ActiveForm возвращение null.

  1. Активна форма активной формы на момент совершения звонка.
  2. Нить не имеет права на получение активной формы - MSDN заявляет, что требуется UIPermission.
1

Если ActiveForm возвращает null, то у вас может не быть активной формы или она не имеет тип Form1. Вы используете «как Form1», поэтому, если у вас есть Form2, который активен, тогда formz будет установлен в null.

Можете ли вы передать formz в функцию вместо вызова ActiveForm?

+0

У меня есть только одна форма, и я использую async (WSAAsyncSelect()) для выполнения моих соединений. Нет, я не могу назначить Form1 var, который еще не был инициализирован. –

+0

Итак, что возвращает Form.ActiveForm? Нуль или форма другого типа Form1? –

+0

null //Comment.length = 15; –

0

Проверьте, находитесь ли вы в режиме отладки; Если это так, возвращается активная форма.

Смежные вопросы