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

自定义字段类型的开发--2级联动Combox

在网上找了一些关于自定义字段类型开发的文章。发现在MOSS开发中关于这一部分的文章很少。不过这些也够我们入门了。

1,创建MOSS2007自定义字段类型实例

2,创建具有属性值的MOSS2007自定义字段实例

3,How to: Create a Custom Field Type and Field Control

    前两篇是赏梅斋的,后一篇是MSDN上的。都是很好实例,相信看过后都会有不少的领悟。


    好了,废话不多说了,下面就开始开发这个2级联动Combox。

091828231.png?d=20080919092037481 

091828356.png?d=20080919092124434


    先创建一个SharePoint空项目,然后再添加一个新字段控件项目。在建立好了项目后,模板会自动为我们添加一些文件:

1,CityCombox.Field.cs;

2,CityCombox.FieldControl.cs;

3,fldtypes_CityCombox.xml;


091828559.png?d=20080919092140074


    还得自己再添加一下文件:

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>



    最后我们来看看最终的效果


091828590.png?d=20080919092156059

091828637.png?d=20080919092208184


转载于:https://www.cnblogs.com/jhobo/archive/2008/10/08/1306315.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis-Plus 是一个用于提高 MyBatis 开发效率的框架。它提供了很多便捷的功能,其中之一就是可以自定义字段。 通常来说,在使用 MyBatis 操作数据库时,我们需要在 XML 文件中配置 SQL 语句来实现数据库的 CRUD 操作。这些 SQL 语句中会包含很多字段名,如果有很多字段,那么 XML 文件会很长,不太方便维护。 MyBatis-Plus 提供了一种方法,可以让我们通过定义自定义字段来简化 SQL 语句中的字段名。这样,我们就可以在 XML 文件中使用自定义字段,而不是直接使用数据库表中的字段名,这样就可以简化 XML 文件,使其更加简洁易读。 举个例子,假设我们有一张数据库表 `users`,其中有三个字段:`id`、`name` 和 `email`。在使用 MyBatis-Plus 操作这张表时,我们可以在 XML 文件中定义自定义字段,如下所示: ```xml <sql id="user_fields"> <choose> <when test="selectFields.contains('id')">id</when> <when test="selectFields.contains('name')">name</when> <when test="selectFields.contains('email')">email</when> </choose> </sql> ``` 然后,我们就可以在 SQL 语句中使用这个自定义字段,如下所示: ### 回答2: MyBatis-Plus是一个在MyBatis基础上增强的持久层框架,它提供了许多便捷的操作数据库的方法和功能。在使用MyBatis-Plus时,有时我们需要对数据库表的字段进行一些自定义操作。 首先,我们可以通过注解来实现自定义字段。MyBatis-Plus提供了一系列注解,我们可以在实体类的属性上使用这些注解来定义字段的名称、类型、长度、约束等。例如,我们可以使用@TableField注解来配置数据库字段的名称和是否进行插入、更新操作;使用@TableId注解来配置主键字段;使用@TableLogic注解来配置逻辑删除字段等。 另外,我们还可以通过自定义SQL片段来实现自定义字段的操作。MyBatis-Plus提供了XML配置文件和Mapper接口两种方式来编写SQL语句,我们可以在这些配置文件中使用自定义SQL片段来处理字段操作。例如,我们可以使用<if>标签来判断某个条件是否满足,从而决定是否拼接某个字段;使用<foreach>标签来进行循环操作,生成多个字段的SQL语句等。 除了以上的方式,我们还可以通过自定义SQL语句来实现自定义字段的功能。在Mapper接口中,我们可以使用@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider注解来指定自定义SQL语句的提供者,然后在相应的Provider类中编写自定义SQL语句,实现对字段自定义操作。 总之,MyBatis-Plus提供了多种方式来实现自定义字段的功能,我们可以根据具体的需求选择适合的方式进行操作。通过灵活运用这些方式,我们可以更好地使用MyBatis-Plus进行数据库操作,提高开发效率和代码质量。 ### 回答3: MyBatis-Plus 是一个基于 MyBatis 的增强工具包,提供了许多简化开发的功能和增强特性。其中一个功能就是自定义字段,我们可以通过自定义字段来扩展实体类的属性,在数据库查询结果中获取自定义字段值。 在 MyBatis-Plus 中,我们可以通过使用 @TableField 注解来定义自定义字段。首先,在实体类中添加一个与数据库中不存在的属性,并使用 @TableField 注解进行标注。例如: ``` public class User { // ... @TableField(exist = false) private String customField; // getters and setters } ``` 在这个例子中,我们添加了一个名为 customField 的自定义字段。`exist = false` 表示该字段在数据库中不存在。 在查询数据库时,MyBatis-Plus 会自动将查询结果映射到实体类中,包括自定义字段。我们可以通过使用自定义字段进行操作和获取值。例如: ``` User user = userMapper.selectById(1); String customFieldValue = user.getCustomField(); ``` 这样,我们就可以使用 MyBatis-Plus 的自定义字段功能,方便地扩展实体类的属性,并在数据库查询结果中获取自定义字段值。 总结起来,MyBatis-Plus 的自定义字段功能通过 @TableField 注解来实现,可以方便地扩展实体类属性,并从数据库查询结果中获取自定义字段的值。使用自定义字段可以灵活地满足一些特殊需求,让开发更加便捷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值