Поля настроек собственного типа полей

 Комментарии можно оставлять "здесь"

В статье Создание собственных типов полей был рассмотрен пример создания собственного типа поля. Очевидное ограничение предыдущего примера - это невозможность передачи пользователем (администратором) каких-то параметров. На этот раз попробуем разобраться как это делать.
  За основу возьмем уже созданный нам тип поля и дополним его одним текстовым параметром, который будет содержать возможные значения для выпадающего списка.
 Что нам предстоит сделать:
  • Создать пользовательский элемент управления ввода настроек
  • Дополнение класса, отвечающего за логику нашего типа поля, логикой чтения и сохранения параметров
  • Дополнить файл, описывающий наш тип поля, ссылкой на дополнительные свойства.
1. Дополним класс CustomFieldClass переменной, которая будет содержать значение параметра, а также внесём сроки присвоения этой переменной значения.
В результате класс должен выглядеть следующим образом
 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>
3. Добавим пользовательский элемент управления с именем CustomFieldProp.ascx.
Страницу разметки дополним
<%@ 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 и без добавления своего элемента управления. Но пример показывает общий случай, в свойство можно записать сложные данные из нескольких контролов. В чистом виде это пример использовать не следует, т.к. свойство записывается и считывается через статическую переменную.

 Комментарии можно оставлять "здесь"

Комментариев нет:

Яндекс.Метрика