Pregunta

Guardar las propiedades de tipo de campo personalizadas usando spfield.setCustomProperty dentro del evento IfieldEditor.onsaveChange no parece funcionar, por razones explicadas en otra parte.

He visto todo tipo de cuerpos Solución para este problema (incluido el uso de almacenamiento local de subprocesos o trucos de JavaScript desagradables), pero no puedo creer que esto sea como Microsoft previsto.

¿Hay alguna manera de obtener configuraciones de columna compleja de la página Add/Edit Column a los eventos de creación de columnas (spfield.onadded, spfield.onupdated) sin recurrir a estos métodos? ¿O es solo una supervisión masiva?

¿Fue útil?

Solución

Un enfoque podría ser el de Gunnar Peipman - Use la reflexión para evitar el campo SetCustomProperty por completo. Me ha funcionado bien un par de veces.

private void SetFieldAttribute(string attribute, string value)
{
Type baseType; 
BindingFlags flags;
MethodInfo mi;

baseType = typeof(MyCustomField);
flags = BindingFlags.Instance | BindingFlags.NonPublic;
mi = baseType.GetMethod("SetFieldAttributeValue", flags);
mi.Invoke(this, new object[] { attribute, value });
}

private string GetFieldAttribute(string attribute)
{
Type baseType;
BindingFlags flags;
MethodInfo mi;
baseType = typeof(MyCustomField);
flags = BindingFlags.Instance | BindingFlags.NonPublic;
mi = baseType.GetMethod("GetFieldAttributeValue", 
                            flags, 
                            null, 
                            new Type[] { typeof(String) }, 
                            null);
object obj = mi.Invoke(this, new object[] { attribute });

if (obj == null)
    return "";
else
    return obj.ToString();
}

Otros consejos

He estado usando SetCustomProperty en un proyecto reciente. La forma en que se implementó fue crear un nuevo tipo de campo y heredar de Spfield. Luego se creó y almacenó un tipo de campo XML de campo personalizado en 12hive Templates xml fldtypes_ [ProjectName] .xml y se describió un esquema de propiedad en este archivo XML para el tipo de campo:----

    <PropertySchema>
      <Fields>
        <Field Name="MultiImageMaxNoImages"
               DisplayName="Maximum Number of Images"
               MaxLength="1"
               Type="Number">
          <Default>4</Default>
        </Field>
        <Field Name="MultiImageMaxSize"
               DisplayName="Maximum Size of Image (Kb)"
               MaxLength="5"
               Type="Number">
          <Default>1024</Default>
        </Field>
      </Fields>
    </PropertySchema>

Luego creé un par de propiedades públicas en la clase Spfield que usaría lo siguiente para guardar las propiedades de campo.

    /// <summary>
    /// The maximum number of images that can be stored in the field.
    /// </summary>
    public int MaxImages
    {
        get
        {
            int maxImages = 4;
            Int32.TryParse(GetCustomProperty(Providers.MultiImageFieldProvider.Properties.MaxNumberOfImages).ToString(),out maxImages);
            return maxImages;
        }

        set
        {
            int maxImages = value;
            SetCustomProperty(Providers.MultiImageFieldProvider.Properties.MaxNumberOfImages,maxImages);
        }
    }

El proveedor.MultiImageFieldProvider es solo una clase de ayuda estática:

    /// <summary>
    /// Provider for common SharePoint fields and functions.
    /// </summary>
    public static class MultiImageFieldProvider
    {
        /// <summary>
        /// Properties class contains internal names of extra custom properties 
        /// </summary>
        public static class Properties
        {
            // Custom Properties
            public const string MaxNumberOfImages = "MultiImageMaxNoImages";
            public const string MaxSize = "MultiImageMaxSize";
        }
    }
Licenciado bajo: CC-BY-SA con atribución
scroll top