Комментарии можно оставлять "здесь"
В статье Создание собственных типов полей был рассмотрен пример создания собственного типа поля. Очевидное ограничение предыдущего примера - это невозможность передачи пользователем (администратором) каких-то параметров. На этот раз попробуем разобраться как это делать.
За основу возьмем уже созданный нам тип поля и дополним его одним текстовым параметром, который будет содержать возможные значения для выпадающего списка.
Что нам предстоит сделать:
В статье Создание собственных типов полей был рассмотрен пример создания собственного типа поля. Очевидное ограничение предыдущего примера - это невозможность передачи пользователем (администратором) каких-то параметров. На этот раз попробуем разобраться как это делать.
За основу возьмем уже созданный нам тип поля и дополним его одним текстовым параметром, который будет содержать возможные значения для выпадающего списка.
Что нам предстоит сделать:
- Создать пользовательский элемент управления ввода настроек
- Дополнение класса, отвечающего за логику нашего типа поля, логикой чтения и сохранения параметров
- Дополнить файл, описывающий наш тип поля, ссылкой на дополнительные свойства.
В результате класс должен выглядеть следующим образом
public class CustomFieldClass : SPFieldText
{
public string CustomProperties = "";
public override BaseFieldControl FieldRenderingControl
{
get
{
// Возвращается класс, работающий с шаблоном поля
FieldView ov = new FieldView() { FieldName = base.InternalName, Properties=CustomProperties };
return ov;
}
}
public CustomFieldClass(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
CustomProperties = base.GetCustomProperty("CustomProperties") + "";
}
public CustomFieldClass(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
CustomProperties = base.GetCustomProperty("CustomProperties") + "";
}
public override void Update()
{
base.SetCustomProperty("CustomProperties", CustomProperties);
base.Update();
}
}
В класс работы с шаблоном вносим следующие изменения
public string Properties;
protected override void CreateChildControls()
{
base.CreateChildControls();
if (this.ControlMode != SPControlMode.Display)
{
DropDownList ddl = TemplateContainer.FindControl("ddlFieldValue") as DropDownList;
Label lb1 = TemplateContainer.FindControl("lb1") as Label;
Label lb2 = TemplateContainer.FindControl("lb2") as Label;
CustomFieldClass curItem = this.Field as CustomFieldClass;
if (!Page.IsPostBack)
{
lb1.Text = "Заголовок 1";
foreach (var val in Properties.Split(';'))
{
ddl.Items.Add(new ListItem() { Text = val, Value = val, });
}
ddl.SelectedValue = (this.ListItemFieldValue ?? "").ToString();
}
}
}
2. Дополним файл описания типа поля FLDTYPES_CustomField.XML ссылкой на элемент управления со свойствами Должно получит следующее содержание
<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
<FieldType>
<Field Name="TypeName">CustomFieldClass</Field>
<Field Name="ParentType">Text</Field>
<Field Name="TypeDisplayName">Собственное поле</Field>
<Field Name="TypeShortDescription">Собственное поле</Field>
<Field Name="FieldTypeClass">Demo.CustomFieldClass,$SharePoint.Project.AssemblyFullName$</Field>
<Field Name="FieldEditorUserControl">/_controltemplates/demo/CustomFieldProp.ascx</Field>
<PropertySchema>
<Fields>
<Field Hidden="true" Name="CustomProperties" DisplayName="Список значений" Type="Text"> </Field>
</Fields>
</PropertySchema>
</FieldType>
</FieldTypes>
Страницу разметки дополним
<%@ Register TagPrefix="wssuc" TagName="InputFormControl" src="~/_controltemplates/InputFormControl.ascx" %>
<wssuc:InputFormControl ID="InputFormControl1" runat="server" LabelText="Собственное свойство">
<Template_Control>
Список значений<asp:TextBox ID="tbFields" runat="server" />
</Template_Control>
</wssuc:InputFormControl>
Code behind приведём к следующему виду
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint;
namespace Demo
{
public partial class CustomFieldProp : UserControl, IFieldEditor
{
private CustomFieldClass ourField;
public void InitializeWithField(SPField field)
{
if (!IsPostBack)
{
tbFields.Text = CustomFieldClass.CustomProperties;
}
}
public void OnSaveChange(SPField field, bool bNewField)
{
CustomFieldClass.CustomProperties = tbFields.Text;
}
public bool DisplayAsNewSection
{
get
{
return true;
}
}
}
}
4. Разворачиваем решение, добавляем поле с нашим типом или заходим в настройку уже созданного. Через точку с запятой указываем допустимые значения (в конце разделитель не ставится)Данный пример сделан с избытком, т.к. текущую задачу можно было решить, просто сделав видимым поле CustomProperties в файле FLDTYPES_CustomField.XML и без добавления своего элемента управления. Но пример показывает общий случай, в свойство можно записать сложные данные из нескольких контролов. В чистом виде это пример использовать не следует, т.к. свойство записывается и считывается через статическую переменную.
Комментарии можно оставлять "здесь"
Комментариев нет:
Отправить комментарий