Here are 10 nice tips designed for someone that's familiar with SharePoint, but may be new to InfoPath.
Having brooded over the idea for a while, I decided to quickly write this down, and if there are any questions I can expand some of these key points.
- Use InfoPath Designer 2010 to author your forms, even for 2007 forms. The UI is better, design checker gives you more information, and the rules editor supports copy/copy all and paste.
Note: design checker gives you a lot of warnings and sometimes... they can be ignored. Which ones are safe and which aren't... is as far as I know, a personal experience thing, think of it as VS.NET warnings.
- Design your main context fields first, and then try your best not to change existing fields (add new fields are OK). Removing or renaming fields often break existing forms that had already been filled out.
- Decide upfront whether this is a rich form or a browser form, and set the compatibility level appropriately. Use the design checker.
If you are planning to create hybrid forms that works on both - there's a form option that will allow your code behind to use the Rich Form API but still check the form for Browser Form compatibility. In this case, always check in your code whether the form is running in the browser before you call those APIs, otherwise you will get UnsupportedExceptions.
- If you need to promote InfoPath fields to SharePoint so they appear as columns (and can be used in workflows), you should always use site columns. You might want to consider always using Content Type as well.
It may be tempting to use publish to list - but this creates list fields that are now very hard to manage, and when you realize down the road that you should have used content types, you now have to fix existing list columns and move their data to the site columns. This always happens.
- Brush up on your XPath skills well. InfoPath renders every view via a XSLT transform and the output is actually a HTML page (either for rich form or web forms). You need to use XPath when you want to start defining rules that are relative to the current field. Why use rules when you can use code behind? See next point.
- Code behind are powerful, and may look much simpler to a developer, but has deployment considerations. In 2010, code behind can run either in a farm solution, or via the sandbox user code service. However, code in the sandbox service sometimes may not run when the service is "busy". Your best bet is either: deploy code through central administration - if you have access, but then you trip up tip #4 if you haven't been using site columns, or don't use code behind and write your logic using only rules. You can find detailed InfoPath documentation for developers on MSDN (it may not look like much, but you have functions like get-SharePointServerRootUrl that are just gems hiding)
Plus, trust me you feel awesome when you can write complex logic using declarative XPath and no C# code. It's like saying yes I could cheat and just use C#, or I can be godlike and do it in XPath.
- Copying pictures increases your resource size. The best way for a repeated picture is to include it as a resource, then use a picture button and set the image to your included resource. Unfortunately you can't set the image of a picture control.
- Export form as Source files, and work with the manifest.xsf. While I'm pretty certain it is unsupported to tweak the view.xsl files manually by hand, at least you can now put all the component files within a source control and check what has changed using a simple text difference tool.
- Learn how to call webservice with Rules. InfoPath is pretty dumb beyond what's within the form. Webservices gives you lots of capabilities but only if you know how to call them. E.g. how to interact with SharePoint users.
- Don't use the "can't be blank" option, always create validation rules. When any validation rules fail, it puts the form into an invalid state and prevents any submit action. If you have them all defined as validation rules - you can add an additional condition that allows saving E.g. if ForceSave = "0" and "MyField" is empty
This gives you control over what happens when the user is trying to save, and allow you to disable the checking when you need to.
Leave a comment if you feel this was helpful, or you want more explanation for any of the points. Thanks for reading.