4 votes

Comment obtenir la clé d'une entrée de Hashtable ?

J'ai une table de hachage que je veux mettre à jour à partir d'une seconde table de hachage. Pour toutes les clés qui correspondent, je veux copier la valeur. Le problème que j'ai est que lorsque j'énumère les clés de la table de hachage et que j'essaie de les convertir en chaîne, je reçois une exception concernant la conversion d'un Guid en chaîne. Or, c'est la chaîne que je veux. Lorsque vous utilisez l'opérateur d'indexation avec quelque chose comme hashtable["FirstName"], je m'attends à ce que FirstName soit la clé. Il est possible d'utiliser des Guids en dessous, je suppose, mais j'ai besoin de sortir la chaîne pour la clé, la valeur de la clé.

private void UpdateSharePointFromInfoPath(Hashtable infopathFields)
{
    // Go through all the fields on the infopath form
    // Invalid Cast Exception Here
    foreach (String fieldName in infopathFields.Keys)
    {
        // If the same field is on sharepoint    
        if (workflowProperties.Item.Fields.ContainsField(fieldName))
        {
            // Update the sharepoint field with the new value from infopath
            workflowProperties.Item[fieldName] = infopathFields[fieldName];
        }
    }
    // Commit the changes
    workflowProperties.Item.Update();
}

EDIT Je ne crée aucun de ces hashtables. Les clés ont des chaînes quelque part, car je peux entrer le nom du champ comme suit et obtenir la valeur du champ. J'essaie de trouver une façon abrégée de faire ce qui suit pour chaque champ :

workflowProperties.Item["FirstName"] = infopathFields["FirstName"];
workflowProperties.Item["LastName"] = infopathFields["LastName"];
workflowProperties.Item["Address"] = infopathFields["Address"];
workflowProperties.Item["DOB"] = infopathFields["DOB"];
ect...

EDIT Il a été dit que la table de hachage utilise des Guids, mais il est évident qu'elle contient aussi une chaîne de caractères, sinon je ne pourrais pas faire infopathFields["FirstName"]. C'est la valeur de la chaîne que je passe à l'intérieur que je veux.

9voto

harryovers Points 1655

Chaque élément est une paire Clé/Valeur de format DictionaryEntry.

foreach (DictionaryEntry de in infopathFields)
        {        
            string fieldName = de.Key as string;         
                if (workflowProperties.Item.Fields.ContainsField(fieldName))        
                {           
                    workflowProperties.Item[fieldName] = infopathFields[fieldName];        
                }    
        }    

        workflowProperties.Item.Update();

1voto

La version standard de la table de hachage peut avoir des clés de différents types, de sorte que la plupart de vos clés peuvent être des chaînes de caractères, mais certaines de vos clés peuvent être des GUID. Je suis prêt à parier que c'est le cas et que c'est la cause de votre problème. La petite application console suivante démontre le problème.

    static void Main(string[] args)
    {
        System.Collections.Hashtable htable = new System.Collections.Hashtable();
        htable.Add("MyName", "WindyCityEagle");
        htable.Add("MyAddress", "Here");
        htable.Add(new Guid(), "That Was My Guid");

        int loopCount = 0;
        foreach (string s in htable.Keys)
        {
            Console.WriteLine(loopCount++.ToString());
            Console.WriteLine(htable[s]);
        }
    }

Vous obtiendrez exactement la même exception que celle que vous signalez ici.

Pour résoudre ce problème, je vous suggère d'opter pour les solutions suivantes

private void UpdateSharePointFromInfoPath(Hashtable infopathFields)
{
    // Go through all the fields on the infopath form
    // Invalid Cast Exception Here
    foreach (object key in infopathFields.Keys)
    {

        string wfpKey = key.ToString();
        // If the same field is on sharepoint    
        if (workflowProperties.Item.Fields.ContainsField(wfpKey))
        {
            // Update the sharepoint field with the new value from infopath
            workflowProperties.Item[wfpKey] = infopathFields[key];
        }
    }
    // Commit the changes
    workflowProperties.Item.Update();
}

0voto

Pharabus Points 4664

Qu'est-ce qui crée la table de hachage ? La clé est en fait un objet, donc il semble que ce qui l'a peuplé n'a pas de cast implicite vers une chaîne de caractères.

0voto

jbloomer Points 2000

Si le type des valeurs de infopathFields est un Guid, les types des valeurs de workflowProperties devront être des Guids. Je ne vois pas dans le snippet ce que workflowProperties est défini comme.

Pour convertir un Guid en une chaîne de caractères, utilisez Guid.ToString()

0voto

thecoop Points 23695

Les objets stockés dans la table de hachage sont des objets Guid, donc pour obtenir une chaîne de caractères vous devez appeler ToString() sur l'objet que vous obtenez de l'énumérateur de clés. Je recommanderais également d'utiliser la fonction générique Dictionary<K,V> au lieu de Hashtable, car cela permettrait de détecter les problèmes de ce type à la compilation plutôt qu'à l'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X