Пользовательское поле SharePoint BCS Edit и NewForm

Сценарий: Ive получил источник данных, поступающих через BCS, и представлен как всегда представленный из коробки с BCS. Я хотел бы сделать это, чтобы настроить New и EditForms, чтобы позволить DropDown в одном из моих полей.

Я попытался: создать настраиваемое поле на основе SPFieldChoide (проверено в пользовательском списке, и оно отлично работает), а через XML файл конфигурации BCS (.bdcm) добавлено свойство SPCustomFieldType в поле, которое я хочу настроить.

Ошибка: я могу открыть страницы ReadItem/NewForm/EditForm, а настраиваемые полевые рендеринги просто прекрасны, но при этом открывается ошибка при открытии страницы ReadList

Ошибка при выполнении веб-части: System.NotSupportedException: метод GetFieldAttributeValue не поддерживается на BiConvenioGrupoChoiceField для внешних списков. в Microsoft.SharePoint.SPExternalList.ThrowNotSupportedExceptionForMethod(String sMethodName, Тип typeTrowing) в Microsoft.SharePoint.SPFieldChoice.get_Sortable() в Microsoft.SharePoint.SPField.AnnotateField (поле XmlNodeRefNode) в Microsoft.SharePoint.WebPartPages.XsltListViewWebPart.AddInFieldSchema(XmlNodeList fieldRefNodes, список SPList) в Microsoft.SharePoint.WebPartPages.XsltListViewWebPart.AddInTypeInfoIntoViewXml(XmlNode viewXml) в Microsoft.SharePoint.WebPartPages.XsltListViewWebPart.ModifyXsltArgumentList(ArgumentClassWrapper argList) в Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)

Позвольте пройти через код.

Пользовательское поле.cs

class BiConvenioGrupoChoiceField : SPFieldChoice
{
 #region Constructors
 public BiConvenioGrupoChoiceField(SPFieldCollection fields, string fieldName) : base(fields, fieldName) { }
 public BiConvenioGrupoChoiceField(SPFieldCollection fields, string typeName, string displayName) : base(fields, typeName, displayName) { }
 #endregion

 #region Properties
 public override string TypeDisplayName
 {
 get
 {
 return "BiConvenioGrupoChoiceField";
 }
 } 
 public override BaseFieldControl FieldRenderingControl
 {
 get
 { 
 BaseFieldControl fieldControl = new BiConvenioGrupoChoiceFieldControl();
 fieldControl.FieldName = InternalName;
 return fieldControl;
 }
 }
 #endregion
}

Пользовательское поле управления

class BiConvenioGrupoChoiceFieldControl : BaseFieldControl
{
 DropDownList customDropDown;
 protected override string DefaultTemplateName
 {
 get
 {
 return "DropDownRenderingTemplate";
 }
 }
 protected override void CreateChildControls()
 {
 try
 {
 base.CreateChildControls();
 customDropDown = (DropDownList)TemplateContainer.FindControl("customDropDown");
 if (customDropDown != null)
 {
 customDropDown.ID = this.FieldName;
 if (this.ControlMode == SPControlMode.New || this.ControlMode == SPControlMode.Edit)
 { 
 customDropDown.Items.Add(new ListItem("Option 0", "0"));
 customDropDown.Items.Add(new ListItem("Option 1", "1"));
 customDropDown.Items.Add(new ListItem("Option 2", "2"));
 customDropDown.Items.Add(new ListItem("Option 9", "9"));
 }
 }
 }
 catch (Exception ex)
 {
 SystemLogger.Logger.Log(ex, LoggingLevel.Fatal);
 }
 }

 public override object Value
 {
 get
 {
 EnsureChildControls();
 return customDropDown.SelectedValue;
 }
 set
 {
 this.EnsureChildControls();
 customDropDown.SelectedValue = (string)ItemFieldValue;
 }
 }
}

BCS.bdcm

<method name="Create">
 <parameters>
 <parameter name="returnCCCadastrados" direction="Return">
 <typedescriptor name="ReturnCCCadastrados" typename="Models.ConvenioBI, CCCadastradosBDC">
 <typedescriptors>
 <typedescriptor name="Dbico_sq" defaultdisplayname="Id" identifiername="Dbico_sq" typename="System.Int32">
 <typedescriptor name="Descricao" defaultdisplayname="Descrição" typename="System.String">
 <typedescriptor name="CodigoCorporativo" defaultdisplayname="Código Corporativo" typename="System.String">
 <typedescriptor name="Login" defaultdisplayname="Criado Por" typename="System.String">
 <typedescriptor name="Grupo" defaultdisplayname="Grupo" typename="System.String">
 <properties>
 <property name="SPCustomFieldType" type="System.String">BiConvenioGrupoChoiceField</property>
 </properties>
 </typedescriptor>
 <typedescriptor name="DtCriacao" defaultdisplayname="Data Criação" iscollection="false" typename="System.DateTime">
 <interpretation>
 <normalizedatetime lobdatetimemode="UTC">
 </normalizedatetime></interpretation>
 </typedescriptor>
 <typedescriptor name="DtAtualizacao" defaultdisplayname="Data Atualização" iscollection="false" typename="System.DateTime">
 <interpretation>
 <normalizedatetime lobdatetimemode="UTC">
 </normalizedatetime></interpretation>
 </typedescriptor>
 </typedescriptor></typedescriptor></typedescriptor></typedescriptor></typedescriptors></typedescriptor></parameter>
 <parameter name="newCCCadastrados" direction="In">
 <typedescriptor name="NewCCCadastrados" typename="Models.ConvenioBI, CCCadastradosBDC">
 <typedescriptors> 
 <typedescriptor name="Descricao" defaultdisplayname="Descrição" typename="System.String" creatorfield="true">
 <typedescriptor name="CodigoCorporativo" defaultdisplayname="Código Corporativo" typename="System.String" creatorfield="true">
 <typedescriptor typename="System.String" name="Grupo" defaultdisplayname="Grupo" creatorfield="true">
 <properties>
 <property name="SPCustomFieldType" type="System.String">BiConvenioGrupoChoiceField</property>
 </properties>
 </typedescriptor>
 </typedescriptor></typedescriptor></typedescriptors>
 </typedescriptor>
 </parameter>
 </parameters>
 <methodinstances>
 <methodinstance name="Create" type="Creator" returnparametername="returnCCCadastrados" returntypedescriptorpath="ReturnCCCadastrados">
 </methodinstance></methodinstances>
 </method>
1 ответ

Я просто переопределяю свойство Sortable в моем настраиваемом полевом классе.

public override bool Sortable
{
 get
 {
 return false;
 }
}

Работает как шарм.

licensed under cc by-sa 3.0 with attribution.