65.9K
CodeProject 正在变化。 阅读更多。
Home

通过代码管理 SPList

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2010年7月4日

CPOL

4分钟阅读

viewsIcon

50687

downloadIcon

605

通过代码管理您的 SharePoint 列表。

引言

使用 MOSS 2007 很容易,因为您可以创建自己的列表并通过 SharePoint 网站设置进行管理。但是,当我们开始在 SharePoint 下构建网站时,我们需要通过代码管理和自定义这些列表。我使用 Microsoft.SharePoint.dll 创建了一个小网站来管理 SharePoint 列表。

背景

我的网站首先访问在我的计算机上本地创建的 SharePoint 网站。第一步是访问 SPSite 并获取当前的 SharePoint 网站 (SPWeb)。 之后,我们可以开始读取所有网站列表,并通过 SPList 开始管理它们,每个列表都有一个 SPListItem 列表。

Using the Code

使用 Microsoft.SharePoint 命名空间,我们首先获取当前的 SPWeb。 对于 SPSite,我们需要指定我们正在使用的 SharePoint 网站的 URL

SPSite site = new SPSite("https://:48/");
SPWeb myWeb = site.OpenWeb();

//to enable editing from this website
myWeb.AllowUnsafeUpdates = true;

dgvLists.DataSource = myWeb.Lists;
dgvLists.DataBind();

myWeb.Close();
site.Close();
AllUnssite.Close();

AllUnsafeUpdates 设置为 true,因为我们正在从 SharePoint 外部修改网站列表。

如上图所示,我们将获得当前网站中内置或自定义的所有列表。 现在,我们可以通过单击“编辑”按钮来管理我们需要管理的任何列表,或者我们也可以从该页面添加一个新列表。

要添加新的 SPList,我们可以使用以下函数

Guid guid = Guid.Empty;
SPListTemplateType type = (SPListTemplateType)int.Parse(ddlType.SelectedValue);
guid = myWeb.Lists.Add(txtListName.Text, txtDescription.Text, type);

SharePoint 中的每个列表都有其唯一的标识符;此函数将其作为 GUID 返回,可用于其他目的。 每个列表都有其标题、描述和 SPListTemplateType

img5.jpg

现在要编辑现有列表,我们首先必须检查该列表中可用字段的列表,并确定哪些字段是只读的、必需的、可编辑的...要获取列表信息,我们只需要知道它的标题或列表名称,使用以下函数

SPList list = myWeb.Lists[txtListName.Text];

获取 SPList 后,我们可以使用 SPField 列表循环遍历列表的 Fields,并创建一个虚拟表,其中包含用户可以修改的列表项(非只读字段)。

if (list != null)
{
    dgvFields.DataSource = list.Fields;
    dgvFields.DataBind();

    DataTable dt = new DataTable();
    foreach (SPField field in list.Fields)
    {
        if (field.Title == "Property Bag")
            continue;

        if (!field.ReadOnlyField || field.Title == "ID")
        {
            DataColumn col = new DataColumn();

            col.ColumnName = field.Title;
            col.ExtendedProperties.Add("Type", field.TypeAsString);
            col.ExtendedProperties.Add("Required", field.Required);

            if (!dt.Columns.Contains(col.ColumnName))
                dt.Columns.Add(col);
        }
    }

    foreach (SPListItem item in list.Items)
    {
        DataRow row = dt.NewRow();
        foreach (SPField field in item.Fields)
        {
            if (field.Title == "Property Bag")
                continue;

            if (!field.ReadOnlyField || field.Title == "ID")
            {
                row[field.Title] = item[field.Title];
            }
        }
        dt.Rows.Add(row);
    }
    Session["CurrentTable"] = dt;
    dgv.DataSource = dt;// list.Items.GetDataTable();
    dgv.DataBind();
}

在此步骤中,我们需要填写页面中的两个网格:第一个网格包含我们正在编辑的 SPList 中的 SPField 列表,第二个网格包含根据选定的非 ReadOnlyField 字段构建的自定义 DataTable。 或者,我们可以使用默认生成的 DataTable

dgv.DataSource = list.Items.GetDataTable(); 
dgv.DataBind();

如上图所示,您现在可以看到这两个网格。 第二个网格仅包含每个 SPList 中的可编辑数据。

我们还可以向此列表添加新字段

if (list != null)
{
    int type = 0;
    int.TryParse(ddlFieldTypes.SelectedValue, out type);

    list.Fields.Add(txtField.Text, (SPFieldType)type, chkRequired.Checked);
    list.Update();
}

img4.jpg

对于每个新添加的字段,我们需要指定字段名称、SPFieldType 以及它是否是必需的。 list.Update() 用于将修改添加到 SharePoint 数据库中。 SPFieldType 是变量,可以是 NumberText、另一个 List...

现在,在第二个网格中,如果我们单击“编辑”或“添加”,则可以修改此 SPListItem 的现有数据

img3.jpg

正如您所看到的,字段是根据每个字段的类型自动生成的;文本被替换为文本框,布尔值被替换为是/否单选按钮,未知类型或只读字段被替换为标签。

protected void dgv_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Modify")
    {
        int index = Convert.ToInt32(e.CommandArgument);
        DataTable dt = (DataTable)Session["CurrentTable"];

        DataRow row = dt.Rows[index];
        List<SpecificItem> items = new List<SpecificItem>();
        
        txtId.Value = row["ID"].ToString();

        foreach (DataColumn col in dt.Columns)
        {
            SpecificItem item = new SpecificItem();

            item.ID = int.Parse(row["ID"].ToString());
            item.ItemDisplay = col.ColumnName;
            item.ItemType = col.ExtendedProperties["Type"].ToString();
            item.ItemValue = row[col.ColumnName];

            items.Add(item);
        }
        Session["CurrentRow"] = items;

        rptItems.DataSource = items;
        rptItems.DataBind();
        listItems.Visible = true;
    }
    else if (e.CommandName == "Remove")
    {
        int index = Convert.ToInt32(e.CommandArgument);
        DataTable dt = (DataTable)Session["CurrentTable"];

        DataRow row = dt.Rows[index];
        int id = 0;
        int.TryParse(row["ID"].ToString(), out id);

        list = myWeb.Lists[txtListName.Text];
        if (list != null)
        {
            list.Items.DeleteItemById(id);

            FillGrids();
        }
    }
}

SpecificItem 是一个类,用于访问将提供给 Repeater 的自定义列表,以便允许轻松修改 SPListItem。 这个类包括

public class SpecificItem
{
    public int ID
    {
        get;
        set;
    }
    public string ItemType
    {
        get;
        set;
    }
    public string ItemDisplay
    {
        get;
        set;
    }
    public object ItemValue
    {
        get;
        set;
    }
}

现在,Repeater 将具有一个数据源,该数据源包含 SpecificItem 列表。 对于每个 SpecificItem,我们可以检查类型并添加合适的控件以允许编辑 SPListItem

保存时使用向后步骤。 我们将检查提供给 RepeaterSpecificItem,并将类型与 SPListItem 匹配,然后保存 SPListItem

list = myWeb.Lists[txtListName.Text];
int id = 0;
int.TryParse(txtId.Value, out id);

List<SpecificItem> items = new List<SpecificItem>();
SPListItem item = null;
if (id > 0)
{
    item = list.Items.GetItemById(id);
    items = (List<SpecificItem>)Session["CurrentRow"];
}
else
{
    item = list.Items.Add();
    DataTable dt = (DataTable)Session["CurrentTable"];
    foreach (DataColumn col in dt.Columns)
    {
        SpecificItem i = new SpecificItem();

        i.ItemDisplay = col.ColumnName;
        i.ItemType = col.ExtendedProperties["Type"].ToString();
        //  i.ItemValue = row[col.ColumnName];

        items.Add(i);
    }
}

//
foreach (SpecificItem i in items)
{
    foreach (string key in Request.Form.AllKeys)
    {
        if (key.IndexOf("txt" + i.ItemType + "_" + 
            i.ID + "_" + i.ItemDisplay.Replace(" ", "")) >= 0)
        {
            if (key.IndexOf("DateTime") >= 0)
            {
                DateTime date = new DateTime();
                DateTime.TryParse(Request.Form[key], out date);

                if (date != DateTime.MinValue)
                    item[i.ItemDisplay] = date;
            }
            else
                item[i.ItemDisplay] = Request.Form[key].ToString();
            break;
        }

        if (key.IndexOf("chk" + "_" + i.ID + "_" + 
               i.ItemDisplay.Replace(" ", "")) >= 0)
        {
            // Convert.ToBoolean(Request.Form[key]);
            item[i.ItemDisplay] = Request.Form[key] == "yes";
            break;
        }

        if (key.IndexOf("txt" + i.ItemType + "_" + i.ID + "_" + 
            i.ItemDisplay.Replace(" ", "")) >= 0 && 
            (key.IndexOf("Integer") > 0 || key.IndexOf("Number") > 0))
        {
            if (key.IndexOf("Integer") >= 0)
            {
                int val = 0;
                int.TryParse(Request.Form[key].ToString(), out val);

                item[i.ItemDisplay] = val;
            }
            else
            {
                double d = 0;
                double.TryParse(Request.Form[key].ToString(), out d);
                item[i.ItemDisplay] = d;
            }
            break;
        }
    }
}

item.SystemUpdate();

SPListItem 项是一个字段数组。 要修改每个字段,我们需要获取字段标题并放置其值。 item.SystemUpdate() 将把列表项保存到数据库中。

在获取 SPListItem ID 后,我们还可以从列表中删除 SPListItem

list.Items.DeleteItemById(id);

通过这种方式,我们已经查看、编辑、删除、完全管理了任何 SPList,而无需访问 SharePoint 网站。

关注点

有关 Microsoft.SharePoint 命名空间的更多详细信息,您可以查看以下链接: Microsoft.SharePoint 命名空间

© . All rights reserved.