簡體   English   中英

SharePoint列表=>具有標題名稱的DataTable

[英]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.FieldValuesKeyValuePair中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM