1.SPWebApplication包含网站集,是网站集的容器。
获取当前系统下所有Web应用程序的集合:
SPWebApplicationCollection
webs =
SPWebService.ContentService.WebApplications;
2.SPSite和SPWeb
(1).SPSite:WebApplication下的网站集。SPSite的RootWeb代表网站集的顶级网站(首要网站)。
(2).SPWeb:代表网站集下的每个站点和子站点。访问站点的内容从SPWeb开始。
(3).关系:网站集SPSite是SPWeb的集合。
(4).获取网站
SPSite
site = new
SPSite("http://yang:9000");
使用AllWebs得到知识库子站点kb:
SPWeb
web =
site.AllWebs['kb'];
使用OpenWeb得到知识库子站点kb:
SPWeb
web =
site.OpenWeb("kb");
注意:OpenWeb方法中的参数是一个相对的地址。
(5).当在SharePoint环境中开发时,可以使用Http当前上下文Context来取得当前URL所对应的站点:
利用SPControl控件的上下文:
SPWeb
web =
SPControl.GetContextWeb(Context);
利用WSS对象的上下文SPContext
SPWeb
web =
SPContext.Current.Web;
顶级网站(首要网站)访问子网站kb下的KB列表:
string
listname = "KB";
SPWeb web =
SPControl.GetContextWeb(Context).Webs["kb"];
SPList
treeList =
web.Lists[listname];
子站点访问顶级网站(首要网站)下的tree分类列表:
string
sourceTreeList = "tree";
SPWeb rootweb =
SPControl.GetContextSite(Context).RootWeb;
SPList
treeList =
rootweb.Lists[sourceTreeLis];
3.列表对象
对象
说明
SPList
列表对象
SPListCollection
列表集合。SPWeb.Lists返回网站所有列表的集合
SPListItem
列表的项
SPListItemCollection
列表项的集合。SPList.Items返回列表的所有列表项
SPViewCollection
视图集合对象
SPViewFieldCollection
视图字段集合
SPView
视图对象
SPDocumentLibrary
特殊的列表-文档库对象
SPField
列表字段
SPFieldCollection
列表字段集合
(1).获取列表Case
SPWeb
web = SPControl.GetContextWeb(Context);
SPList list
= web.Lists["Case"];
(2).添加列表
SPWeb web
= SPControl.GetContextWeb(Context);
SPList list =
web.Lists["Case"];
SPListItemCollection lists =
list.Items;
SPListItem listItem =
list.Items.Add();
listItem["标题"] =
this.txtTitel.Text;
listItem["分类"] =
getTypeName();
listItem.Update();
(3).得到列表项
SPWeb
web = SPControl.GetContextWeb(Context);
SPList list
=
web.Lists["Case"];
//得到列表项的ID
Int
ID=1;
SPListItem listItem =
list.Items.GetItemById(ID);
if(listItem["分类"]
!=null)
{
this.Label1.Text
=
listItem["分类"].ToString();
}
(4).列表循环输出
SPSite
site = new SPSite("http://yang:9000");
SPWeb spweb =
site.OpenWeb();
SPList list =
spweb.Lists["Case"];
SPListItemCollection listitems
= list.Items;
foreach(SPListItem listitem in
listitems)
{
this.textbox1.Text
+= listitem["标题"].ToString() +
Environment.NewLine;
}
(5).删除列表
SPSite
site = new SPSite("http://yang:9000");
SPWeb web =
site.OpenWeb();
SPListCollection lists =
web.Lists;
//删除Case列表
SPList
list = lists["case"];
System.Guid listGuid =
list.ID;
lists.Delete(listGuid);
(6).操作视图
SPSite
site = new SPSite("http://yang:9000");
SPWeb spweb =
site.OpenWeb();
SPList list =
spweb.Lists["Case"];
//Case列表下的所有视图
SPViewCollection
listitems =
list.Views;
MessageBox.Show(listitems.Count.ToString());
//列出标题
foreach(SPView
oViewSrc in
listitems)
{
this.textbox1.Text
+= oViewSrc.Title +
Environment.NewLine;
}
//得到单个视图的信息
Guid
viewguid = list.Views["我的日常工作"].ID;
SPView
sv=list.GetView(viewguid);
SPListItemCollection
collItemsSrc =
list.GetItems(sv);
SPViewFieldCollection
collViewFields =
sv.ViewFields;
foreach(SPListItem oItemSrc in
collItemsSrc)
{
for(int
intIndex=0; intIndex<collViewFields.Count;
intIndex++)
{
this.textbox1.Text
+= collViewFields[intIndex].ToString() + "::" +
oItemSrc[collViewFields[intIndex]].ToString() +
Environment.NewLine;;
}
}
(7).列表到DataTable
a.使用SPListItemCollection列表项的集合对象的GetDataTable方法
private
DataTable
GetData()
{
string
sourceTreeList = "tree";
SPWeb
rootweb =
SPControl.GetContextSite(Context).RootWeb;
SPList
treeList =
rootweb.Lists[sourceTreeList];
SPListItemCollection
Items = treeList.Items;
return
Items.GetDataTable();
}
b.自定义实现列表对象转化为DataTable
string[]
pSourceSPListFields =
{"ClassID","ClassName","ParentID"};
private
DataTable _sourceDataTable;
private DataTable
ListToDataTable()
{
//构造表头
this._sourceDataTable
=
this.ColumnNameDataTable();
SPWeb
web =
SPControl.GetContextWeb(Context);
SPList
treeList =
web.Lists[sourceTreeList];
DataTable
dt = new
DataTable();
SPListItemCollection
caseItems =
treeList.Items;
foreach(SPListItem
caseItem in
caseItems)
{
try
{
DataRow
rowNew=
_sourceDataTable.NewRow();
for(int
intI=0;intI<this.pSourceSPListFields.Length;intI++)
{
if(caseItem[pSourceSPListFields[intI]]
!=
null)
{
if(treeList.Fields[this.pSourceSPListFields[intI]].FieldValueType.ToString()
==
"Microsoft.SharePoint.SPFieldUserValue")
{
string
createUserName =
caseItem[this.pSourceSPListFields[intI]].ToString();
int
index =
createrUserName.Indexof(';');
int
createrUserID=
Convert.ToInt32(createUserName.Substring(0,index));
SPUser
createrUser =
web.AllUsers.GetByID(creater.UserID);
rowNew[pSourceSPListFields[intI]]
=
createrUser.Name;
}
else
{
Object
columnType=
_sourceDataTable.Columns[this.pSourceSPListFields[intI]].DataType;
rowNew[pSourceSPListFields[intI]]
=
caseItem[pSourceSPListFields[intI]];
}
}
}
_sourceDataTable.Rows.Add(rowNew);
}
catch
{
}
return
this._sourceDataTable;
}
}
构造表头
public DataTable
ColumnNameDataTable()
{
SPWeb web =
SPControl.GetContextWeb(Context);
SPList treeList =
web.Lists[sourceTreeList];
DataTable dt = new
DataTable();
SPListItemCollection castItems =
treeList.Items;
for(int intI=0;
intI<pSourceSPListFields.Length;intI++)
{
DataColumn
columnNew = new
DataColumn();
columnNew.ColumnName =
pSourceSPListFields[intI];
dt.Columns.Add(columnNew);
}
return
dt;
}
调用过程
private
DataTable
GetData()
{
return
ListToDataTable();
}
4.操作文档库
文档库具有列表的所有属性,但是作为文档库又具有文件格式的所有属性。列表中每个项目可以使用SPListItem对象来操作。文档库中的项目则可以使用SPFile对象来操作。
SPSite
site = new SPSite("http://yang:9000/kb");
SPWeb spweb =
site.OpenWeb();
SPFolder myFolder =
spweb.GetFolder("kb");
SPFileCollection myFiles =
myFolder.Files;
FileStream fStream =
File.OpenRead(@"c:\aaa.txt");
byte[] contents = new
byte[fStream.Length];
fStream.Read(contents,0,(int)fStream.Length);
fStream.Close();
string
path = site.Url + "/kb/KB/";
string filename=
DateTime.Now.ToString().Replace(" ","").Replace(":","")+".txt";
SPFile file =
myFile.Add(path+filename,contents);
file.Item["知识库标题"] =
"测试知识库";
file.Item["分类"] = 4;
file.Item.Update();
使用SPFolder
myFolder=spweb.GetFolder("kb")代码段来得到文档库KB的文件夹。
之后使用SPFileCollection myFiles =
myFolder。Files来得到文件集合。然后使用myFiles.Add对象来添加一个文本文件,这里可以为任意文件。最后通过file对象的item来赋值并完成更新操作。
当然,还可以用操作列表的方法来操作文档库。通过file对象能够获取文件的版本、大小等信息。
5.操作用户和用户组
用户和用户组的对象模型
对象
说明
SPUSer
用户对象、域用户或者表单验证用户
SPUserCollection
用户对象的集合
SPGroup
用户组
SPGroupCollection
用户组的集合
(1).得到站点下所有的用户
SPSite
site = new SPSite("http://yang:9000");
SPWeb web=
site.OpenWeb();
foreach(SPUser user in
web.SiteUsers)
{
this.textbox1.Text += user.Name +
Environment.NewLine;
}
(2).得到站点小所有的用户组
SPSite site = new
SPSite("http://yang:9000");
SPWeb web= site.OpenWeb();
foreach(SPGroup
group in web.Groups)
{
this.textbox1.Text += group.Name +
Environment.NewLine;
}
6.查询
通过SPQuery类来完成对列表的查询操作。
SPQuery类的属性说明
属性
说明
ViewFields
查询结果中要显示的字段。这个属性的设置如:<FieldRef
Name="Title" />
Query
查询条件包括分组与排序条件
RowLimit
返回结果的行数
其中查询条件的设置需要满足CAML(协作应用程序标记语言)的语法标准。
CAML语言的操作符说明
操作符
说明
Geq
>=
EQ
=
Gt
>
Lt
<
Neq
!=
Contains
包含
使用CAML查询有一点需要清楚,在CAML语法中使用的字段名并不是创建的字段名,而是MOSS系统内部的名称InternalName,代码如下:
SPSite
site = new SPSite("http://yang:9000");
SPWeb spweb =
site.OpenWeb();
SPList list= spweb.Lists["case"];
SPListItemCollection
myItems = list.Items;
SPListItem item = myItems[0];
for(int
i=0;i<item.Fields.Count;i++)
{
this.textbox1.Text +=
item.Fields[i].Title + ":" + itme.Fields[i].InternalName +
Environment.NewLine;
}
通过运行结果,看到前面的正是MOSS中创建的字段,而冒号之后的则是系统内部处理的名称。如果把一个栏删除,再添加同样的栏,相应的InternalName会发生变化,需要重新获取。
接下来进行CAML的查询,从列表Case的标题中找到包含“计算机”的记录,并且显示5条。
在界面上增加了一个dataGridView表格控件。代码如下:
SPSite
site = new SPSite("http://yang:9000");
SPWeb spweb =
site.OpenWeb();
SPList list = spweb.Lists["case"];
SPQuery query = new
SPQuery();
query.ViewFields= "<FieldRef Name='Title'/><FieldRef
Name='_x95ee_x9898_x89e3_x51b3_x65'/><FieldRef
Name='Created'/>";
query.Query="<Where><Contains><FieldRef
Name='Title'/><Value
Type='Text'>计算机</Value></Contains></Where>";
query.RowLimit=5;
SPListItemCollection
myItems = list.GetItems(query);
this.dataGridView1.DataSource =
myItems.GetDataTable();
注意这个表格显示了标题、故障情况说明和创建时间。其中_x6545_x969c_x60c5_x51b5_x8b是故障情况说明字段的InternalName。如果把代码中<FieldRef
Name='Title'/>改成<FieldRef
Name='标题'/>,即:
query.Query="<Where><Contains><FieldRef
Name='标题'/><Value
Type='Text'>计算机</Value></Contains></Where>";
则系统会报告一个错误,如下:
一个或多个域类型未正确安装。请转到类表列表设置页删除这些域。