日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义字段类型的开发[转]

發布時間:2025/5/22 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义字段类型的开发[转] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

自定義字段類型的開發--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



CODE: using System;
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


CODE: using System;
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



CODE: using System;
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



CODE: <%@ Control Language="C#" ClassName="WebUserControl1" %>
<%@ 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



CODE: <?xml version="1.0" encoding="utf-8"?>
<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



CODE: <?xml version="1.0" encoding="utf-8" ?>
<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

總結

以上是生活随笔為你收集整理的自定义字段类型的开发[转]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。