| |
|
Submitting InfoPath data to a SharePoint list |
|
|
InfoPath data can be stored anywhere, in any database,
even in a text file. Sometimes, there is a need to store
the data somewhere else other than the library itself.
The form that is submitted and saved in Forms library is
an XML form and contains data. This data can also be
submitted to other locations when user clicks the submit
button. In this article, we will see how we can store
this data in a SharePoint list.
1. Create a custom list in SharePoint with the following
fields:
a. FirstName
b. LastName
c. Address
d. Zip
e. City
f. State
g. Country
h. Phone
i. Fax
j. Web
Data type for all the fields will be "Single line of
Text".
2. Open "user registration" form in editor.
3. Open VSTA
4. Add reference to "Microsoft.SharePoint.DLL".
There are some steps that you need to take before adding
the real code. We covered these steps in previous
articles but just in case, if you landed directly on
this page, here are the steps again:
5. Add a event handler in "InternalStartup()" function
|
EventManager.FormEvents.Loading +=
new
LoadingEventHandler(FormEvents_Loading);
|
6. Add the following in the class:
|
private
string
LibLocation
{
get
{
return
(string)FormState["LibLocation"];
}
set
{
FormState[ "LibLocation"]
= value;
}
}
private
string
Location
{
get
{
return
(string)FormState["Location"];
}
set
{
FormState[ "Location"]
= value;
}
}
|
7. Add following code in the FormEvents_Loading():
|
//Edit
mode
if
(e.InputParameters.ContainsKey("XmlLocation"))
{
Location = e.InputParameters[ "Source"].ToString();
Location = Location.Substring(0,
Location.IndexOf( "/",
8));
LibLocation = Location + e.InputParameters[ "XmlLocation"].ToString();
}
else
{
//New
mode
LibLocation = e.InputParameters[ "SaveLocation"].ToString();
}
|
This code defines location for the form submission, that
is, the URL where the form would be submitted.
8. Add following code in the "Submit_Clicked()":
|
XPathNavigator fname =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:FirstName",
this.NamespaceManager);
XPathNavigator lname =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:LastName",
this.NamespaceManager);
XPathNavigator address =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:Address",
this.NamespaceManager);
XPathNavigator zip =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:Zip",
this.NamespaceManager);
XPathNavigator city =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:City",
this.NamespaceManager);
XPathNavigator state =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:State",
this.NamespaceManager);
XPathNavigator country =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:Country",
this.NamespaceManager);
XPathNavigator phone =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:Phone",
this.NamespaceManager);
XPathNavigator fax =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:Fax",
this.NamespaceManager);
XPathNavigator web =
this.CreateNavigator().SelectSingleNode("/my:myFields/my:Web",
this.NamespaceManager);
SPWeb
webroot =
null;
try
{
webroot =
SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using
(SPSite
site = new
SPSite(webroot.Site.ID))
{
using
(SPWeb
localweb = site.OpenWeb(webroot.ID))
{
SPList
list = localweb.Lists["User
List"];
SPListItem listItem =
list.Items.Add();
localweb.AllowUnsafeUpdates =
true;
listItem[ "Title"]
= fname.Value.ToString();
listItem[ "FirstName"]
= fname.Value.ToString();
listItem[ "LastName"]
= lname.Value.ToString();
listItem[ "Address"]
= address.Value.ToString();
listItem[ "Zip"]
= zip.Value.ToString();
listItem[ "City"]
= city.Value.ToString();
listItem[ "State"]
= state.Value.ToString();
listItem[ "Country"]
= country.Value.ToString();
listItem[ "Phone"]
= phone.Value.ToString();
listItem[ "Fax"]
= fax.Value.ToString();
listItem[ "Web"]
= web.Value.ToString();
listItem.Update();
localweb.AllowUnsafeUpdates =
false;
}
}
});
FileSubmitConnection
SubmitConnection = (FileSubmitConnection)this.DataConnections["Main
submit"];
SubmitConnection.FolderUrl =
LibLocation.Substring(0, LibLocation.LastIndexOf( "/"));
SubmitConnection.Execute();
|
This code will get data from the form and submit it to
the SharePoint list. First we create XPathNavigator
objects for each of the form fields. We read value from
each field. Inserting data into a SharePoint list seems
to be simple but there are some caveats that you need to
be aware of. "SPWeb webroot = null" should be
declared outside the try ... catch block. You cannot
define it inside the "using" statement. It will throw an
error. It is important to use "RunWithElevatedPrivileges"
to avoid the permissions exception. If you don't declare
"webroot" object outside the try ... catch block, you
get an "Operation is not valid due to the current state
of the object." error. In the end, define an object of "FileSubmitConnection"
type and use the "Execute()" method to submit the form
to the library.
Download completed InfoPath form and application code (ZIP format)
Happy programming!
|
|
|