翻开SDK文档,这个数字栏的类型是SPFieldNubmer,它还派生出一个SPFieldCurrency类,我们也派生出一个类,就叫ReadOnlyCountField。
本来我想做一个完整的自定义Field的,可是最近一直忙,上次写了一半的不小心被我删了,偷个懒,就用这种简单的方法实现。
新建一个项目ReadOnlyCountField。然后添加一个ReadOnlyCountField.cs文件,加入以下内容
{
public ReadOnlyCountField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
this.ShowInEditForm = false;
this.DefaultValue = "0";
}
public ReadOnlyCountField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
this.ShowInEditForm = false;
this.DefaultValue = "0";
}
public override BaseFieldControl FieldRenderingControl
{
get
{
BaseFieldControl control = new NumberField();
control.FieldName = base.InternalName;
return control;
}
}
}
我翻看SDK文档发现Field有一个ShowInEditForm属性,我本来以为在设置里有的,就不用弄这个只读字段了,可是我找了半天也没有找到,于是就想到派生出一个新类,在构造函数中将此值改为false。所以这个文件我们唯一要做的就是在构造函数设置一下这个值的默认值了。简单吧~~还有我们还重载了一个FieldRenderingControl方法,这个方法返回一个显示字段的control,这个control类继承BaseFieldControl类,如果要自定义一个Field的话,就需要自己写一个派生自BaseFieldControl类的control控件。这个网上教程很多了。翻看SDK文档就会发现每个MOSS内置的Field都会有个与之对应的control类
再添加一个fldtypes_ReadOnlyCountField.xml文件
<FieldTypes>
<FieldType>
<Field Name="TypeName">ReadOnlyCountField</Field>
<Field Name="ParentType">Number</Field>
<Field Name="TypeDisplayName">只读数字</Field>
<Field Name="TypeShortDescription">不可修改的只读数字</Field>
<Field Name="UserCreatable">TRUE</Field>
<Field Name="ShowInListCreate">TRUE</Field>
<Field Name="ShowInSurveyCreate">TRUE</Field>
<Field Name="ShowInDocumentLibraryCreate">TRUE</Field>
<Field Name="ShowInColumnTemplateCreate">TRUE</Field>
<Field Name="ShowInEditForm">FALSE</Field>
<Field Name="FieldTypeClass">ReadOnlyCountField, ReadOnlyCountField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=239ba512823b3816</Field>
</FieldType>
</FieldTypes>
这个文件一定要以fldtypes开头,后面的就随便了,这里面定义了一个我们这个自定义属性的类型。如果你有兴趣对MOSS里的Field有兴趣,可以查看\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML下面的FLDTYPES.XML文件,一定不要修改哈……出了问题就麻烦了
还有就是<Field Name="FieldTypeClass">里的值,第一个为带命名空间的类名,第二个为程序集,最后一个PublicKeyToken=后面是强名称的key值,需要按下一步建立强名称编译后才能知道。可用Reflector打开编译好的dll来查看。
给项目建立强名称,就是项目属性里签名,把为程序集签名勾上,再新建一个KEY,把密码保护去掉(用不上),编译后,就差部署了
新建一个文本文件,起名叫Install.bat,输入以下内容
"%programfiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -if bin\Debug\ReadOnlyCountField.dll
copy /Y fldtypes_HitsCountField.xml "%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\XML\"
iisreset
运行这个bat,OK,部署完毕,去新建栏去看看,是否有“不可修改的只读数字”一种类型可以选了。