SharePoint 2013 圖文開發系列之自定義字段


  SharePoint使用的優勢,就在於開箱即用、快速搭建,SharePoint自身為我們提供了很多字段類型,已經很豐富了。但是,在實際應用中,我們還需要一些功能特殊的字段,下面,我們簡單介紹下字段的開發,大家了解以后,可以按照需求擴展自己的字段類型。

1、新建項目,選擇SharePoint 2013 空項目,如下圖:

clip_image001

2、選擇調試網站和解決方案類型,如下圖:

clip_image002

3、添加新項,類,這個是用來定義字段的,如下圖:

clip_image003

4、添加新項,類,這個是用來編寫字段展示的,如下圖:

clip_image004

5、添加映射文件夾,如下圖:

clip_image005

6、選擇映射文件夾,這個文件夾,添加的是CustomFieldControl.cs的前台文件,如下圖:

clip_image006

7、添加映射文件夾,選擇Xml,這個是字段的描述文件,如下圖:

clip_image007

8、為xml目錄下添加一個xml文件,用來寫字段的描述文件,如下圖:

clip_image008

9、在CONTROLTEMPLATES文件夾下,添加用戶控件,用來寫CustomFieldControl.cs的前台文件,因為這樣,比較好進行字段展示,如下圖:

clip_image009

10、刪除沒用的cs文件,最后的如下圖

clip_image010

11、為字段類CustomField.cs添加方法,如下圖:

clip_image011

12、字段類CustomField.cs完整代碼,有點長,關鍵代碼有注釋,如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Web;
 7 using System.Web.UI;
 8 using System.Web.UI.WebControls;
 9 using Microsoft.SharePoint;
10 using Microsoft.SharePoint.WebControls;
11 
12 namespace SP2013CustomField
13 {
14     class CustomField : SPFieldText
15     {
16         public CustomField(SPFieldCollection fields, string fieldName)
17             : base(fields, fieldName)
18         {
19         }
20 
21         public CustomField(SPFieldCollection fields, string typeName, string displayName)
22             : base(fields, typeName, displayName)
23         {
24         }
25 
26         public override string DefaultValue //設置字段的默認值
27         {
28             get
29             {
30                 return "http://";
31             }
32         }
33 
34         public override BaseFieldControl FieldRenderingControl //關聯字段展示控件
35         {
36             get
37             {
38                 BaseFieldControl fc = new CustomFieldControl();
39                 fc.FieldName = this.InternalName;
40                 return fc;
41             }
42         }
43 
44         public override string GetValidatedString(object value)//驗證字段是否符合要求
45         {
46             string StartStr = this.GetCustomProperty("CustomFieldProperty").ToString().ToLower();//獲得字段屬性
47             string StartValue = string.Empty;
48             if (value.ToString().Length > StartStr.Length)
49             {
50                 StartValue = value.ToString().ToUpper().Substring(0, StartStr.Length).ToLower();
51             }
52             // this.Required是否必填項的值
53             if (this.Required == true || value == null || StartStr != StartValue)
54             {
55                 throw new SPFieldValidationException("該字段必須以" + StartStr + "開頭");//將不符合要求的錯誤拋出來,以小紅字顯示在欄的下面
56             }
57             return base.GetValidatedString(value);
58         }
59     }
60 }
CustomField Class

13、為字段展示控件類CustomFieldControl.cs添加方法,如下圖:

clip_image012

14、附CustomFieldControl.cs完整代碼,如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Web;
 7 using System.Web.UI;
 8 using System.Web.UI.WebControls;
 9 using Microsoft.SharePoint;
10 using Microsoft.SharePoint.WebControls;
11 
12 namespace SP2013CustomField
13 {
14     class CustomFieldControl : BaseFieldControl
15     {
16         public TextBox tbStart;
17         public Image myImage;
18 
19         //獲取控件的值
20         public override object Value
21         {
22             get
23             {
24                 EnsureChildControls();
25                 if (tbStart != null)
26                 {
27                     return tbStart.Text;
28                 }
29                 else
30                 {
31                     return null;
32                 }
33             }
34             set
35             {
36                 EnsureChildControls();
37                 if (tbStart != null)
38                 {
39                     tbStart.Text = (String)value;
40                 }
41             }
42         }
43 
44         //重寫默認模板
45         protected override string DefaultTemplateName
46         {
47             get
48             {
49                 if (this.ControlMode == SPControlMode.Display)
50                 {
51                     return this.DisplayTemplateName;
52                 }
53                 else
54                 {
55                     return "DefaultCustomFieldControl";
56                 }
57             }
58         }
59 
60         public override string DisplayTemplateName
61         {
62             get
63             {
64                 return "DisplayCustomFieldControl";
65             }
66             set
67             {
68                 base.DisplayTemplateName = value;
69             }
70         }
71 
72         //重寫控件生成方法
73         protected override void CreateChildControls()
74         {
75             base.CreateChildControls();
76             if (this.Field != null)
77             {
78                 this.myImage = (Image)TemplateContainer.FindControl("myImage");
79                 this.tbStart = (TextBox)TemplateContainer.FindControl("tbStart");
80             }
81             if (this.ControlMode == SPControlMode.Display)
82             {
83                 string strHeight = base.Field.GetCustomProperty("Height").ToString();
84                 string strWidth = base.Field.GetCustomProperty("Width").ToString();
85                 if (myImage != null)
86                 {
87                     myImage.ImageUrl = this.ItemFieldValue.ToString();
88                     myImage.Width = Convert.ToInt32(strWidth);
89                     myImage.Height = Convert.ToInt32(strHeight);
90                 }
91             }
92         }
93     }
94 }
CustomFieldControl Class

15、CustomFieldControl.cs類的前台文件,如下圖:

clip_image013

16、CustomFieldControl.cs前台文件完整代碼,如下:

<%@ Control Language="C#" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.WebControls" %>
<SharePoint:RenderingTemplate ID="DefaultCustomFieldControl" runat="server">
    <Template>
        <asp:TextBox ID="tbStart" runat="server" />
    </Template>
</SharePoint:RenderingTemplate>
<SharePoint:RenderingTemplate ID="DisplayCustomFieldControl" runat="server">
    <Template>
        <asp:Image ID="myImage" runat="server" />
    </Template>
</SharePoint:RenderingTemplate>

17、設置字段的描述文件,主要是字段的定義、字段屬性,如下圖:

clip_image014

18、字段描述文件完整xml,如下:

<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
  <FieldType>
    <Field Name="TypeName">自定義單行文本</Field>
    <Field Name="ParentType">Text</Field>
    <Field Name="TypeDisplayName">必須有特定標識開頭的單行文本</Field>
    <Field Name="TypeShortDescription">自定義單行文本</Field>
    <Field Name="UserCreatable">TRUE</Field>
    <Field Name="ShowOnListCreate">TRUE</Field>
    <Field Name="ShowOnSurveyCreate">TRUE</Field>
    <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
    <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
<Field Name="FieldTypeClass">SP2013CustomField.CustomField, SP2013CustomField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=42c0b47fe35d0f54</Field>
//字段屬性,如下
    <PropertySchema>
      <Fields>
        <Field Name="CustomFieldProperty" DisplayName="設置起始標識" MaxLength="255" Type="Text"></Field>
        <Field Name="Height" DisplayName="圖片高度" MaxLength="255" Type="Text"></Field>
        <Field Name="Width" DisplayName="圖片寬度" MaxLength="255" Type="Text"></Field>
      </Fields>
    </PropertySchema>
  </FieldType>
</FieldTypes>

19、在列表里添加欄,可以添加屬性,如下圖:

clip_image015

20、新建一條項目,圖片欄的驗證,如下圖:

clip_image016

21、展示頁面,如下圖:

clip_image017

22、查看項目頁面,不顯示url,在圖片控件中顯示,如下圖:

clip_image018

  自定義字段,主要有字段定義、字段控件、字段控件前台、字段描述文件等組成,其中,字段前台文件並非必須,可以添加Render將控件輸出,但是不好控制排版,所以復雜的字段需要前台展示。

  其開發過程也不復雜,基本就是搭建開發模型,將各個部分創建,然后為各個部分添加代碼,建議先編寫簡單控件,部署沒有問題再添加復雜功能,以免出錯不好調試。當然,調試附加相應w3wp.exe進程即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM