Innanzi tutto cosa ho trovato nell'event viewer. Quando creo la form la url invocata è del tipo:
http://<ServerName>/_layouts/FormServer.aspx?XsnLocation=http://srvsp01/FormServerTemplates/formName.xsn&SaveLocation=http://<ServerName>/nav/temp/Changes&Source=http://<ServerName>/nav/temp/Changes/Forms/AllItems.aspx&DefaultItemOpen=1Quello che ci interessa è il parametro SaveLocation.
Quando riapro il form invece la url invocata è:
http://<ServerName>/_layouts/FormServer.aspx?XmlLocation=/nav/temp/Changes/formName.xml&Source=http://<ServerName>/nav/temp/Changes/Forms/AllItems.aspx&DefaultItemOpen=1Quindi le due url non sono uguali. Detto questo la soluzione prevede di cambiare a runtime la url della Data Connection di tipo Submit. Anche in questo caso c'è l'inghippo. Infatti ho scoperto a mie spese, che l'unico evento in grado di modificare con successo la url della Data Connection è l'evento di Loading.
Ecco il codice finito e funzionante.
using Microsoft.Office.InfoPath; using System; using System.Xml; using System.Xml.XPath; namespace caricafiles { public partial class FormCode { private object _strUri { get { return FormState["_strUri"]; } set { FormState["_strUri"] = value; } } // NOTE: The following procedure is required by Microsoft Office InfoPath. // It can be modified using Microsoft Office InfoPath. public void InternalStartup() { EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading); } public void FormEvents_Loading(object sender, LoadingEventArgs e) { Init(e); } // Modificare la url della data connection è possibile solo nel metodo FormEvents_Loading private void Init(LoadingEventArgs e) { //Get the Uri (or SaveLocation in a browser form) of where //the form was opened //See if the form was opened in the browser Boolean OpenedInBrowser = Application.Environment.IsBrowser; //Get a reference to the submit data connection FileSubmitConnection fc = (FileSubmitConnection)this.DataConnections["FOB Save"]; //If so, we will get the "SaveLocation" from the InputParameters if (OpenedInBrowser) { if (e.InputParameters.ContainsKey("SaveLocation")) { _strUri = e.InputParameters["SaveLocation"].ToString(); } else if (e.InputParameters.ContainsKey("Source")) { string source = e.InputParameters["Source"].ToString(); _strUri = source.Substring(0, source.IndexOf("Forms") - 1); } else { _strUri = _strUri; } } else { //If it was opened in the client, we will get the Uri _strUri = this.Template.Uri.ToString(); } //Modify the URL we want to submit fc.FolderUrl = (string)_strUri; } } }Ultima nota: tenete in considerazione la lingua di InfoPath client quando andate a cercare aiuto un internet perchè i nodi della form InfoPath vengono localizzati e quindi il codice XPath di un nodo di una form in inglese risulta diverso da quello di una form in italiano.