![](/img/trans.png)
[英]An empty DataTable with column names from SharePoint 2010 List
[英]SharePoint List => DataTable with Title names
我正在訪問這樣的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; 職稱:女士(夏季)
如您所見,sharepoint通過使用Unicode附加字符來存儲內部名稱。 名稱僅存儲在“ FL.Title”中,因為用戶可以在共享點列表中看到它。
現在,我想將此數據放入DataTable中並對其進行過濾。 我可以這樣:
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個字符,導致剪切的名稱不再完整。
是否有可能從ListItem.FieldValues
的KeyValuePair
中的Listcolumns獲取標題? 實際上, KeyValuePairs
是這樣構建的:
<br>
It.FieldValues.Key = //Column as Internal Name
It.FieldValues.Value = //Value
我需要:
It.FieldValues.Key = //Column as Title
It.FieldValues.Value = //Value
提前謝謝你,揚
好的,我找到了一種將共享點列表加載到具有field.Title作為Title列的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();
}
這將檢查您的顯示名稱,但使用靜態名稱提取值。
干杯!
用這種方式替換您的代碼行,您將獲得字段集合,在那里您可以通過內部名稱,靜態名稱和顯示名稱來獲取字段。
Microsoft.SharePoint.Client.ListItemCollection LIC = SPList.GetItems(cQuery).Fields;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.