自定义字段类型的开发[转]
自定义字段类型的开发--2级联动Combox
在网上找了一些关于自定义字段类型开发的文章。发现在MOSS开发中关于这一部分的文章很少。不过这些也够我们入门了。
1,创建MOSS2007自定义字段类型实例
2,创建具有属性值的MOSS2007自定义字段实例
3,How to: Create a Custom Field Type and Field Control
前两篇是赏梅斋的,后一篇是MSDN上的。都是很好实例,相信看过后都会有不少的领悟。
好了,废话不多说了,下面就开始开发这个2级联动Combox。
先创建一个SharePoint空项目,然后再添加一个新字段控件项目。在建立好了项目后,模板会自动为我们添加一些文件:
1,CityCombox.Field.cs;
2,CityCombox.FieldControl.cs;
3,fldtypes_CityCombox.xml;
还得自己再添加一下文件:
1,CityComboxValue.cs;
2,CityControl.ascx;
3,CityXMLFile.xml;
在创建CityControl.ascx文件时,请注意目录结构,这会省去我们在部署时的一点小操作。
建好了项目,我们就该开始写代码了。如果看了前面提到的三篇文章,就会发现,自定义字段类型的开发,基本上是继承SharePoint以提供的类型,在源类型上,进行成员方法的重写。
1,类型对象CityCombox.Field
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Security;
namespace CityCombox
{
// TODO: Replace, as needed, "SPFieldText" with some other class derived from SPField.
// TODO: Update, as needed, ParentType element in fldtypes*.xml in this solution.
[CLSCompliant(false)]
[Guid("48d7dfb3-a1eb-4c96-af40-0a98b98f021d")]
public class CityComboxField : SPFieldMultiColumn
{
public CityComboxField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
}
public CityComboxField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
}
public override BaseFieldControl FieldRenderingControl
{
[SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
get
{
BaseFieldControl fieldControl = new CityComboxFieldControl();
fieldControl.FieldName = this.InternalName;
return fieldControl;
}
}
public override object GetFieldValue(string value)
{
if (string.IsNullOrEmpty(value))
return null;
return new CityComboxValue(value);
}
}
}
注意蓝色部分,这里继承的是SPFieldMultiColumn。因为我们最终要实现的效果是在一个字段里记录两个数据,所以继承了SPFieldMultiColumn对象。
红色部分继承之SPField,绿色部分重写了SPFieldMultiColumn的成员方法,用于得到我们自定义的控件。
黄色部分是需要我们自己添加的,前面的代码都是由模板自动生成的。因为这种特殊的开发方式(重写),就需要我们对源对象有所了解,这样才知道该重写什么部分。那么看源码,也是一个必须的工作。
类型部分的代码就写完了。而重点在控件部分,我们下面就来看控件部分的代码。
2,控件对象CityCombox.FieldControl
using System.Runtime.InteropServices;
using System.Web.UI.WebControls ;
using System.Xml;
using System.Collections.Generic;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
namespace CityCombox
{
// TODO: Replace, as needed, "TextField" with some other class derived from Microsoft.SharePoint.WebControls.BaseFieldControl.
[CLSCompliant(false)]
[Guid("34e11e08-29f1-4a8e-8ed2-8800c3c1a5dc")]
public class CityComboxFieldControl : BaseFieldControl
{
protected DropDownList ddl_Province, ddl_City;
protected override string DefaultTemplateName
{
get
{
return "CityComboxFieldRendering";
}
}
public override object Value
{
get
{
EnsureChildControls();
CityComboxValue fieldValue = new CityComboxValue();
fieldValue.Province = ddl_Province.SelectedValue.Trim();
fieldValue.City = ddl_City.SelectedValue.Trim();
return fieldValue;
}
set
{
EnsureChildControls();
CityComboxValue fieldValue = (CityComboxValue)value;
ddl_Province.SelectedValue = fieldValue.Province;
ddl_Province_SelectedIndexChanged(null, null);
ddl_City.SelectedValue = fieldValue.City;
}
}
public override void Focus()
{
EnsureChildControls();
ddl_Province.Focus();
}
protected override void CreateChildControls()
{
if (Field == null)
return;
base.CreateChildControls();
if (ControlMode == SPControlMode.Display)
return;
ddl_Province = (DropDownList)TemplateContainer.FindControl("ddl_Province");
if (ddl_Province == null)
throw new ArgumentException("Corrupted CityComboxFieldRendering template - missing ddl_Province. ");
ddl_Province.TabIndex = TabIndex;
ddl_Province.CssClass = CssClass;
ddl_Province.ToolTip = Field.Title + " Province";
ddl_City = (DropDownList)TemplateContainer.FindControl("ddl_City");
if (ddl_City == null)
throw new ArgumentException("corrupted CityComboxFieldRendering template - missing ddl_City.");
ddl_City.TabIndex = TabIndex;
ddl_City.CssClass = CssClass;
ddl_City.ToolTip = Field.Title + " City";
ddl_Province.Enabled = false;
ddl_City.Enabled = false;
if (ControlMode == SPControlMode.New || ControlMode == SPControlMode.Edit)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Environment.CurrentDirectory +"\\CityXMLFile.xml");
XmlNode rootNode= xmlDoc.SelectSingleNode("Place");
XmlNodeList nodeList = rootNode.ChildNodes;
ddl_Province.Items.Clear();
foreach (XmlNode node in nodeList)
{
ddl_Province.Items.Add(new ListItem(node.Attributes["name"].Value.ToString(), node.Attributes["name"].Value .ToString()));
}
if (!ddl_Province.Enabled)
{
ddl_Province.Enabled = true;
ddl_Province.AutoPostBack = true;
ddl_Province.SelectedIndexChanged += new EventHandler(ddl_Province_SelectedIndexChanged);
//ddl_City.SelectedIndexChanged += new EventHandler(ddl_City_SelectedIndexChanged);
}
if (ddl_Province.Items.Count > 0)
{
//ddl_Province.Items[0].Selected = true;
ddl_Province_SelectedIndexChanged(null, null);
}
}
}
private string LoadXml(string province)
{
string result=string.Empty ;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Environment.CurrentDirectory + "\\CityXMLFile.xml");
XmlNode rootNode = xmlDoc.SelectSingleNode("Place");
XmlNodeList nodeList = rootNode.ChildNodes;
foreach (XmlNode node in nodeList)
{
if (province == "all")
{
result = result + "@" + node.Attributes["name"].Value .ToString();
}
else if(node.Attributes["name"].Value.ToString()==province)
{
XmlNodeList cityList = node.ChildNodes;
foreach (XmlNode city in cityList)
{
result = result + "@" + city.Attributes["name"].Value .ToString();
}
}
}
return result ;
}
void ddl_Province_SelectedIndexChanged(object sender, EventArgs e)
{
//throw new Exception("The method or operation is not implemented.");
ddl_City.Enabled = true;
string[] cityList = LoadXml(ddl_Province.SelectedValue).Split(new char[1]{'@'},StringSplitOptions.RemoveEmptyEntries);
ddl_City.Items.Clear();
for (int i = 0; i < cityList.Length; i++)
{
ddl_City.Items.Add(new ListItem(cityList[i], cityList[i]));
}
}
}
}
首先重写了DefaultTemplateName属性,该属性是用来获取模板的,所以这里返回我们自己的模板。
接着重写了Value属性,类型对象就通过这个属性来获取控件上的值,或者将值传给控件。
最后重写了CreateChildControls成员方法。在MOSS中需要用到控件时,就会调用这个方法,我们为了实现特殊的功能,就要重写这个方法。
在这里个例子里,我们想要实现的就是,给用户提供两个Combox控件,第一个Combox控件里是省名数据,当用户选择了第一个Combox控件里的数据,那么就根据第一个Combox控件里的省名来确定第二Combox控件里的城市,提供给用户选择。
在CreateChildControls方法里,一开始先进行了一些基本的判断,然后就从我们的自定义模板里寻找我们需要的两个控件(我们这里用的是 DropDownList控件)。接着我们就对第一Combox进行初始化。我们这里的数据来至一个XML文档CityXMLFile.xml。在对第一个Combox控件初始化后,我们就要设定该控件进行自动回传,接着绑定它的SelectedIndexChanged事件到事件处理函数 ddl_Province_SelectedIndexChanged。在ddl_Province_SelectedIndexChanged函数里,我们要做的就是根据第一个Combox控件里选定的数据,来绑定第二个Combox。
控件部分的代码我们就完成了。在这部份代码里,我们用到了CityComboxValue这个对象。
3,值对象CityComboxValue
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using System.Web;
namespace CityCombox
{
class CityComboxValue : SPFieldMultiColumnValue
{
private const int numberOfFields = 2;
public CityComboxValue() : base(numberOfFields) { }
public CityComboxValue(string value) : base(value) { }
public string Province
{
get { return this[0]; }
set { this[0] = value; }
}
public string City
{
get { return this[1]; }
set { this[1] = value; }
}
}
}
CityComboxValue继承至SPFieldMultiColumnValue。为了在一个字段内保存多个值,所以我们要定义两个属性。
4,用户控件CityControl.ascx
<%@ 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"%>
<SharePoint:RenderingTemplate ID="CityComboxFieldRendering" runat="server">
<Template>
<table>
<tr>
<td>Province:</td>
<td><asp:DropDownList ID="ddl_Province" runat="server">
</asp:DropDownList></td>
<td>City:</td>
<td><asp:DropDownList ID="ddl_City" runat="server">
</asp:DropDownList></td>
</tr>
</table>
</Template>
</SharePoint:RenderingTemplate>
就是做一个包含两个DropDownList 控件的用户控件。最后我们来看类型描述文档。
5,类型描述文档fldtypes_CityCombox.xml
<FieldTypes>
<FieldType>
<Field Name="TypeName">CityComboxField</Field>
<Field Name="TypeDisplayName">CityComboxField</Field>
<Field Name="TypeShortDescription">CityComboxField</Field>
<Field Name="ParentType">MultiColumn</Field>
<Field Name="UserCreatable">TRUE</Field>
<Field Name="FieldTypeClass">48d7dfb3-a1eb-4c96-af40-0a98b98f021d</Field>
<PropertySchema>
<Fields>
<Field Name="DefaultProvince" DisplayName="Default Province:" MaxLength="50" DisplaySize="30" Type="Text">
<Default>四川</Default>
</Field>
<Field Name="DefaultCity" DisplayName="Default City:" MaxLength="50" DisplaySize="30" Type="Text">
<Default>绵阳</Default>
</Field>
</Fields>
</PropertySchema>
<RenderPattern Name="DisplayPattern">
<Switch>
<Expr>
<Column/>
</Expr>
<Case Value="">
</Case>
<Default>
<HTML><![CDATA[省:]]></HTML>
<Column SubColumnNumber="0" HTMLEncode="TRUE" />
<HTML><![CDATA[ ---- 城市:]]></HTML>
<Column SubColumnNumber="1" HTMLEncode="TRUE"/>
</Default>
</Switch>
</RenderPattern>
</FieldType>
</FieldTypes>
Field标签是对字段类型的基础定义。比如<Field Name="TypeShortDescription">指定了在增加栏时显示的名称;<Field Name="ParentType">MultiColumn</Field>则指定了在展示时的表现类型。
<RenderPattern Name="DisplayPattern">
部分则确定了在展示时的样式。既是定义用户所看到的样式。
6,数据文档CityXMLFile.xml
<Place>
<Province name="四川">
<City name="绵阳">绵阳</City>
<City name="广元">广元</City>
<City name="德阳">德阳</City>
<City name="成都">成都</City>
</Province>
<Province name="新疆">
<City name="乌鲁木齐">乌鲁木齐</City>
<City name="阿尔泰">阿尔泰</City>
<City name="哈密">哈密</City>
<City name="石河子">石河子</City>
</Province>
</Place>
最后我们来看看最终的效果
转载于:https://www.cnblogs.com/yigedaizi/archive/2009/05/11/1454032.html
自定义字段类型的开发[转]相关推荐
- 使用VS2010开发一个简单的自定义字段类型
在SharePoint中创建自定义字段类型,必须完成两个工作:创建继承于SPField的字段类:编写字段的配置文件,声明字段的基本属性.字段的实现类和字段的呈现逻辑等. 首先在SharePoint站点 ...
- Sharepoint 自定义字段类型
Moss2007默认有许多常见类型,如:文本,日期,数字,选项- ,有时我们需要根据需求自定义一个类型!在WSS3.0中可以通过C#或者VB来编写扩展字段,所有的自动需要继承内置的Sharepoint ...
- sharepoint2010问卷调查(3)-实现问卷的开始和结束时间(采用自定义字段类型)...
接着上面的图片调查,sharepoint自带的问卷调查是没有开始和结束时间的.这个在项目过程不太实用.问卷一般有开始和结束时间的.因此需要自己 动手开发一个自定义字段类型字段.如下图: 开发添加栏目会 ...
- 编写MOSS自定义字段类型的小意外
这段时间手头要做一个KM系统,在发表新知识文章时需要选择一个或多个维度下的知识分类.其实实现方法有很多,例如说再做一个专门用于设置知识分类的页面,让了发表完知识时或者在了表知识前让用户选择:又或者扩展 ...
- JIRA自定义字段类型
说明 JIRA中提供了许多自定义字段类型,如文本框,选择等.但有时不能完全满足我们的要求,我们需要自定义一些字段类型,下面以自定一个问题选择下拉框为例. 添加配置 先看下 官网的说明,示例中需要在at ...
- 修改mysql 视图字段类型_记一次mysql视图创建时自定义字段类型不同环境不同的原因...
由于老项目使用的是hibernate,当项目启动时会去检查数据库字段类型等,发现一张视图中某个自定义字段在开发环境中类型为text,但是到了生产环境类型却为mediumtext,导致代码在生产上会有问 ...
- peewee创建mysql_python – peewee MySQL,如何创建包装SQL构建的ins的自定义字段类型?...
我想在peewee(通过 MySQL)创建一个自定义UUID字段. 在python中,我使用UUID作为一个六角形字符串,例如: uuid ='110e8400-e29b-11d4-a716-4466 ...
- 自定义列表字段类型(3)
在上一次我们已经编写好了一个带有格式验证功能的Email地址栏,那么如果需要用到这个自定义字段,必须先对其进行注册,通知SharePoint有了一个新的字段类型.其方法就是编写一个xml文件. 先来看 ...
- Sharepoint SP1下创建自定义字段应注意的问题
Sharepoint SP1创建自定义字段下面有一个Bug,我不知道SP2解决了这个问题没有: 通过调用自定义字段类型父类的SetCustomProperty(string propertyName, ...
最新文章
- ATS线上报告个别日志过大无法写入问题的解决方法
- ​不唯SCI,博士生要怎么培养?当我们反对SCI至上时,我们到底在反对什么?...
- 利用Tencent(腾讯)SCF函数部署自动签到获得容量(天翼云盘)
- 【Scratch】青少年蓝桥杯_每日一题_5.25_排序
- MPU6050开发 -- 卡尔曼滤波
- 第三十期:BAT 为什么都看上了重庆?
- 考研计算机网课辅导,考研计算机网课辅导哪个好
- c语言中字符 12是多少,c语言中字符串的讲解(DOC可编).doc
- mysql定义变量字符串类型_mysqli_stmt :: bind_param():类型定义字符串中的元素数量与绑定变量的数量不匹配...
- tomcat7-maven-plugin-用于部署WAR的Tomcat Maven插件
- C# 字段、属性、成员变量
- BZOJ 1012 - 树状数组+维护最大值 / 单调栈+二分 / 暴力(伪单调队列) / 线段树...
- 大数据之 Hive 教程
- 【转】纯干货:PS高手完全自学宝典(原创文章)
- wiFI基础知识----wpa_supplicant
- 网页制作中PS图像处理的应用
- C++基础病毒性函数汇总
- Eclipse Neon.3 安装 Xtend IDE插件
- cad2010背景怎么调成黑色_iOS14桌面怎么布局好看-热点资讯-
- GIC 介绍 (二)—gic400 使用