2017-05-15 2 views
0

J'accéder à une liste SharePoint comme ceci:SharePoint List => DataTable avec les noms de titre

#region Accessing share point 
     Microsoft.SharePoint.Client.ClientContext cC = new Microsoft.SharePoint.Client.ClientContext(Link); 
     cC.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     Microsoft.SharePoint.Client.List SPList = cC.Web.Lists.GetByTitle(ListName); 
     cC.Load(SPList.Fields); 
     Microsoft.SharePoint.Client.FieldCollection Fields = SPList.Fields; 
     #endregion 


Looping les champs, j'ai toutes les informations nom pour les différents domaines. Je peux le faire comme ceci:

  int i = 0; 
     foreach(Microsoft.SharePoint.Client.Field FL in Fields) 
     { 
      WriteLine("Index: " + i++ + "; Internal name: " + FL.InternalName + "; Static name: " + FL.StaticName + "; Title: " + FL.Title); 
     } 


L'exportation ressemble à ceci:

Index 5; Nom interne: Lieferant_x0020__x0028_Nummer_x0; Nom statique: Lieferant_x0020__x0028_Nummer_x0; Titre: Lieferant (Nummer)

Comme vous pouvez le voir, sharepoint stocke le nom interne en utilisant unicode pour les caractères supplémentaires. Seulement dans "FL.Title" le nom est stocké comme l'utilisateur peut le voir sur la liste des points de partage.
Maintenant, je veux mettre ces données dans un DataTable et le filtrer. Je peux le faire comme ceci:

 Microsoft.SharePoint.Client.CamlQuery cQuery = new Microsoft.SharePoint.Client.CamlQuery(); 
     cQuery = Microsoft.SharePoint.Client.CamlQuery.CreateAllItemsQuery(); 
     Microsoft.SharePoint.Client.ListItemCollection LIC = SPList.GetItems(cQuery); 
     cC.Load(LIC); 
     cC.ExecuteQuery(); 
     dt = new DataTable(); 

     #region Create columns 
     foreach (var Field in LIC[0].FieldValues) 
     { 
      dt.Columns.Add(Field.Key); 
     } 
     #endregion 

     #region Reading data 
     foreach (Microsoft.SharePoint.Client.ListItem It in LIC) 
     { 
      System.Data.DataRow row = dt.NewRow(); 

      foreach(var Field in It.FieldValues) 
      { 
       row[Field.Key] = Field.Value; 
      } 
      dt.Rows.Add(row); 
     } 
     #endregion 

le problème est que dans le ListItemCollection, seul le InternalName avec des caractères supplémentaires comme Unicode sont disponibles. Je ne peux pas non plus l'encoder car SharePoint 2010 ne comporte que 32 caractères pour les noms internes menant à des noms de découpage qui ne sont plus complets.

Est-il possible d'obtenir le titre à partir des colonnes List dans le KeyValuePair du ListItem.FieldValues? En fait, les KeyValuePairs sont construits comme ceci:

<br> 
It.FieldValues.Key = //Column as Internal Name 
It.FieldValues.Value = //Value 

J'ai besoin:

It.FieldValues.Key = //Column as Title 
It.FieldValues.Value = //Value 

Merci à l'avance, Jan

Répondre

0

Remplacez votre ligne de code avec la suite de cette façon, vous obtiendrez le champ collection et là vous pouvez obtenir des champs par nom interne, nom statique et nom d'affichage.

Microsoft.SharePoint.Client.ListItemCollection LIC = SPList.GetItems(cQuery).Fields; 
+0

Non, cela provoque une erreur. Aucune méthode n'est autorisée après (cQuery). – CJens

0

Ok, j'ai trouvé une solution pour charger la liste de sharepoint à un DataTable ayant le field.Title utilisé comme colonnes Titre.

S'il vous plaît trouver le code:

 private System.Data.DataTable GetDataFromSharePointWithFilter(System.Uri Link, string ListName) 
    { 
     #region GetDataFromSharePoint 
     string connectionString = GenerateConnectionString(Link, ListName); 
     System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connectionString); 
     conn.Open(); 

     string strSQL = "SELECT * FROM LIST"; 
     System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(strSQL, conn); 
     DataSet ds = new DataSet(); 

     ds.Locale = System.Globalization.CultureInfo.InstalledUICulture; 
     System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(cmd); 
     da.Fill(ds); 
     #endregion 

     #region Transfer data to DataTable 
     return ds.Tables[0]; 
     #endregion 
     } 

Si la boucle I toutes les colonnes, leur titre est correct. Mais le contenu de la liste n'est pas stocké correctement. Dans ListColumn, des valeurs comme 000, 001, 008 ou 0028 sont stockées - en format texte. Et le code ci-dessous lit par exemple 008 comme 45. Dans une autre colonne, un nom est tapé par exemple Schneider, Markus et mon programme renvoie 24.

Est-ce que quelqu'un a une idée, pourquoi?

EDIT: a trouvé l'erreur, vous ne pouviez pas voir. Dans la chaîne de connexion, j'ai eu l'option RetrieveIds = Oui;. C'est la raison pour laquelle mon code répète le contenu incorrect.