2

Does anyone know if there is a way to deploy a BrowserFormWebPart (custom InfoPath form for a list content type) using standard AllUsersWebPart element and a CDATA section for the properties? So far I have tried without success. Any help is appreciated.

Pete Skelly
  • 775
  • 6
  • 16

2 Answers2

2

After 2 days of research - Following code works

  private void UpdateInfoPathForms(SPSite oSite)
    {
        UpdateInfoPath(oSite, "Lists/Audit Calendar/Item/newifs.aspx");
        UpdateInfoPath(oSite, "Lists/Audit Calendar/Item/displayifs.aspx");
        UpdateInfoPath(oSite, "Lists/Audit Calendar/Item/editifs.aspx");
    }

    private void UpdateInfoPath(SPSite oSite, string formFileLocation)
    {
        var file = oSite.RootWeb.GetFile(formFileLocation);

        using (SPLimitedWebPartManager manager = file.GetLimitedWebPartManager(System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared))
        {
            try
            {
                var wp1 = new Microsoft.Office.InfoPath.Server.Controls.WebUI.BrowserFormWebPart();

                wp1.SubmitBehavior = Microsoft.Office.InfoPath.Server.Controls.WebUI.SubmitBehavior.FormDefault;
                wp1.FormLocation = "~list/Item/template.xsn";
                wp1.ContentTypeId = oSite.RootWeb.Lists["Audit Calendar"].ContentTypes["Item"].Id.ToString();

                IListWebPart listWebpart = wp1 as IListWebPart;

                listWebpart.ListId = oSite.RootWeb.Lists["Audit Calendar"].ID;

                if (formFileLocation.Contains("newifs.aspx"))
                {
                    listWebpart.PageType = PAGETYPE.PAGE_NEWFORM;
                }
                else if (formFileLocation.Contains("displayifs.aspx"))
                {
                    wp1.ListFormMode = Microsoft.Office.InfoPath.Server.Controls.WebUI.ListFormMode.ReadOnly;
                    listWebpart.PageType = PAGETYPE.PAGE_DISPLAYFORM;

                }
                else if (formFileLocation.Contains("editifs.aspx"))
                {
                    listWebpart.PageType = PAGETYPE.PAGE_EDITFORM;
                }
                listWebpart.ViewFlags = SPViewFlags.None;

                manager.AddWebPart(wp1, "Main", 0);
                manager.SaveChanges(wp1);
            }
            finally
            {
                manager.Web.Dispose();
            }
        }
0

I have had the same problem. Here is what I tried:

<AllUsersWebPart WebPartZoneID="Main" WebPartOrder="2">
    <![CDATA[
    <webParts>
        <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
            <metaData>
                <type name="Microsoft.Office.InfoPath.Server.Controls.WebUI.BrowserFormWebPart, Microsoft.Office.InfoPath.Server, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
                <importErrorMessage>Cannot import this Web Part.</importErrorMessage>
            </metaData>
            <data>
                <properties>
                    <property name="ChromeType" type="chrometype">None</property>
                    <property name="HelpMode" type="helpmode">Modeless</property>
                    <property name="ChromeState" type="chromestate">Normal</property>
                </properties>
            </data>
        </webPart>
    </webParts>]]>
</AllUsersWebPart>

I then have a Feature Receiver that configures the web part:

using (SPLimitedWebPartManager manager = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
{
    try
    {
        BrowserFormWebPart webpart = GetWebPart(manager);
        webpart.SubmitBehavior = SubmitBehavior.FormDefault;
        webpart.FormLocation = "~list/MyList/template.xsn";
        webpart.ContentTypeId = "0x01003C8AD6E14DAD5342BBFAA84E63F8022C";
        manager.SaveChanges(webpart);
    }
    finally
    {
        manager.Web.Dispose();
    }
}

The BrowserFormWebPart properties are required for getting the form to display, but for some reason, setting those properties in the AllUsersWebPart section did not work. The form displays and I can fill it out, but the values from the form do not get inserted into the fields of the list item. I added the following section to the Feature Receiver to try to get the form to tie into the fields of the list item:

IListWebPart listWebpart = webpart as IListWebPart;
listWebpart.PageType = PAGETYPE.PAGE_EDITFORM;
listWebpart.ViewFlags = SPViewFlags.None;

Unfortunately, no joy. And that is as far as I got. Hopefully you'll have better luck.

Rich Bennema
  • 10,295
  • 4
  • 37
  • 58
  • Thansk Rich. This is the approach I am taking. I will update the post once I have more information or a solution. – Pete Skelly May 26 '11 at 18:58
  • @Pete Skelly: Dis you eventually found a solution for this? – JohnDoDo Feb 07 '12 at 15:14
  • @JohnDoDo Unfortunately no, the client ended up resigning themselves to publishing the InfoPath Forms and not deploying them as configured. I got way into the bowels of .NET Reflector and determined that some properties (I cannot recall them specifically) were not being serialized/deserialized as expected but ran out of time. – Pete Skelly Feb 08 '12 at 21:20
  • "You don't know the power of the dark side" of sharepoint when you bought it – Steve B Jun 14 '12 at 11:44