2009-12-04 5 views
2

J'ai une hashtable que je veux mettre à jour à partir d'une deuxième hashtable. Pour l'une des clés qui correspondent, je veux copier la valeur. Le problème que j'ai est quand j'énumère les clefs de hashtable et essaye de lancer chaque à une chaîne que je reçois une exception au sujet de mouler un Guid à une chaîne. Eh bien c'est la chaîne que je veux. Lorsque vous utilisez l'opérateur d'index avec quelque chose comme hashtable ["FirstName"] alors je m'attends à ce que FirstName soit la clé. Il pourrait utiliser Guids sous je suppose mais j'ai besoin de sortir la chaîne pour la clé, la valeur clé.Comment obtenir la clé d'une entrée Hashtable

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 pas non plus de ces tables de hachage. Les clés ont des chaînes quelque part parce que je peux mettre le nom du champ comme suit et obtenir la valeur du champ. Je suis en train de faire un raccourci de faire ce qui suit pour tous les domaines:

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 le Hashtable utilise Guids, mais elle aussi a de toute évidence une chaîne dans le reste je ne voudrais pas être capable de faire infopathFields ["FirstName"]. C'est la valeur sur la chaîne que je passe là-bas que je veux.

+0

Je ne sais pas pourquoi vos Guids et vos cordes se mélangent, mais pourquoi utilisez-vous l'ancien Hasht? classe capable et pas le dictionnaire 2.0-et-dessus? –

+0

Je ne crée pas les hashtables. –

+1

J'ai voté parce que je n'apprécie pas que vous insultiez des gens qui ont essayé de vous aider. –

Répondre

7

Chaque élément est une paire clé/valeur 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(); 
+0

Juste ce que je suis après. Souhaite que certaines des autres tentatives auraient effectivement lu la question avant de répondre. Bravo –

+0

problème très commun sur ici – harryovers

+0

Juste un FYI, cela va ignorer les GUID, ce qui, selon votre question, vous ne vouliez pas faire. La chaîne de caractères fieldName = de.Key en tant que chaîne; aura le fieldName comme nul lorsque la clé est de type Guid. Alors l'instruction if renvoie false et le Guid est ignoré. Par conséquent, je ne pense pas que cette solution soit correcte. –

0

Qu'est-ce qui crée la table de hachage? la clé est en fait un objet de sorte que tout ce qui est peuplé n'a pas de caractère implicite

0

Si le type des valeurs de infopathFields est un Guid, alors les types de valeurs de workflowProperties devront être Guids. Je ne peux pas voir à partir de l'extrait quel workflowProperties est défini comme.

Pour convertir un Guid à une chaîne Guid.ToString() utiliser

+0

J'étais sur le point de poster quelque chose le long de ces lignes.Presque définitivement votre Hashtable utilise GUID comme valeur clé –

0

Les objets stockés dans la table de hachage sont des objets Guid, afin d'obtenir une chaîne que vous devez appeler ToString() sur l'objet que vous obtenez de la recenseur clé. Je recommande également d'utiliser la classe générique Dictionary<K,V> au lieu de Hashtable, car cela intercepterait des problèmes comme celui-ci au moment de la compilation plutôt que de l'exécution.

+0

Je ne crée pas les hashtables. Un formulaire infopath génère la hashtable quand il est soumis et sharepoint expose sa propre hashtable pour chaque élément d'une liste afin que vous puissiez accéder aux champs. –

1

La version standard de Hashtable peut avoir différentes clés de type, donc la plupart de vos clés peuvent être des chaînes, mais certaines de vos clés peuvent être des GUID. Je suis prêt à parier que c'est le cas et cause votre problème. La petite application de console suivante illustre 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.

Ma suggestion pour résoudre le problème serait d'aller avec les éléments suivants

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

Si l'objet sortant de .Keys est un Guid, le convertir en une chaîne me donnera juste le Guid en format de chaîne. –

0

Pour obtenir la plus grande clé entière de la table de hachage :

public class Example 
{ 
    public void hashTableMethod() 
    { 
     Hashtable ht = new Hashtable(); 
     ht.Add(5002894, "Hemant Kumar"); 
     ht.Add(5002895, "Himanshee Ratnakar"); 
     ht.Add(5002896, "Pooja Bhatnagar"); 
     ht.Add(5002897, "Hina Saxena"); 
     ht.Add(5002898, "Kanika Aneja"); 
     ht.Add(5002899, "Hitesh Chaudhary"); 

     Console.Write("\nNumber of Key-Value pair elements in HashTable are : {0}",ht.Count); 
     Console.WriteLine("Elements in HashTable are: "); 
     ICollection htkey = ht.Keys; 
     foreach (int key in htkey) 
     { 
      Console.WriteLine("{0}. {1}",key,ht[key]); 
     } 
     string ch="n"; 
     do 
     { 
      Console.Write("\n\nEnter the name to check if it is exist or not, if not then it will add: "); 
      string newName=Console.ReadLine(); 
      if(ht.ContainsValue(newName)) 
      { 
       Console.Write("\nYour Name already Exist in the list!!"); 
      } 
      else 
      { 
       Console.Write("\nSorry that name doesn't exist but it will be added!!"); 
       int getKey = 0; 

       int[] htk= new int[ht.Count]; 
       ht.Keys.CopyTo(htk,0); 

       string[] val=new string[ht.Count]; 
       ht.Values.CopyTo(val,0); 

       Array.Sort(htk,val); 
       foreach (int id in htk) 
       { 
        getKey = id; 
       } 
       ht.Add(getKey+1,newName); 
      } 
      Console.Write("\nDo you want to search more??(y/n) :"); 
      ch=Console.ReadLine(); 
     }while(ch=="y"||ch=="Y"); 

     Console.Write("\nNew List Items: \n"); 
     ICollection htkeys = ht.Keys; 
     foreach (int key in htkeys) 
     { 
      Console.WriteLine("{0}. {1}",key,ht[key]); 
     } 
    } 
}