Question

Je ne peux pas le croire, cela fonctionne dans mon autre application, mais dans celui-ci, qui a une structure similaire - il n'a pas

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

La façon dont je l'appelle:

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

Si je l'appelle de la fonction où je reçois paquet (je veux le mettre sur le listView) sur TCP - Rien ne se passe, mais si je l'appelle dans cette même classe où j'initialiser WinSock -. Cela fonctionne

Si le problème pourrait être?

EDIT: Je viens débogués l'application, formZ est nulle à l'endroit où je l'appelle (fonction de réception). Pourquoi est-il nul là-bas, mais pas à tout autre endroit?

Était-ce utile?

La solution

Je ne pense pas, il va résoudre votre problème, mais avez-vous pensé à utiliser le modèle suivant pour faire le Invoke? Je considère qu'il est beaucoup plus facile à lire. Créer cette méthode d'extension.

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();
         }
      }
   }
}

Et vous pouvez effectuer fil méthode sûre appelle comme ça.

Form form = new Form();

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

Ou plusieurs appels à la fois.

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

UPDATE

Le problème est donc clairement Form.ActiveForm retour null.

  1. Il n'y a aucune forme active au moment de l'appel.
  2. Le fil n'a pas l'autorisation d'obtenir la forme active - états MSDN

Autres conseils

Si ActiveForm retourne null vous pourriez ne pas avoir une forme active ou il est pas de type Form1. Vous utilisez « comme Form1 », donc si vous avez un Form2 qui est actif alors formZ sera réglé sur null.

Pouvez-vous passer formZ dans la fonction au lieu d'appeler ActiveForm?

Vérifiez si vous êtes en mode débogage; Si oui, le forme active valeur retournée sera nulle.

scroll top