.NET

SharePoint form Web Controls

Hace un tiempo encontré una entrada publicada en el blog de René Hézser donde explica con detalle como funcionan los campos de nuestras listas y los controles que se generan para visualizarlos (en edit, new o display mode).

Dispone de un claro ejemplo en el que crea un tabla con todos los campos de un item de una lista. Muestra el título, el campo en DisplayMode y en campo en EditMode.

En el caso de trabajar con campos especiales desarrollados por terceros, el código de René no funciona correctamente ya que no pueden resolver el código (Assembly) correspondiente al campo. He generado una nueva versión de su código que realiza la carga dinámica del assembly asociado al campo y permite su correcta visualización.

public static Control GetSharePointControls(SPField field, SPList list, SPListItem item, SPControlMode mode)
{
    // check if the field is a buildIn field, or can be rendered by a SharePoint Control
    if (field == null || field.FieldRenderingControl == null || field.Hidden) return null;

    try
    {
        // BaseFieldControl webControl = field.FieldRenderingControl;

        BaseFieldControl webControl = (BaseFieldControl)this.loadObject(field.FieldRenderingControl.GetType().Assembly.ToString(), field.FieldRenderingControl.ToString());

        webControl.ListId = list.ID;
        webControl.ItemId = item.ID;
        webControl.FieldName = field.Title;
        webControl.ID = GetControlID(field);
        webControl.ControlMode = mode;

        return webControl;
    }
    catch (Exception ex)
    {
        var errorLabel = new Label
                     {
                         ID = "ErrorLabel",
                         Text = string.Format("Error in GetSharePointControls:<br/>{0}", ex)
                     };
        return errorLabel;
    }
}    // GetSharePointControls
private Object loadObject(string assemblyString, string className)
{
    Object o = null;
    try
    {
         // Try to instantiate the object without load any DLL (if it was loaded early)
         o = Activator.CreateInstance(Type.GetType(className, true, true));
    }
    catch
    {
        try
        {
            // Try again loading the assembly
            Assembly assembly = Assembly.Load(assemblyString);
            o = Activator.CreateInstance(assembly.GetType(className, true, true));
        }
        catch (Exception ex)
        {
            throw new Exception("There has been a problem when instantiate object " + className + " de " + assemblyString, ex);
        }
    }
    return o;
} // loadObject

Con la llamada al método loadObject conseguimos realizar la carga de la DLL que contiene el Assembly si este no se encuentra ya cargado anteriormente.