Список SharePoint => Таблица данных с именами заголовков
Я получаю доступ к списку SharePoint следующим образом:
#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
Зацикливание полей, у меня есть вся информация об имени для различных полей. Я могу сделать это так:
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);
}
Экспорт выглядит так:
Индекс 5; Внутреннее имя: Lieferant_x0020__x0028_Nummer_x0; Статическое имя: Lieferant_x0020__x0028_Nummer_x0; Название: Lieferant (Nummer)
Как видите, sharepoint сохраняет внутреннее имя, используя юникод для дополнительных символов. Только в "FL.Title" имя сохраняется, так как пользователь может видеть его в списке sharepoint.
Теперь я хочу поместить эти данные в таблицу данных и отфильтровать их. Я могу сделать это так:
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
проблема в том, что в коллекции ListItemCollection доступно только внутреннее имя с дополнительными символами в качестве Unicode. Я также не могу закодировать его, потому что в SharePoint 2010 для внутренних имен есть только 32 символа, что приводит к сокращенным именам, которые больше не являются полными.
Есть ли возможность получить заголовок из столбцов списка в KeyValuePair
из ListItem.FieldValues
? На самом деле, KeyValuePairs
построены так:
<br>
It.FieldValues.Key = //Column as Internal Name
It.FieldValues.Value = //Value
Я нуждаюсь:
It.FieldValues.Key = //Column as Title
It.FieldValues.Value = //Value
Заранее спасибо, Ян
2 ответа
Хорошо, я нашел решение для загрузки списка sharepoint в DataTable с полем. Заголовок, используемый в качестве заголовка столбца.
Пожалуйста, найдите код:
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
}
Если я зациклю все столбцы, их заголовок будет правильным. Но содержимое списка хранится неправильно. В столбце Listcolumn такие значения, как 000, 001, 008 или 0028, сохраняются в текстовом формате. И приведенный ниже код читает, например, 008 как 45. В другом столбце вводится имя, например, Schneider, Markus, и моя программа возвращает 24.
У кого-нибудь есть идея, почему?
РЕДАКТИРОВАТЬ: нашел ошибку, вы не могли видеть. В строке подключения у меня был параметр RetrieveIds=Yes;, Это было причиной того, что мой код повторял содержимое неправильно.
Для тех, кто дошел до этого и не знает, что означает "цикл по столбцам", вы можете использовать этот код:
//Name of your field
if (field.Title == "YourFieldDisplayName" && oListItem[field.StaticName] != null)
{
dr["Title"] = oListItem[field.StaticName].ToString();
}
Это проверит ваше отображаемое имя, но будет использовать staticname для получения значения.
Ура!
Замените строку кода следующим образом: вы получите коллекцию полей, и там вы можете получить поля по внутреннему имени, статическому имени и отображаемому имени.
Microsoft.SharePoint.Client.ListItemCollection LIC = SPList.GetItems(cQuery).Fields;