通过创建MOSS2007自定义字段类来实现和基于TREEVIEW的OU组织结构菜单

来源:百度文库 编辑:神马文学网 时间:2024/04/29 06:29:57
通过创建MOSS2007自定义字段类来实现和基于TREEVIEW的OU组织结构菜单
网上一有一篇文章,来很仔细的描述如何增加自定义字段的.
以下是内容,我复制过来,大家可以先试试,然后再做基于TREEVIEW的OU组织结构菜单
--------------------------
MOSS2007的自定义字段类型是一个非常有用的功能,但在网上相关的实例介绍很少,所以下面就
一步一步地介绍怎样来创建一个自定义字段类型,我们的目标是:实现一个具有可配置性的下拉列表框,
其选择项目是读取XML文件获得。
实现一个自定义字段类型主要需要完成三种文件的编制:1)定义类型的XML文件;2)定义展现模板
*.ascx文件;3)定义后台代码程序集。
这里因为我们想要实现一个可读取XML文件的下拉列表框,所以我们首先还要定义一个配置文件
SelectItemFromXMLConfig.xml。
XML代码如下:


选项一
选项二
选项三
选项四
选项五

然后,我们可以打开Visual Studio2005,然后添加一个类库,如果你已经安装了扩展模板也可以直接选择
创建“Field Control”类型的项目。建议下载微软的SharePoint工具包:Windows SharePoint Services 3.0 Tools: Visual Studio 2005 Extensions.
这里我们新建一个名叫SelectItemFromXMLField的类库,其中包含两个类文件:SelectItemFromXML.Field.cs
和SelectItemFromXML.FieldControl.cs。
SelectItemFromXML.Field.cs完整代码如下:
using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Security;
namespace SelectItemFromXML
{
[CLSCompliant(false)]
[Guid("92f76873-537c-4c13-abaf-2d47bdc7e2be")]
public class SelectItemFromXMLField : SPFieldChoice
{
public SelectItemFromXMLField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
}
public SelectItemFromXMLField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
}
public override BaseFieldControl FieldRenderingControl
{
[SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
get
{
BaseFieldControl fieldControl = new SelectItemFromXMLFieldControl();
fieldControl.FieldName = this.InternalName;
return fieldControl;
}
}
}
}
SelectItemFromXML.FieldControl.cs完整代码如下:
using System;
using System.Runtime.InteropServices;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI.WebControls;
using System.IO;
using System.Xml;
using System.Diagnostics;
namespace SelectItemFromXML
{
[CLSCompliant(false)]
[Guid("eb269bd9-0d3e-4aa2-b88f-37fbccb0d7d8")]
public class SelectItemFromXMLFieldControl : BaseFieldControl
{
protected DropDownList cboList;
protected override string DefaultTemplateName
{
get
{
return "SelectItemFromXMLFieldControl";
}
}
public override object Value
{
get
{
EnsureChildControls();
return cboList.SelectedValue.ToString();
}
set
{
EnsureChildControls();
cboList.SelectedValue = (string)this.ItemFieldValue;
}
}
public override void Focus()
{
EnsureChildControls();
cboList.Focus();
}
protected override void CreateChildControls()
{
if (Field == null) return;
base.CreateChildControls();
if (ControlMode == Microsoft.SharePoint.WebControls.SPControlMode.Display)
return;
cboList = (DropDownList)TemplateContainer.FindControl("cboList");
if (cboList == null)
{
throw new ArgumentException("cboList is null. Corrupted SelectItemFromXMLFieldControl.ascx file.");
}
if (!Page.IsPostBack)
{
string configFile = Environment.CurrentDirectory + "\\SelectItemFromXMLConfig.xml";
if (!File.Exists(configFile))
{
cboList.Items.Add(new ListItem("Config file not found!","Error"));
cboList.ToolTip = configFile + " not found!";
}
else
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(configFile);
XmlNodeList nodelist = xmlDoc.DocumentElement.ChildNodes;
foreach (XmlNode node in nodelist)
{
cboList.Items.Add(new ListItem(node.InnerText, node.InnerText));
}
}
}
}
}
}
如果你使用模板创建项目,则上面的代码大部分会被自动生成。
值得注意的几个地方是:
1)SelectItemFromXMLField类将继承SPFieldChoice基类,并重写FieldRenderingControl方法。
2)SelectItemFromXMLFieldControl 类将继承BaseFieldControl基类。
3)CreateChildControls方法中读取XML配置文件,并把选项绑定到下拉列表框(DropDownList)子控件上。
4)上面代码中使用了Environment.CurrentDirectory语句,后面部署时要把配置文件放到
代码编写完成之后,要对程序集进行强名称设置,并编译。
接下来,我们来制作展现模板。你可以在当前解决方案中添加一个文本文件“SelectItemFromXMLFieldControl.ascx”。
然后打该文件编写代码如下:
<% @ Control Language="C#" Debug="true"%>
<% @ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral,
PublicKeyToken=71e9bce111e9429c" %>
<% @ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral,
PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.WebControls"  %>



值得注意的地方是:上面代码中DropDownList的ID是"cboList",这个名字曾经被后台类SelectItemFromXMLFieldControl使用
TemplateContainer.FindControl方法寻找过,所以不要写错。
OK,最后,我们可以在当前解决方案中添加一个XML文件“FLDTYPES_SelectItemFromXmlField.xml”。
代码如下:



SelectItemFromXML
Choice
Select Item From XML
Select Item From XML
TRUE
TRUE
TRUE
TRUE
TRUE
SelectItemFromXML.SelectItemFromXMLField,SelectItemFromXMLField,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=ad167643f06d0c9c



值得注意的地方是:
1)该定义文件的文件名一定要以“FLDTYPES”开头。
2)FieldTypeClass项中的值是类的全名称和程序集的全名称,可以使用Reflector获得。
到这里,我们需要编写的所有文件都已经编写完成了,只要做简单的部署就可以了。
步骤如下:
1)把强名称编译好的SelectItemFromXMLField程序集加入到GAC。
2)把类型定义文件FLDTYPES_SelectItemFromXmlField.xml拷贝到c:\program...\12\TEMPLATE\XML目录下。
3)把模板文件SelectItemFromXMLFieldControl.ascx拷贝到c:\program...\12\TEMPLATE\CONTROLTEMPLATES目录下。
4)重启动IIS。(可以使用命令行iisreset)
5)把该控件的配置文件SelectItemFromXMLConfig.xml拷贝到C:\Windows\System32\inetsrv目录下。
值得注意的地方是:
前四步是部署自定义字段类型的一般步骤。第五步是针对这个实例的特殊步骤。你其实可以把配置文件放在你想放的任何位置,只要在前面编写SelectItemFromXMLFieldControl类的CreateChildControls方法时指定你想放的位置即可。
OK,到此自定义字段类型的过程已经结束。你可以在创建MOSS的某个列表栏时,发现一个新的类型“Select Item From XML”。选择该类型创建一个新栏后,当往该列表中添加项目时,会发现添加页面中对应新栏的输入方式是一个下拉列表框,其中的选项就是我们在XML配置文件中定义的选项了!
----------------------------------------
接下来,我来告诉大家如何做TREEVIEW的树型菜单.
首先修改.ASCX文件
<% @ Control Language="C#" Debug="true"%>
<% @ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<% @ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0,
Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.WebControls"  %>



修改SelectItemFromXML.FieldControl.cs文件
using System;
using System.Runtime.InteropServices;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI.WebControls;
using System.IO;
using System.Xml;
using System.Diagnostics;
using System.DirectoryServices;
namespace SelectItemFromXML
{
[CLSCompliant(false)]
[Guid("eb269bd9-0d3e-4aa2-b88f-37fbccb0d7d8")]
public class SelectItemFromXMLFieldControl : BaseFieldControl
{
protected TreeView TreeView1;
protected TextBox txt_Ou;
protected override string DefaultTemplateName
{
get
{
return "SelectItemFromXMLFieldControl";
}
}
public override object Value
{
get
{
EnsureChildControls();
return txt_Ou.Text;
}
set
{
EnsureChildControls();
txt_Ou.Text = (string)this.ItemFieldValue;
}
}
public override void Focus()
{
EnsureChildControls();
txt_Ou.Focus();
}
protected override void CreateChildControls()
{
if (Field == null) return;
base.CreateChildControls();
if (ControlMode == Microsoft.SharePoint.WebControls.SPControlMode.Display)
return;
txt_Ou = (TextBox)TemplateContainer.FindControl("txt_Ou");
TreeView1 = (TreeView)TemplateContainer.FindControl("TreeView1");
if (!Page.IsPostBack)
{
TreeNode node2 = new TreeNode();
node2.Text = "泉州移动";
TreeView1.Nodes.Add(node2);
GetOu("OU=泉州移动", 10,node2);
}
}
protected void TreeView1_SelectNodeChanged(object sender, EventArgs e)
{
}
public void GetOu(string ouname, int amstr,TreeNode nodetmp)
{
//获取AD的对象
//搜索组织单位
DirectoryEntry entry = new DirectoryEntry("LDAP://SHAREPOINT2007.QZIT.COM", "administrator", "你的密码");
//获取子结点
System.DirectoryServices.DirectoryEntry subentry = entry.Children.Find(ouname, "organizationalUnit");
//对子对象进行循环
foreach (DirectoryEntry res in subentry.Children)
{
if (res.Name.Substring(0, 3) == "OU=")//判断是否为OU
{
//增加子结点
TreeNode node2 = new TreeNode();
node2.Text = res.Name.ToString().Replace("OU=", "") ;
nodetmp.ChildNodes.Add(node2);
//递归调用
GetOu(res.Name.ToString()+","+ouname, 10,node2);
}
}
}
}
}
其中必须确定在AD根结点下建立一个泉州移动的组织单位(也可修改其中代码)
通过创建MOSS2007自定义字段类来实现和基于TREEVIEW的OU组织结构菜单 Tag的创建和组织 Tag的创建和组织 根据单元格内容创建自定义弹出菜单 VBA自定义菜单和菜单栏 通过对web日志的挖掘来实现内容推荐系统 - 数据结构和算法 - Tech - JavaE... 马云创建的阿里巴巴第一次实现盈利是通过什么政策的,请具体说明其盈利原因和盈利过程 图标菜单(菜单图标)的实现 通过修改注册表方法来实现Diamond的隐藏功能 通过JDBC操纵Oracle数据库LOB字段的分析 基于AJAX的动态树型结构的设计与实现 基于AJAX的动态树型结构的设计与实现 基于AJAX的动态树型结构的设计与实现 20+Wordpress自定义字段使用技巧和插件/Custom Fields | 帕兰映像 耗散结构自组织和生命的创生 Windows Forms中通过自定义组件实现统一的数据验证(一) - 一个程序员的自省 ... 通过了解MySpace的六次重构经历,来认识分布式系统到底该如何创建. - Wiseman... 帝国cms留言板增加自定义字段教程 基于 J2EE 体系实现多层结构 Blog 平台 基于CSS的DIV网页设计 - 通过浮动容器来完整填充网页 - 三栏 基于CSS的DIV网页设计 - 通过浮动容器来固定层 - 三栏 基于CSS的DIV网页设计 - 通过浮动容器来固定层 - 两栏 基于CSS的DIV网页设计 - 通过浮动容器来完整填充网页 电阻式触摸屏结构和实现原理--匠人的百宝箱