2010-09-15 2 views
14

Le bloc de code ci-dessous entraîne l'erreur: TargetParameterCountException n'a pas été gérée par le code utilisateur. Décalage de compte de paramètre.Non-concordance des comptes avec Invoke?

public void AddListViewItem(string[] Data) 
    { 
     if (InvokeRequired) 
     { 
      Invoke(new Action<string[]>(AddListViewItem), Data); 
     } 
     else 
     { 
      ListViewData.Items.Add(Data[0]).SubItems.AddRange 
      (
       new string[] 
       { 
        Data[1], 
        Data[2], 
        Data[3], 
       } 
      ); 
     } 
    } 

Des idées?

+0

Quelle est la signature de 'AddListViewItem'? –

+0

C'est juste là. Il l'appelle récursivement. – BFree

+1

Assurez-vous d'accepter la réponse qui a résolu votre problème. – BFree

Répondre

24

L'erreur se produit en raison de la covariance du tableau; un tableau de chaînes est assignable à object[]. Cela provoque la méthode Invoke pour traiter chaque élément du tableau string comme s'il devrait être un argument à la méthode AddListViewItem.

Voici une solution:

Invoke(new Action<string[]>(AddListViewItem), new object[] {Data}); 

(ou)

Invoke(new Action<string[]>(AddListViewItem), (object)Data); 

Cela rend cristal clair Invoke que la méthode cible prend un seul paramètre .

+0

Parfait! Merci! – sooprise

+0

@Ani, Pourriez-vous expliquer ce qu'est la covariance de tableau? mieux avec un exemple. Merci. – smwikipedia

+0

Merci! Cela me rendait fou. Votre premier exemple a bien fonctionné dans ma situation. Je passais un tableau d'objets, mais la méthode d'invocation n'est pas assez intelligente pour le gérer tel quel. Exemple ... '.Invoke (mysource, nouvel objet [] {myobjectarray});' –

0

MISE À JOUR informations:

Si vous utilisez Windows Server 2008 R2, jetez un oeil à Windows Update pour Net Framework pour 4.5.1 de Windows Server 2008 R2 systèmes x64 KB2858725. Pour moi, après avoir installé cette mise à jour a corrigé ce problème.

Questions connexes