Formular einer bestehenden SharePoint Liste via Code ändern

SharePoint 2010 nutzt Rendering Templates um die Formulare seiner Listen zur Laufzeit zu erstellen. Ein Entwickler kann weitere Templates erstellen und diese beispielsweise an ContentTypes zu definieren.

An bestehenden Listen kann man zwar über das Property “TemplateName” den aktuellen Wert auslesen, eine Änderung ist aber nicht möglich.

Dies erreicht man nur über die Anpassung der generierten ListFormWebParts in der Datenbank.

Abhilfe schafft diese ExtensionMethod.

public static class FormExtensions
{
    public static void SetListFormTemplate(this SPForm form, string templateName)
    {
        if (form == null) throw new ArgumentNullException("form");
        if (string.IsNullOrEmpty(templateName)) throw new ArgumentException("templateName required");

        var web = form.ParentList.ParentWeb;
        var file = web.GetFile(form.Url);

        Debug.WriteLine("SetListFormTemplate: " + file.Url + " to " + templateName);

        web.AllowUnsafeUpdates = true;
        using (var lwpm = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
        {
            try
            {
                lwpm.Web.AllowUnsafeUpdates = true;

                var webPart = lwpm.WebParts.Cast<System.Web.UI.WebControls.WebParts.WebPart>().FirstOrDefault(x => x is ListFormWebPart);

                if (webPart != null)
                {
                    var lfWebPart = webPart.WebBrowsableObject as ListFormWebPart;
                    lfWebPart.TemplateName = templateName;
                    lwpm.SaveChanges(lfWebPart);
                }

                lwpm.Web.AllowUnsafeUpdates = false;
            }
            finally
            {
                if (lwpm.Web != null)
                    lwpm.Dispose();
            }
        }

        file.Update();
        web.AllowUnsafeUpdates = false;
    }
}
 

Dieser Code kann dabei als PowerShell Skript verpackt werden, in eine Verwaltungsseite eingebettet oder in einem FeatureReceiver genutzt werden um die Templates via Code zu manipulieren. Hierzu muss einfach in einem Account der die nötigen Rechte besitzt die Extension Method an dem jeweiligen Formular aufgerufen werden.

using (var site = new SPSite("http://win7-mp1/"))
{
	var web = site.RootWeb;

	var list = web.Lists["Sample"];
	var form = list.Forms[PAGETYPE.PAGE_DISPLAYFORM];

	form.SetListFormTemplate("MichListForm");             
}

 

Somit können auch Formulare von bereits bestehenden Listen leicht und sauber angepasst werden. Die RenderingTempaltes sollten dabei ganz normal via gemappte Folder nach “ControlTemplates” deployed werden.

Kommentar schreiben