SharePoint中的列表(List) 与Content Type 之二

SharePoint的Web Part Galleries还有Master Page Galleries都是基于特制化了的文档库的实现.

 

在一个更低的层次, WSS使用base types来对列表类型进行分类. 标准列表的base type是0, 而文档库的base type是1. 还有不那么常用的base type, 讨论论坛(3), 投票或调查列表(4), 问题列表 (5). base type定义了一个通常的column的集合, 基于相同base type的所有的列表类型会自动地集成这些column. 比如说, 每一个内建的base type定义了一个ID field. 这个field能允许WSS在幕后通过一个独一无二的整数来跟踪每一个列表中的item, 跟踪每一个文档库中的文档. WSS还为文档库添加了几个column到base type的column集合中, 普通的列表类型并不需要这些column.

 

列表实例既可以有用户通过WSS的用户界面创建, 也可以由开发人员通过WSS的object model创建. 还可以通过在feature中添加一个CAML元素来创建一个列表实例. 让我们看一个基本的, 从内建的列表类型创建列表实例的代码例子吧.

 

下面的例子提供了创建列表实例的代码. 在创建一个列表之前, 代码会检查确保一个相同title的列表不会已经存在. 你会注意到代码遍历当前站点的列表, 检查每一个列表, 看是否有匹配的title. 如果一个匹配title的列表不存在, 这个应用程序中的代码就会创建一个新的实例, 类型是Announcements , 并添加一个link到Quick Lunch菜单中, 方便访问.

using Microsoft.SharePoint;

class Program
{
    static void Main()
    {
        using (SPSite site = new SPSite("http://localhost"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                string listName = "Litware News";
                SPList list = null;
                foreach (SPList currentList in web.Lists)
                {
                    if (currentList.Title.Equals(listName,
                                                 StringComparison.InvariantCultureIgnoreCase))
                    {
                        list = currentList;
                        break;
                    }
                }

                if (list == null)
                {
                    Guid listID = web.Lists.Add(listName,
                                                "List for big news items",
                                                SPListTemplateType.Announcements);
                    list = web.Lists[listID];
                    list.OnQuickLaunch = true;
                    list.Update();
                }
            }
        }
    }
}

 

注意, 最后部分在SPList上对Update方法的调用. 这个调用是必须的, 用来保存任何你对列表属性所作的修改, 比如说, 在这个例子里, 在OnQuickLaunch属性上赋值true.

 

列表还可以通过SPWeb类的GetList方法来访问到:

SPList announcementsList = web.GetList("/Lists/Announcements");

 

GetList方法使用到列表文件夹的站点相对路径, 或者是列表表单也的相对路径作为参数. 如果列表实例找不到, GetList方法会丢出一个类型为FileNotFoundException的异常. 检查一个列表是否存在而不抛出异常的唯一方式是遍历站点对象的列表, 检查是否存在.

 

GetList是一个通过URL访问列表的更好的方式. GetListFromUrl 和 GetListFromWebPartPageUrl 函数与GetList方法的功能一样, 但是会在失败时丢出更通用的SPException 异常, 而不是更加具有说明性的FileNotFoundException异常类型.

 

你得到了一个SPList对象的引用之后, 你可以创建一个新的列表项, 方法是向列表的items集合添加一个SPListItem对象.  SPListItem 是一个通用的item类型, 它拥有的fields是根据列表的fields来的. 你可以实用下面的代码创建和保存新的列表项:

SPListItem newItem = list.Items.Add();
newItem["Title"] = "Litware Goes Public!";
newItem["Body"] = " We all live in exciting times.";
newItem["Expires"] = DateTime.Now + TimeSpan.FromDays(2);
newItem.Update();

 

SPListItem对象的Update方法会commit掉对列表的修改. 如果你不调用Update方法, 列表项的数据就不会被保存. List的columns是通过显示名称来指定的. 他们也可以通过column的GUID来得到, 还可以通过从0开始的columns集合的索引来得到. 如果一个指定的fields不存在, 那么会丢出ArgumentException 异常. 在某些情形下, 你会想要遍历这些fields, 使用foreash语句来查看这个field是否真的存在.

foreach (SPField field in list.Fields)
{
    if (!field.Hidden && !field.ReadOnlyField)
        Console.WriteLine(field.Title);
}

 

遍历fields还可以在遍历列表项的时候变得有用. 你可以使用field集合来访问列表项中的数据. 为了限制显示出来的field, 你会想要仅显示用户可以编辑的fields, 如同下面代码展示的一样:

foreach (SPListItem item in list.Items)
{
    foreach (SPField field in list.Fields)
    {
        if (!field.Hidden && !field.ReadOnlyField)
            Console.WriteLine("{0} = {1}", field.Title, item[field.Id]);
    }
}

 

摘译自:

Inside WSS 3.0 第六章

 

 

posted on 2010-03-07 21:47  中道学友  阅读(1813)  评论(0编辑  收藏  举报

导航

技术追求准确,态度积极向上