官术网_书友最值得收藏!

2.5 SPListItem、SPFile和SPFolder對象

上一節講解了關于SharePoint列表和列表欄的相關內容。比對SQL數據庫,相當于確立了“數據表”的框架,本節將進行“數據表”內容的講解。在SQL中,一行行的數據構成了一張完整的數據表,在SharePoint里,一個個列表項構成了完整的列表,這一個個列表項就是本節要介紹的對象模型——SPListItem。

2.5.1 SPListItem對象

講解如何在代碼中應用這個對象之前,筆者先在上一節示例的列表中創建兩個列表項,用作測試數據。如圖2-13所示。

圖2-13 帶測試數據的示例列表

讀者可以直觀地看出,列表項就像是一行行的數據,下面的代碼演示如何獲取這兩條數據:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPList customList = web.GetList(web.Url + "/Lists/List/");
                    SPListItemCollection listItems = customList.Items;
                    foreach (SPListItem item in listItems)
                    {
                       Console.WriteLine(string.Format("Item Title: {0}; Item
Content: {1}", item["標題"], item["公告內容"]));
                    }
              }
    }

根據最佳實踐的原則,不推薦通過SPList對象的Items屬性獲取列表項的集合到內存中而是使用GetItemById或者加入查詢條件等方法,如果一定要獲取并遍歷全部列表項的集合,建議使用列表項集合對象SPListItemCollection進行緩存,這樣可以防止在遍歷列表項時每次循環都進行讀取操作。

就像SQL數據表的行,在遍歷列表項集合時,對每一個列表項,通過列表字段來獲取列表項對應字段的值并輸出。輸出的結果如圖2-14所示。

圖2-14 獲取列表項數據輸出結果

接下來演示列表項的常用基本操作。

列表項的新增:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
             using (SPWeb web = site.OpenWeb())
             {
                   SPList customList = web.GetList(web.Url + "/Lists/List/");
                   SPListItem addedItem = customList.AddItem();
                   addedItem["標題"] = "公告C";
                   addedItem["公告內容"] = "公告C的內容";
                   addedItem.Update();
              }
    }

新增列表項調用SPList的AddItem方法獲得新增列表項的實例,相當于DataTable類的NewRow方法,然后對列表項的欄進行賦值,用[索引|名稱]指定具體的欄,最后執行SPListItem的Update方法。添加新列表項的時候一定會發生列表項的更新。

代碼執行后的效果如圖2-15所示。

圖2-15 添加新的列表項

列表項的修改:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
             using (SPWeb web = site.OpenWeb())
             {
                    SPList customList = web.GetList(web.Url + "/Lists/List/");
                    SPListItem itemToModify= customList.GetItemById(4);
                    itemToModify ["標題"] = "公告C改";
                    itemToModify ["公告內容"] = "公告C的內容改";
                    itemToModify.Update();
              }
    }

更新列表項,首先獲取到要更新的列表項實例,更新方式同上面的新增列表項操作。示例中使用SPListItem.GetItemById方法獲得列表項的實例,列表項的ID可以在頁面上通過查看列表項的URL獲得,右擊列表項,選擇屬性菜單,在彈出的窗口中,找到URL后面的ID屬性參數的值,該值即為列表項的ID,如圖2-16所示。更新后的效果如圖2-17所示。

圖2-16 通過查看列表項鏈接的屬性獲得列表項的ID

圖2-17 執行更新操作后的列表項

列表項的刪除:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
             {
                 using (SPWeb web = site.OpenWeb())
                 {
                    SPList customList = web.GetList(web.Url + "/Lists/List/");
                    SPListItem itemToDelete = customList.GetItemById(4);
                    itemToDelete.Delete();
                 }
             }

刪除列表項在獲取到列表項的實例之后執行SPListItem.Delete方法即可。

2.5.2 SPFile和SPFolder對象

SharePoint具有豐富的內容,文件和文件夾存在于網站內容層次和列表內容層次中的各個地方。文件和文件夾對應的對象模型分別為SPFile對象和SPFolder對象,學習該對象模型時讀者可以類比文件系統System.IO命名空間下的FileInfo類和DirectoryInfo類。

SPFile對象表示一個SharePoint網站中的文件,這個文件可以在網站中,也可以在文檔庫或普通列表的某個位置。

獲取SPFile對象可以使用SPWeb對象的GetFile方法或GetFileAsString方法,如果想返回集合SPFileCollection對象,可以使用SPWeb或SPFolder的Files屬性,該屬性表示網站(也可以看作是一個根文件夾)或文件夾的文件集合,使用[索引]獲取單個SPFile對象。

SPFolder對象表示SharePoint網站中的文件夾。

在這部分示例中筆者以SharePoint協作網站中默認的文檔庫為例。該文檔庫的名稱叫做文檔,在文檔庫中創建兩個文件夾并上傳一些文檔到文檔庫根目錄和兩個文件夾中。如圖2-18所示。

圖2-18 文檔庫示例數據

下面的代碼演示如何將該文檔庫的文件信息采用遞歸的方式全部讀取并打印出來。

    static void Main(string[] args)
    {
          using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
          {
                using (SPWeb web = site.OpenWeb())
                {
                   SPFolder docLibFolder = web.Folders'"Shared Documents"';
                   if (docLibFolder.Exists)
                   {
                      ReadDocInfo(docLibFolder);
                   }
                }
             }
          }
          static void ReadDocInfo(SPFolder folder)
          {
             SPFileCollection docFiles = folder.Files;
             foreach (SPFile docFile in docFiles)
             {
                 Console.WriteLine(string.Format("File Name: {0}, in folder {1},
size: {2} bytes", docFile.Name, folder.Name, docFile.Length));
             }
             SPFolderCollection subFolders = folder.SubFolders;
             foreach (SPFolder subFolder in subFolders)
             {
                ReadDocInfo(subFolder);
             }
    }

首先獲取到要讀取文件內容的根目錄,即上面所述的文檔庫,然后遞歸遍歷該目錄下的所有文件,運行結果如圖2-19所示,用這種方式遍歷還讀取出了列表中的系統文件,如DispForm.aspx、EditForm.aspx等。

圖2-19 獲取文檔庫中的文件信息

再演示一個將某個文件拷貝到另一個位置的例子:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPFile file = web.GetFile("/Shared Documents/文檔二.docx");
                    if (file.Exists)
                    {
                       SPFolder destFolder = web.GetFolder("/Shared Documents/文件
夾一");
                       if (destFolder.Exists)
                       {
                          byte[] content = file.OpenBinary();
                          destFolder.Files.Add("拷貝文檔二.docx", content, true);
                       }
                   }
              }
    }

在文檔庫這樣特殊的列表中,一個文檔同時也是一個列表項。因此在對象模型中,使用SPListItem對象或是SPFile對象都可以表示一個文檔,并且二者可以通過SPListItem.File和SPFile.Item互相轉換。

以上兩節所述常用對象模型是開發人員在開發過程中經常會使用到的,圖2-20展示了這些對象模型之間的層次結構關系,方便讀者加深認識和理解。

圖2-20 SPList、SPField、SPView、SPListItem、SPFile和SPFolder的層級關系

主站蜘蛛池模板: 河曲县| 正蓝旗| 亳州市| 永兴县| 明水县| 蓝田县| 临朐县| 永胜县| 安平县| 太仓市| 蕉岭县| 米林县| 乳源| 洮南市| 平乐县| 咸阳市| 筠连县| 乐业县| 自贡市| 茂名市| 璧山县| 子洲县| 贞丰县| 陵川县| 高尔夫| 东乡| 库尔勒市| 贵州省| 乌兰浩特市| 瑞安市| 宜宾市| 偃师市| 屏边| 富锦市| 射阳县| 手游| 碌曲县| 大同县| 阿拉善右旗| 濮阳市| 菏泽市|