Microsoft InfoPath 2010
The official blog of the Microsoft InfoPath team

  • Microsoft InfoPath 2010

    Hiding hint text when conditionally hiding a repeating or optional control

    • 2 Comments

    Certain controls, such as repeating and optional sections and repeating tables, will display a link that, when clicked, will insert a new item into the form. By default, the text of this link, which is called hint text, is “Insert item” for repeating controls and “Click here to insert” for optional sections.  This text can be customized or turned off completely through each of these control’s property dialogs.

    In addition, the InfoPath Designer enables you to specify conditional formatting for these controls.  One of the actions that you can perform is to hide the control based on some condition.  When that condition is true, the control is hidden.  However, when the control is hidden, the hint text remains visible. This is often perceived as a bug in InfoPath but is actually by-design.

    The reason behind this is simple and makes complete sense once you understand it.  Very simply put, each of the repeating controls allows you to set conditional formatting on a per-row basis.  This means that you can specify a condition that will hide a specific row and not the entire repeating table or all instances of the repeating section.

    However, sometimes, especially in the case of optional sections, you wish to hide the entire control instead of just a single row.  The workaround for this is to put the control inside a section.  Then, set the condition which will hide the control on the section itself.  This will hide the section and all controls within it.

     

  • Microsoft InfoPath 2010

    Calling code/script from a Rule

    • 7 Comments

    Rules are a quick way to add dynamic functionality to a form, so a lot of programmers choose to use rules even when they know how to write the code to do the same thing. However, sometimes after writing a complex set of rules they may realize that they need to do something rules doesn’t support, and we know they don’t want to rewrite all their rules in code just to add that one little bit.

    Alas, there’s no rules action type for “Call code”, but there is a roundabout way to call your code anyway.

    Let’s say you have the following function in your form template:

    VBScript
    Function Test(param)
      XDocument.UI.Alert("Param: " & param)
      Test = true
    End Function
    Jscript
    function Test(param) {
      XDocument.UI.Alert("Param: " + param);
      return true;
    }
    VB.Net
    Public Function Test(ByVal param As String) As Boolean
      thisXDocument.UI.Alert("Param: " & param)
      Test = True
    End Function
    C#
    public boolean Test(string param) {
      thisXDocument.UI.Alert("Param: " + param);
      return true;
    }

     

    You can call that function from the condition of a rule by using the xdExtension namespace.

    For example, here’s how to call the function from a rule when the form is opened:

    1. Click Form Options on the Tools menu.
    2. On the Open and Save tab, click Rules.
    3. Click Add, name the rule, and then click Set Condition.
    4. Select The expression in the first drop-down list, and then enter: xdExtension:Test(“foo”)
    5. If you want the function to be conditional, then put the condition before the function call with an AND clause. For example, to get if foo>bar, then Test(“foo”), use foo>bar and xdExtension:Test(“foo”). (This is possible because conditions are evaluated using short-circuit boolean evaluation. In other words, they are evaluated one clause at a time, and if the first clause determines the result, then the rest of the conditions are “short circuited” and don’t get executed.)
    6. The Rule dialog box requires at least one action, but if you don’t have any actions to run in that rule, you can click OK if you select the Stop processing rules when this rule finishes checkbox. To avoid actually stop processing rules, make your condition always return false. For example: xdExtension:Test(“foo”) and false (“false” here is actually looking for the node named “false” which doesn’t exist, so returns the empty set, which is translated to false(). You could just as easily use “foobar” or anything else.)

    Finally, extract your form files and add the following attribute to the manifest.xsf file’s xDocumentClass element:

    xmlns:xdExtension="http://schemas.microsoft.com/office/infopath/2003/xslt/extension"

  • Microsoft InfoPath 2010

    InfoPath @ TechEd 2005 Orlando

    • 0 Comments

    We should have blogged something earlier, but we’ve been too busy getting ready for a great TechEd experience!

    InfoPath falls into the Smart Client Development track. By now, if you’re attending TechEd in Orlando next week you should already have your Breakout sessions picked out. In case you’re still waffling, the three sessions you must attend are:

    CLI235  InfoPath: Introduction to Forms Development
    Day/Time: Monday, June 6 3:15 PM - 4:30 PM Room: N 310 H
    Speaker: Edward Essey
    This session quickly runs through the many must-know development techniques that form the foundation of InfoPath 2003 development. We discuss declarative form design, rules, calculations, deployment and security levels. If you have not yet built and deployed an InfoPath solution, this session gives you the basis you need for the following advanced sessions.

    CLI333  InfoPath: Best Practices for Building Enterprise Solutions
    Day/Time: Monday, June 6 5:00 PM - 6:15 PM Room: N 220 E
    Speaker: Joshua Bell
    This is a must-attend session for developers who want to learn best practices, tips and tricks, how-tos and detailed internals of the InfoPath programming model. Sample topics covered include workflow, offline, connectivity, SharePoint products and technology integration, end-to-end solution examples, and more.

    (Repeats as CLI333R on Thursday, June 9 1:30 PM - 2:45 PM Room: S 310 E)

    CLI335  InfoPath: Developing Forms Using Managed Code
    Day/Time: Friday, June 10 9:00 AM - 10:15 AM Room: S 320 G
    Speaker: David Gerhardt
    This session focuses on InfoPath 2003's support for managed code. Learn how to start with InfoPath projects using the Toolkit for Visual Studio .NET 2003, use managed code in your InfoPath form to implement business logic, and integrate with the .NET Framework. Drill into InfoPath's XML-based programming model and best practices for InfoPath solution development with managed code, including covering issues around architecture, security and deployment.

    The three of us presenting have been working hard together to make sure our sessions cover pretty much everything you need to know to get started with InfoPath and scale up to enterprise solutions.

    In addition, we’ll have a slot at the Smart Client Development “Cabana” area to answer your questions, and we’ll be presenting several “Chalk Talk” interactive discussions. Last year we had a blast brainstorming with attendees to help architect solutions using InfoPath. John and Scott from the InfoPath team are attending as well to answer your questions, as well as Patrick from InfoPathDev.com.

    And that’s just the InfoPath team itself! If you search for other sessions talking about InfoPath you’ll find nearly a dozen Breakouts and Labs.

  • Microsoft InfoPath 2010

    Creating an InfoPath Custom Control using C# and .NET

    • 14 Comments

    In Office 2003 Service Pack 1 (SP1), new features and the InfoPathControl and InfoPathControlSite objects were added to InfoPath to support the development of custom controls implemented using Microsoft ActiveX technology. ActiveX controls are developed using unmanaged COM code, typically written in C++ or Visual Basic 6.0. With the increasing popularity of the Microsoft .NET Framework, many developers are switching to working with managed code, such as C# and Visual Basic .NET. As an alternative to using unmanaged code to create a custom ActiveX control, you can create a user control (a control derived from the .NET Windows Forms UserControl class) that will function as an InfoPath custom control by using COM Interop. COM Interop provides interoperability between the .NET assembly compiled for your user control and the unmanaged code of InfoPath. Although Windows Forms user controls are not natively supported by InfoPath SP1, once you handle the details required for COM Interop and security, writing your .NET code is really easy. In this blog entry, we'll give you an overview of how to get a .NET control to work in InfoPath. This entry won’t go over the basics of writing .NET user controls, so if you are not familiar with user controls, you will need to find that information before the discussion in this blog entry will be useful to you. The basic steps for creating a user control are described in Walkthrough: Authoring a User Control with Visual C#. For additional details on creating custom ActiveX controls for InfoPath, you can view the Creating Custom Controls for InfoPath SP1 webcast, and work with the ActiveX Controls in InfoPath 2003 hands-on training.
     
    Adding the Right Attributes
    To get a .NET user control to work with unmanaged code, certain attributes will need to be added to its source code. In the ActiveX world, all controls have GUIDs (globally unique identifiers). To do this in .NET, you will need to use the GuidAttribute attribute to specify a GUID. This attribute is part of the System.Runtime.InteropServices namespace.

    COM interop will expose methods and properties based on the setting of the ClassInterface attribute. This attribute must be set to ClassInterfaceType.AutoDual in order for the control to work correctly in InfoPath.

    [ClassInterface(ClassInterfaceType.AutoDual)]

    But you will still need to expose the Value and Enabled properties of your control to InfoPath. To do this, you declare an interface for these properties that you will implement within the user control class. The InterfaceType attribute on this interface should be set to InterfaceIsDual as shown in the following line of code:

    [InterfaceType(ComInterfaceType.InterfaceIsDual)]

    This attribute setting will expose all of the properties on this interface.
     
    Additionally, for the property notifications to fire you will need to specify COM dispatch identifiers (DISPIDs) for the Enabled and Value properties of your control. To assign DISPIDs using COM interop, you use the DispId attribute, which is also part of the System.Runtime.InteropServices namespace.
     
    Putting all of this together, the skeletal code for your control should look something like the following example:

    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ICOMControl
    {
      [DispId(UserControl1.DISPID_VALUE)]
      string Value { get; set; }
     
      [DispId(UserControl1.DISPID_ENABLED)]
      bool Enabled { get; set; }
    }

    [Guid("6E6F8C69-2643-4f45-B111-3ABE034940D9")]
    [ClassInterface(ClassInterfaceType.None)]
    public class UserControl1 : System.Windows.Forms.UserControl, ICOMControl
    {
       ...
    }

    Note that ICOMControl is the name we’ve given to the interface we defined which must be implemented within the control class to expose the Value and Enabled properties. The user control class derives from this interface, provides the actual implementation of the get and set methods of the properties, and specifies the values for the DISPID_VALUE and DISPID_ENABLED constants. See the full listing later in this blog entry for more details. 
     
    The IPropertyNotifySink Interface
    The COM IPropertyNotifySink interface is required for InfoPath to know when to update the XML field which is bound to the ActiveX control. Property notifications should be fired by the control for this to happen. .NET user controls do not have an equivalent interface that will work in COM Interop, but you can work around this by importing the unmanaged IPropertyNotifySink interface and then writing your own implementation of it in managed code. This is accomplished by using the ComImport and InterfaceType attributes as shown in the following example.

    [ComImport]
    [Guid("9BFBBC02-EFF1-101A-84ED-00AA00341D07")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPropertyNotifySink
    {
       int OnChanged(int dispId);

       [PreserveSig]
       int OnRequestEdit(int dispId);
    }

    In addition to this code, you need to a create a delegate for the two events of your control class. The delegate should look like this:

    public delegate int PropertyNotifySinkHandler(int dispId);

    And your events should look like this:

    public event PropertyNotifySinkHandler OnChanged;
    public event PropertyNotifySinkHandler OnRequestEdit;

    You also need to specify that the imported IPropertyNotifySink interface is exposed as a source of COM events. You do this by adding the ComSourceInterfaces attribute to your control's class. The attribute should look like this:

    [ComSourceInterfaces(typeof(IPropertyNotifySink))]

    And finally, when implementing the Value and Enabled properties of the control, don't forget to fire the OnChanged event when the Value property is changed.
     
    Satisfying Security

    Custom controls written with a .NET language still have the same security restrictions as unmanaged ActiveX controls used in InfoPath: the .CAB file for the control must be signed with a digital signature, and the IObjectSafety interface must be implemented on the control. The IObjectSafety interface is an unmanaged interface but can still be implemented if you import and rewrite the interface in .NET. This is similar to what we did for the IPropertyNotifySink interface above:

    [ComImport]
    [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IObjectSafety
    {
       [PreserveSig]
       int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions);
                            
       [PreserveSig]
       int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions);
    }

    The user control class must derive from the IObjectSafety interface and implement the GetInterfaceSafetyOptions and SetInterfaceSafetyOptions methods. See the complete listing in the following section for details on how to do this.

    Coding Checklist
    We've gone over quite a few things that need to be done to create a .NET user control that works with InfoPath. Below is a checklist of the things you should have already done:

    • Add the Guid attribute to your control class
    • Add the ComSourceInterfaces attribute to your control class
    • Set the control’s ClassInterface attribute to ClassInterfaceType.None
    • Declare an interface for the Value and Enabled properties of your control, setting the InterfaceType attribute to ComInterfaceType.InterfaceIsDual
    • Import and implement the COM IPropertyNotifySink interface
    • Import and implement the COM IObjectSafety interface

    The following listing provides the code behind a simple .NET user control that contains a read-only TextBox control that can be bound to a field in an InfoPath form.

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace WindowsControlLibrary1
    {
       /// <summary>
       /// Summary description for UserControl1.
       /// </summary>

       [InterfaceType(ComInterfaceType.InterfaceIsDual)]
       public interface ICOMControl
       {
          [DispId(UserControl1.DISPID_VALUE)]
          string Value { get; set; }

          [DispId(UserControl1.DISPID_ENABLED)]
          bool Enabled { get; set; }
       }

       [ComImport]
       [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
       [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
       interface IObjectSafety
       {
          [PreserveSig]
          int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions);
                           
          [PreserveSig]
          int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions);
       }

       [ComImport]
       [Guid("9BFBBC02-EFF1-101A-84ED-00AA00341D07")]
       [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
       public interface IPropertyNotifySink
       {
          [PreserveSig]
          int OnChanged(int dispId);
     
          [PreserveSig]
          int OnRequestEdit(int dispId);
       }

       public delegate int PropertyNotifySinkHandler(int dispId);

       [Guid("1FEE489F-A555-4408-8FBF-3F69F8C57A43")]
       [ClassInterface(ClassInterfaceType.None)]
       [ComSourceInterfaces(typeof(IPropertyNotifySink))]
       public class UserControl1 : System.Windows.Forms.UserControl, ICOMControl, IObjectSafety
       {
          public event PropertyNotifySinkHandler OnChanged;
          public event PropertyNotifySinkHandler OnRequestEdit;

          private System.Windows.Forms.TextBox textBox1;
          /// <summary>
          /// Required designer variable.
          /// </summary>
          private System.ComponentModel.Container components = null;

          // Constants for implementation of the IObjectSafety interface.
          private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
          private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
          private const int S_OK = 0;

          // Constants for DISPIDs of the Value and Enabled properties.
          internal const int DISPID_VALUE = 0;
          internal const int DISPID_ENABLED = 1;

          public UserControl1()
          {
             // This call is required by the Windows.Forms Form Designer.
             InitializeComponent();
             // TODO: Add any initialization after the InitComponent call
          }

          // Implementation of the IObjectSafety methods.
          int IObjectSafety.GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
          {
             pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
             pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
             return S_OK;   // return S_OK
          }
     
          int IObjectSafety.SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
          {
             return S_OK;   // return S_OK
          }

          protected int Fire_OnRequestEdit(int dispId)
          {
             if (this.OnRequestEdit != null)
                return this.OnRequestEdit(dispId);
             else return 0;
          }

          protected int Fire_OnChanged(int dispId)
          {
             if (this.OnChanged != null)
                return this.OnChanged(dispId);
             else return 0;
          }

          // Implementation of the Value property get and set methods.
          public string Value
          {
             get { return textBox1.Text; }
             set { textBox1.Text = value; }
          }

          /// <summary>
          /// Clean up any resources being used.
          /// </summary>
          protected override void Dispose( bool disposing )
          {
             if( disposing )
             {
                if( components != null )
                   components.Dispose();
             }
             base.Dispose( disposing );
          }

          // Component Designer generated code goes here.
          ...

          private void textBox1_TextChanged(object sender, System.EventArgs e)
          {
             Fire_OnChanged( UserControl1.DISPID_VALUE );
          }
       }
    }

    Compiling a .NET User Control for COM Interop
    To compile a .NET user control for COM Interop, follow these steps:

    1. In Visual Studio .NET 2003, open the Solution Explorer and right-click on the project item.
    2. Click Properties to display the properties pane for the project.
    3. Under Configuration Properties, click Build.
    4. Under Outputs, change Register for COM Interop to True.

    The next time you compile, your user control will be available to unmanaged code.
     
    Adding a .NET User Control to the InfoPath Controls Task Pane
    When you add a new custom control using the InfoPath Add Custom Control Wizard, InfoPath will look only for controls that are in the "Controls" category. However, when .NET Controls are compiled, they are categorized as ".NET Controls", which InfoPath does not look for. To manually add a .NET control, you must create an .ICT file and store it in the C:\Documents and Settings\username\Local Settings\Application Data\Microsoft\InfoPath\Controls folder. If you have not added any custom controls to InfoPath's Controls task pane, you will need to create this Controls folder yourself. The easiest way to create an .ICT file is to add an ActiveX control to the Controls task pane in InfoPath, and then copy the .ICT file which is created automatically by InfoPath.
     
    Getting a .NET User Control into a Self-Registering CAB file
    InfoPath requires custom controls to be packaged in CAB files for deployment. The normal way for .NET Controls to be deployed is to add a Setup Project to the solution in Visual Studio, which will produce an MSI file when the solution is compiled. An MSI file is required for a .NET control to be registered for COM Interop. The MSI file that is generated by the Setup Project can then be packaged in a CAB file, but CAB files do not automatically run and register MSI files. You can work around this by creating an .INF file similar to the following example which has hooks to execute the .MSI file after the CAB file is extracted:

    [Setup Hooks]
    hook1=hook1

    [hook1]
    run=msiexec.exe /i %EXTRACT_DIR%\MSI.msi /qn

    [Version]
    ; This section is required for compatibility on both Windows 95 and Windows NT.
    Signature="$CHICAGO$"
    AdvancedInf=2.0

    Note   There is a bug in the .NET Framework that will cause any Label controls used in a .NET user control to throw GDI+ exceptions. You can workaround this by using GDI+ to draw your own text, or you can use a TextBox control instead and set its ReadOnly property to True.

  • Microsoft InfoPath 2010

    Encrypting and Decrypting InfoPath Form Data

    • 2 Comments

    This question comes up frequently:

    Can I encrypt the XML data coming out of InfoPath?

    The answer is "yes!", and there is a wonderful article on MSDN that explains just how to do it, titled Extending the Save Functionality in InfoPath 2003. The article covers a lot of ground, and includes managed code samples showing how to perform data encryption during OnSaveRequest and decryption during OnLoad. Similar code can be used during OnSubmitRequest to encrypt the data before sending it out over the wire.

  • Microsoft InfoPath 2010

    Maintain the current selection when moving a node

    • 0 Comments

    In a previous blog entry we showed how to add buttons to move rows in a Repeating Table up and down. We were playing with that solution again and realized it was hard to visually track the items as they moved – each row looks similar so after a click to move the row your eyes have to scan the view to find it again. This is especially problematic if you're trying to move the row several slots up or down.

    Fortunately, there's an easy tweak you can make that takes advantage of the View OM.

    Most operations in InfoPath are data-centric – you cause changes in the view by manipulating the data, which causes a view update. The XDocument.View object provides some view-centric functionality:

    • EnableAutoUpdate/DisableAutoUpdate/ForceUpdate
    • ExecuteAction
    • Export
    • GetContextNodes
    • GetSelectedNodes
    • SelectNodes
    • SelectText
    • SwitchView

    Another blog entry discussed the usage of SelectText and SelectNodes for driving selection within the view. In this case, we'll take advantage of SelectNodes to provide visual feedback to the user when a row is moved.

    In the Move Up/Move Down example, there were blocks of code responsible for moving the XML node corresponding to the row by manipulating the DOM. In the Move Up case it looked like this:

    oParent.removeChild oItem
    oParent.insertBefore oItem, oPrevious

    Simply add this line following those (within the same if block):

    XDocument.View.SelectNodes oItem

    Make a similar change in the MoveDown case. After you've made these changes, Preview, and you should see that when a row is moved it becomes selected. Now it's easier to tell which row was moved.

  • Microsoft InfoPath 2010

    InfoPath & Outlook 2003 Calendar Sync

    • 2 Comments

    If the title of this post interested you, check out Microsoft’s Sample solution for Recruiting, which has sample code for scenarios involving interview management. Just follow these links:

    http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=162697e2-c63c-42e4-adae-a64b73e9b0a6

    http://www.microsoft.com/office/solutions/accelerators/recruiting/default.mspx

    The full source code is available for download at the first link above. Among other things, it has an InfoPath solution which:

    • Enables automatic scheduling (and creating) of appointments by looking up Exchange’s free busy information
    • Does processing of appointment accept/reject messages
      Presents the free busy information in the same way Outlook does, all in the InfoPath view!
    • Configurable scheduling window with built-in constraints such as “lunch”, “last” and “optional”
    • Smart algorithm for picking meeting times based on the number of interviewers – blending brute force with a Monte Carlo/heuristics-based mechanism.

    Cool stuff!

  • Microsoft InfoPath 2010

    Inserting line breaks into text using Rules

    • 18 Comments

    Q: How do I insert line breaks into a multi-line text box using rules?

    First off, let’s introduce the concept of a multi-line text box properly. This functionality was added in InfoPath 2003 SP1. To enable it, insert a Text Box control, then on the Display tab, check “Paragraph breaks”. I usually also set the scrolling property to “Show scrollbars when necessary” and turn on “wrap text” which maps to the usual behavior for a multi-line text box. I also usually make the control bigger.

    Without the “Paragraph breaks” property set, line breaks (CR, LF or CRLF) in the XML data are treated as any other whitespace and show up in a text box as spaces. The Enter key is ignored, and breaks are stripped on paste. With this property set the breaks are preserved and show in the control, and can be typed and pasted.

    That’s good enough for round-tripping pre-existing breaks in the XML data and allowing user editing. And since you can party on the DOM as much as you want, inserting them via code is easy too – use whatever the escaping mechanism your language of choice provides – for example, in JScript you might use: oNode.text = "abc\r\ndef"

    How about rules? One of the rule actions available is to set a field’s value to the result of an expression. Behind the scenes, when the rule fires the expression is evaluated to return a string, and then the string is injected into the XML DOM as the node’s text. Specifying expressions like concat("abc", "&#xA;", "def") will result in a literal “&”, “#”, “x”, “A” and “;” appearing in the XML text. &-encoding is part of the file format, not of the DOM! The expression concat("abc", "\n", "def") and other variants don’t work either – there’s no escaping mechanism in the evaluation used here.

    So you need to figuratively copy/paste the line break from another source. Start off by literally doing a copy/paste of the following text into Notepad:

    <?xml version="1.0" encoding="UTF-8"?>
    <characters
        cr="&#xD;"
        lf="&#xA;"
        crlf="&#xD;&#xA;"
    />

    Save this as a file called “characters.xml”. Then in InfoPath go to Tools | Data Connections and click Add. Select Receive data, then XML Document. Browse to characters.xml then complete the wizard. When it asks “The selected file is not part of the form...add this file...?” click Yes. At this point we’ve just added a resource file to the template that gets loaded into a declaratively-accessible DOM - no code required.

    Almost there - now let’s use it!

    Add a Button control, open up the properties and click Rules. Add a Rule, and add an Action of the type “Set a field’s value”. For the field pick the text box’s field (e.g. field1). For the new value, use the formula builder and build the following expression:

    concat(field1, @crlf, "Hello, world!")

    The underlines indicate that this is a simplified version of the expression that conceals the full XPaths. Instead of typing it's easier to pick the fields using the “Insert Field or Group” button. Pick field1 from the main data source and pick @crlf from the “characters (Secondary)” data source (using the drop-down at the top of the dialog). Behind the scenes (as you can tell by clicking the “Edit XPath” button) this builds up the following expression:

    concat(my:field1, xdXDocument:GetDOM("characters")/characters/@crlf, "Hello, world!")

    Once you're done, click Preview, and try clicking the button a few times.

    As a final note, InfoPath is agnostic about the whole CR vs. LF vs. CRLF debate. Any of the three is equally treated as a line break.

     

  • Microsoft InfoPath 2010

    Move Up/Move Down

    • 4 Comments

    One stumbling block for developers coming up to speed on InfoPath is that the SDK documentation leads you to the edge of the XML cliff and then goes mysteriously quiet. For web developers who have programmed applications with the MSXML SDK for manipulating XML this isn’t a problem – they brought their parachute with them and happily jump off. For others, this can be a little intimidating.

    Here’s a good way to get started manipulating the XML DOM directly – let’s add “Move Up” / “Move Down” buttons to a Repeating Table so you can re-order the items.

    First off, let’s build the view:

    1. Fire up InfoPath 2003 and start a new blank form
    2. Insert a Repeating Table from the Controls task pane
    3. Delete the text box in the last column, and add two buttons in that cell instead
    4. Pull up the properties on first button and give it the label “5” and the ID “MoveUp”
    5. Pull up the properties on second button and give it the label “6” and the ID “MoveDown”

     At this point, you’re thinking “5 and 6???”

    1. Select both buttons (Click the first, and Ctrl+Click the second)
    2. On the Font drop-down on the toolbar, select Marlett. Then take a look at the buttons.

    (Sneaky, huh? Glyphs from this font are used by Windows to render all sorts of UI elements like the Minimize/Maximize Window buttons. This is a handy way to avoid having to use images for simple things like arrows.)

    Now that we have it looking pretty, let’s add the event handlers for the buttons. We’ll build on the logic from this blog entry to figure out which instance of the buttons was clicked.

    1. Pull up the properties on the first button and click Edit Code – paste the following into the editor:

    Sub MoveUp_OnClick(eventObj)

    ' Write your code here

     

       Dim oItem, oParent, oPrevious

      

       Set oItem     = eventObj.Source

       Set oParent   = oItem.parentNode

       Set oPrevious = oItem.previousSibling

      

       If Not ( oPrevious Is Nothing ) Then

             

              oParent.removeChild oItem

             

              oParent.insertBefore oItem, oPrevious

             

       End If

     

    End Sub

    The logic here is straightforward:

    • Grab the context node of the button (the row of the table, in our case)
    • If there is another item before the context node, remove the context node from the tree and re-insert it before the previous node
    1. Pull up the properties on the second button and click Edit Code – paste the following into the editor:

    Sub MoveDown_OnClick(eventObj)

    ' Write your code here

     

       Dim oItem, oParent, oNext

      

       Set oItem   = eventObj.Source

       Set oParent = oItem.parentNode

       Set oNext   = oItem.nextSibling

      

       If Not ( oNext Is Nothing ) Then

             

              oParent.removeChild oNext

             

              oParent.insertBefore oNext, oItem

             

       End If

     

     

    End Sub

    The logic here is similar:

    • Grab the context node of the button (the row of the table, in our case)
    • If there is another node after the context node, remove the it and re-insert it before the context node

    Almost done – let’s just use a little Conditional Formatting to disable the buttons when the item is the first or last in the list:

    1. Add a conditional for the first button which reads:

      if “The expression” “position() = 1” then Disable this control
       
    2. Add a conditional for the second button which reads:

      if “The expression” “position() = last()” then Disable this control

    Now try it out.

    As an aside, this was the author’s first foray into VBScript. Although I cut my teeth in Applesoft BASIC I’ve done most of my programming in C-style languages (C, C++, C#, Perl, Java). Did I do anything silly?

  • Microsoft InfoPath 2010

    InfoPath and SQL Service Broker

    • 0 Comments

    Rushi Desai, a developer on SQL Server Engine, has posted some blog entries on integrating InfoPath with SQL Server 2005:

    Integrating InfoPath with SQL Server 2005

    Download and try the InfoPathBroker sample

    The first one explains the architecture for interfacing InfoPath with the SQL Server 2005 Service Broker feature. The second has the samples and instructions on how to set up the environment.

    Check 'em out!

  • Microsoft InfoPath 2010

    Adding a Data Connection to Some WebServices Cause InfoPath 2003 to Disappear

    • 5 Comments

    When adding a web service data connection to an InfoPath 2003 form template, there is a bug that will cause InfoPath 2003 to disappear if the web service’s WSDL contains a particular recursive schema construct.  The following snippet of XSD illustrates the issue:

     

    <xs:element name="RecursiveRoot">

    <xs:complexType>

    <xs:sequence>

    <xs:element name="Branch1" minOccurs="0">

    <xs:complexType>

    <xs:sequence>

    <xs:element ref="ns:RecursiveRoot " maxOccurs="unbounded" />

    </xs:sequence>

    </xs:complexType>

    </xs:element>

    <xs:element name="Branch2" minOccurs="0">

    <xs:complexType>

    <xs:sequence>

    <xs:element ref="ns:RecursiveRoot" maxOccurs="unbounded" />

    </xs:sequence>

    </xs:complexType>

    </xs:element>

    </xs:sequence>

    </xs:complexType>

    </xs:element>

     

    This XSD contains a recursive structure in which there is more than 1 path of recursion and the recursive root is not marked as an optional element in the XSD when referenced.  InfoPath 2003 will work with the WSDL containing this XSD as expected if both references to RecursiveRoot were optional as illustrated in the following modified XSD (changes in red).

     

    <xs:element name="RecursiveRoot">

    <xs:complexType>

    <xs:sequence>

    <xs:element name="Branch1" minOccurs="0">

    <xs:complexType>

    <xs:sequence>

    <xs:element ref="ns:RecursiveRoot " maxOccurs="unbounded" minOccurs="0"/>

    </xs:sequence>

    </xs:complexType>

    </xs:element>

    <xs:element name="Branch2" minOccurs="0">

    <xs:complexType>

    <xs:sequence>

    <xs:element ref="ns:RecursiveRoot" maxOccurs="unbounded" minOccurs="0"/>

    </xs:sequence>

    </xs:complexType>

    </xs:element>

    </xs:sequence>

    </xs:complexType>

    </xs:element>

     

    If you are having issues with a web service that you own, one work around to this issue with InfoPath 2003 is to modify the WSDL for your web service as shown above.  In the case that this is not an acceptable work around, or you do not own the web service, the following steps will help you work around the problem:

     

    1.      Download the WSDL file for the web service to your local machine

     

    2.      Modify the XSD in the WSDL as shown above

     

    3.      Add a Data Connection to the local version of the WSDL file

     

    If you are setting up a submit or receive/submit web service connection then the following steps are required as well to ensure that the data InfoPath submits to the web service adheres to the original schema:

     

    4.      File --> Extract Form Files to save your form template in an uncompressed format

     

    5.      Remove the modifications made to the WSDL XSD in the copy of the XSD that was added to the form template

     

    If you modify the data connection or add another data connection to this local WSDL file for a submit web service then steps #4-#5 will have to applied again.  If you expect other users to modify the design of this form template then the local version of the WSDL should be stored in a shared location that all designers have access to.

     

    This issue has been reported to the InfoPath team as occurring in the ItemLookup method of the web services that Amazon exposes (http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl).  In the case of this method, the modification that is necessary to avoid the InfoPath 2003 bug (step #2) is the following:

     

    1.       Find the BrowseNode element that contains references to other BrowseNode elements

    2.       Add minOccurs=”0” to the BrowseNode references (these occur under the “Children” element and the “Ancestors” element)

     

    Since ItemLookup is a receive only method, there is no need to modify the form template files by hand (steps #4 and #5).

     

  • Microsoft InfoPath 2010

    Showing a Red Asterisk on a Rich Text Box

    • 1 Comments

    Q: How do I get the red asterisk to show on a Rich Text Box? There isn’t a checkbox for “Cannot be blank” on this type of control!

     

    A: Easy - add a declarative data validation rule for the condition where the field bound to the Rich Text Box “is blank”. To get started, display the control’s properties dialog box and then click Data Validation.

     

    So now you’re wondering – why isn’t there a simple checkbox for that?

     

    Behind the scenes, the “cannot be blank” checkbox actually maps to a change in the schema, rather than a declarative validation rule. For strings we add a length restriction, but for other types it sets nillable="true" (can be blank) or nillable="false" (cannot be blank).

     

    This explains why the checkbox is enabled when using a schema you’re creating in InfoPath and disabled when using a fixed schema from an external source. Since the schema we use for rich text (XHTML) nodes is a complex type the nillable approach doesn’t apply.

     

    So why does a declarative validation rule cause a red star to appear? When the form is running, the validation display semantics don’t distinguish between schema validation, declarative validation, and even code validation if you use an OnValidate event handler and/or add to the Errors collection. The logic for the validation display is:

     

                if( node fails validation )

                {

                            if( string value of node is blank )

                            {

                                        show red star

                            }

                            else

                            {

                                        show red border

                            }

                }

     

     

  • Microsoft InfoPath 2010

    Date Calculations in InfoPath

    • 8 Comments

    The SP1 update of InfoPath 2003 added calculation support – the value of a node can be set to the result of an XPath expression. This makes it possible to avoid writing code (script or managed) in many InfoPath forms. Date calculations, however, still require knuckling down and writing old fashioned procedural code.

     

    InfoPath stores dates according to the W3C XML Schema standard, which in turn uses a variant of ISO 8601 dates. The XPath expression language, however, has no special support for date types – just strings, numbers, Booleans, node-sets and fragments. This means that while you can manipulate dates as strings – you can’t do calculations with them.

     

    Before we dive into some sample code, though, a few notes:

     

    You can do date comparisons with XPath! The date format is “yyyy-mm-dd” – always 4-2-2 – which means you can do lexical (“string”) comparisons on two dates and determine ordering and equality.

     

    As a guiding rule, you should be as paranoid with date calculations as you are with financial calculations. Identify and test your edge cases thoroughly, and make sure your code matches cultural interpretations, not code convenience. For example, if you compare two dates the context and desired result matters. The relationship between a duration in days and an age in years is not simply 1/365 (or 1/365.25, or … ) – the convention for age in most cultures is “has the person had a birthday yet?” so you’d better make sure the code matches. Who wants to miss their birthday?

     

    A good rule of software development is that if you have to think too much about a problem you’re writing too much code, and the more code you write the more likely you are to have bugs. So the moral of this story is: make someone else do all the work.

     

    The general pattern for dealing with date calculations in InfoPath is to use an existing library. The two handy libraries for this are the Windows Scripting engine and the .NET Framework. Since we have a lot of script examples on this blog let’s use .NET this time.

     

    The .NET Framework has a DateTime struct type and if you look in MSDN you’ll find it has plenty of methods and operator overloads for doing calculations such as adding days and computing TimeSpans. Looks good – I bet the .NET people know what they’re doing.

     

    So basically we just want to convert an XML date into a DateTime, do some stuff with it, then convert back.

     

    Here are the functions you need:

     

           private static DateTime Iso8601ToDate( string iso8601Date )

           {

                  if( iso8601Date == null )

                         throw new ArgumentNullException( "iso8601Date" );

     

                  return DateTime.ParseExact( iso8601Date, "yyyy-MM-dd", null );

           }

     

           private static string DateToIso8601( DateTime dateTime )

           {

                  return dateTime.ToString( "yyyy-MM-dd" );

           }

     

    Wow – after that preamble I bet that was a bit of a let down!

     

    Now let’s use it. I built a simple calculation form that looks like this:

     

    Date Calculation Form Screenshot

     

    The button handlers look like this:

     

           [InfoPathEventHandler(MatchPath="date1_add1", EventType=InfoPathEventType.OnClick)]

           public void date1_add1_OnClick(DocActionEvent e)

           {

                  IXMLDOMNode dateNode = thisXDocument.DOM.selectSingleNode( "/my:myFields/my:Date1" );

     

                  try

                  {

                         DateTime dt = Iso8601ToDate( dateNode.text );

                         dt = dt.AddDays( 1 );

                         dateNode.text = DateToIso8601( dt );

                  }

                  catch( FormatException ) {}

           }

     

    Then I added OnAfterChange handlers for the date fields which call a sync method:

     

           [InfoPathEventHandler(MatchPath="/my:myFields/my:Date2", EventType=InfoPathEventType.OnAfterChange)]

           public void Date2_OnAfterChange(DataDOMEvent e)

           {

                  if (e.IsUndoRedo)

                         return;

     

                  SyncDifference();

           }

     

           private void SyncDifference()

           {

                  IXMLDOMNode date1Node = thisXDocument.DOM.selectSingleNode( "/my:myFields/my:Date1" );

                  IXMLDOMNode date2Node = thisXDocument.DOM.selectSingleNode( "/my:myFields/my:Date2" );

                  IXMLDOMNode diffNode  = thisXDocument.DOM.selectSingleNode( "/my:myFields/my:Difference" );

                  IXMLDOMNode ageNode   = thisXDocument.DOM.selectSingleNode( "/my:myFields/my:Age" );

     

                  if( date1Node != null && date2Node != null && diffNode != null )

                  {

                         try

                         {

                               DateTime dt1 = Iso8601ToDate( date1Node.text );

                               DateTime dt2 = Iso8601ToDate( date2Node.text );

     

                               TimeSpan ts = dt2 - dt1;

                               diffNode.text = ts.Days.ToString();

                         }

                         catch( FormatException ) {}

                  }

           }

     

    You might notice that this is computing the difference in days. The TimeSpan structure represents an interval of time, and days are the maximum granularity that a pure duration can have – month and year durations require a fixed point in time to calculate from;  even weeks can be ambiguous – is that whole weeks or calendar-weeks-spanned? And whose calendar in the first place?

     

    So how do you go from two DateTime structures to an age? The old fashioned way – “have I had a birthday yet this year?”

     

           int ageInYears = dt2.Year - dt1.Year;

           if( ( dt2.Month < dt1.Month ) ||

               ( dt2.Month == dt1.Month && dt2.Day < dt1.Day ) )

           {

                  ageInYears--;

           }

           ageNode.text = ageInYears.ToString();

     

    Time calculations are even more fun. No-one mention leap seconds and we’ll get by just fine.

     

    (Update 1/25/05 @ 11:30 AM PST - having a problem uploading the screenshot to our images site. We'll fix that ASAP.)

    (Update 1/25/05 @ 11:50 AM PST - Fixed!)

  • Microsoft InfoPath 2010

    Why doesn't InfoPath have a Password control?

    • 1 Comments

    Q: I want to create a control for entering passwords in an InfoPath form. How do I do this?

    A: InfoPath cannot guarantee the security and privacy of text entered into a password control, so it does not contain such a control.

    But Why?

    A typical password control contains features that make it hard for anyone but the user typing the password to discover what that text is. Password controls may also interact with a secure server so that the password is not sent in clear text, but is instead encrypted. Further, copying the text from a password control is not allowed.

    Because InfoPath allows files to be stored to a user’s local file system, InfoPath will the store the value typed into a field along with the XML. Additionally, InfoPath does not perform encryption of network traffic, meaning field values used as passwords will always be sent in clear text.

    But I still want a password control

    For the above reasons, we discourage using the contents of a field in an InfoPath form for entering and submitting passwords. Additionally, modifying the files used to create an InfoPath view to use the standard HTML password control (e.g. <INPUT type=”password” ID=”MyPassword”>), will not work in InfoPath. The nearest behavior that can be achieved is to format an InfoPath Text Box control to use a symbol font set, such as WebDings or WingDings so that the text being entered cannot easily be read as it is being typed.

  • Microsoft InfoPath 2010

    Thank you for attending the InfoPath Webcast series

    • 0 Comments

    Hi all,

     

    I want to thank all of you who attended one or more of the InfoPath WebCasts that have been presented over the past 2 months.  If you missed any of the presentations, don’t worry, all the WebCasts were recorded and are available on-demand.  Please visit http://msdn.microsoft.com/office/understanding/infopath/multimedia/default.aspx to view any of the InfoPath WebCasts on-demand.

     

    Also, remember that those of you who filled out a survey have been entered into a drawing for a copy of Halo 2.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/default.aspx.)

     

    Thank you again.  I hope you enjoyed the presentations.

     

    Scott Roberts

     

     

  • Microsoft InfoPath 2010

    Tomorrow's InfoPath Webcast: Database Connectivity in InfoPath Through ADO.NET DataSet Support

    • 0 Comments

    Hello everyone,

     

    I hope you will join us tomorrow December 14 from 11am – 12:30pm PST for our last presentation in the InfoPath WebCast series: “Database Connectivity in InfoPath Through ADO.NET DataSet Support” which will be presented by Hagen Green, a Software Test Engineer on the InfoPath team (with content from Mikhail Vassiliev a Software Design Engineer on the InfoPath team).  You can register for this talk by clicking on the following URL: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032259550&Culture=en-US.

     

    Also, remember that those of you who view the talk and fill out a survey will be entered into a drawing for a copy of Halo 2.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/default.aspx.)

     

    Here is more information about the talk:

     

    MSDN Webcast: Database Connectivity in InfoPath Through ADO.NET DataSet Support—Level 400    

     

    Start Time:  Tuesday, December 14, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada) 

    End Time:   Tuesday, December 14, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada) 

     

    Event Description 

    In this webcast session you will learn how to use Microsoft® Office InfoPath™ to design a form as a front-end to a Web Service that exposes ADO.Net DataSet structure. We will teach you the InfoPath Data Adapter architecture, new Data Adapters in InfoPath 2003 SP-1, and talk about reasons for using ADO.NET DataSets in a Web Service with InfoPath forms. See the advantages and the restrictions when using DataSets in InfoPath. You will also get an inside view of the InfoPath DataSet support implementation so you can see how this feature works in InfoPath

     

    Presenter: Hagen Green, Software Test Engineer, Microsoft Corp.

     

    Hagen Green is a Software Test Engineer for the Microsoft® Office InfoPath™ team. Hagen contributed to the InfoPath Designer platform, Web services, and ADO.NET support features.

     

    I hope you can make it.

     

    Scott Roberts

  • Microsoft InfoPath 2010

    Yesterday's InfoPath WebCast: Programming Workflow into InfoPath Solutions: Using InfoPath with BizTalk Server 2004 and Human Workflow Services

    • 3 Comments

    Hello everyone,

    I want to personally thank those of you who attended yesterday’s WebCast: Programming Workflow into InfoPath Solutions: Using InfoPath with BizTalk Server 2004 and Human Workflow Services which was presented by Rick Severson.  I hope you enjoyed the talk as much as I did and were able to learn something new.  Also, I hope you filled out a survey at the end of the talk so you are entered in the Halo 2 contest.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/halo/default.aspx.)

    If you were unable to attend the talk, don’t worry.  It was recorded and is available via the following URL: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032259548&Culture=en-US.   (You will have to register before you can view the recorded WebCast.)

    Please join us next Tuesday, December 14 from 11am – 12:30pm PST for the next presentation in the InfoPath WebCast series: “Database Connectivity in InfoPath Through ADO.NET DataSet Support” which will be presented by Mikhail Vassiliev, a Software Design Engineer on the InfoPath team.  You can register for this talk by clicking on the following URL: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032259550&Culture=en-US.  I hope you will join us.

    Here is more information about the talk:

    MSDN Webcast: Database Connectivity in InfoPath Through ADO.NET DataSet Support—Level 400    

    Start Time:       Tuesday, December 14, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada

    End Time:        Tuesday, December 14, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada

    Event Description 

    In this webcast session you will learn how to use Microsoft® Office InfoPath™ to design a form as a front-end to a Web Service that exposes ADO.Net DataSet structure. We will teach you the InfoPath Data Adapter architecture, new Data Adapters in InfoPath 2003 SP-1, and talk about reasons for using ADO.NET DataSets in a Web Service with InfoPath forms. See the advantages and the restrictions when using DataSets in InfoPath. You will also get an inside view of the InfoPath DataSet support implementation so you can see how this feature works in InfoPath.

    Presenter: Mikhail Vassiliev, Software Design Engineer,Microsoft Corp.

    Mikhail Vassiliev has been a member of the Microsoft® Office InfoPath™ Team from the beginning of the application development, joining Microsoft at 1998. He has been designing and implementing a wide range of the program components starting from the basic editing, data adapters, and finishing with SDK tools. Mikhail enjoys programming and continues to work on the new InfoPath features.

    Scott Roberts

  • Microsoft InfoPath 2010

    Monday's Webcast: Programming Workflow into InfoPath Solutions: Using InfoPath with BizTalk Server 2004 and Human Workflow Services

    • 2 Comments

    Hello everyone,

    I hope you will join us Monday December 6 from 11am – 12:30pm PST for the next presentation in the InfoPath WebCast series: “Programming Workflow into InfoPath Solutions: Using InfoPath with BizTalk Server 2004 and Human Workflow Services” which will be presented by Rick Severson, a Software Test Engineer on the InfoPath team.  You can register for this talk by clicking on the following URL: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032259548&Culture=en-US.

    Also, remember that those of you who view the talk and fill out a survey will be entered into a drawing for a copy of Halo2.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/default.aspx.)

    Here is more information about the talk:

    MSDN Webcast: Programming Workflow into InfoPath Solutions: Using InfoPath with BizTalk Server 2004 and Human Workflow Services—Level 400    

    Start Time:       Monday, December 06, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada

    End Time:        Monday, December 06, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada

    Event Description 

    Need to build customer-facing, complex workflow applications? Join this session as we drill-down into the best practices for integrating Microsoft® Office InfoPath™ with Microsoft® BizTalk® Server 2004. Learn how InfoPath 2003 SP1 works with BizTalk Server 2004 Human Workflow Services and see how to easily embed workflow directly into forms.  Also learn how the InfoPath workflow task pane automatically displays state, actions, and routing in the workflow process and how to program against these services.

    Presenter: Rick Severson, Software Test Engineer, Microsoft Corp.

    Rick Severson was the primary Software Test Engineer for Microsoft® Office InfoPath™ and the Integration of Human Workflow Services of Microsoft® BizTalk® Server 2004.

    - Scott 

     

  • Microsoft InfoPath 2010

    Yesterday's InfoPath WebCast: Creating Custom Controls for InfoPath SP-1

    • 0 Comments

    Hello everyone,

     

    I want to personally thank those of you who attended yesterday’s WebCast: Creating Custom Controls for InfoPath SP-1 which was presented by Andrew Ma.  I hope you enjoyed the talk as much as I did and were able to learn something new.  Also, I hope you filled out a survey at the end of the talk so you are entered in the Halo 2 contest.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/halo/default.aspx.)

     

    If you were unable to attend the talk, don’t worry.  It was recorded and is available via the following URL: http://msevents.microsoft.com/cui/eventdetail.aspx?EventID=1032259546&Culture=en-US.  (You will have to register before you can view the recorded WebCast.)

     

    Please join us next Monday, December 6 from 11am – 12:30pm PST for the next presentation in the InfoPath WebCast series: “Programming Workflow into InfoPath Solutions: Using InfoPath with BizTalk Server 2004 and Human Workflow Services” which will be presented by Rick Severson, a Software Test Engineer on the InfoPath team.  You can register for this talk by clicking on the following URL: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032259548&Culture=en-US. I hope you will join us.

     

    Here is more information about the talk:

     

    MSDN Webcast: Programming Workflow into InfoPath Solutions: Using InfoPath with BizTalk Server 2004 and Human Workflow Services—Level 400    

     

    Start Time:       Monday, December 06, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada) 

    End Time:        Monday, December 06, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada) 

     

    Event Description 

    Need to build customer-facing, complex workflow applications? Join this session as we drill-down into the best practices for integrating Microsoft® Office InfoPath™ with Microsoft® BizTalk® Server 2004. Learn how InfoPath 2003 SP1 works with BizTalk Server 2004 Human Workflow Services and see how to easily embed workflow directly into forms.  Also learn how the InfoPath workflow task pane automatically displays state, actions, and routing in the workflow process and how to program against these services.

     

    Presenter: Rick Severson, Software Test Engineer, Microsoft Corp.

     

    Rick Severson was the primary Software Test Engineer for Microsoft® Office InfoPath™ and the Integration of Human Workflow Services of Microsoft® BizTalk® Server 2004.

  • Microsoft InfoPath 2010

    Monday's Webcast: Creating Custom Controls for InfoPath SP-1

    • 0 Comments

    Hello everyone,

     

    I hope you will join us tomorrow November 29 from 11am – 12:30pm PST for the next presentation in the InfoPath WebCast series: “Creating Custom Controls for InfoPath SP-1” which will be presented by Andrew Ma, a Software Test Engineer on the InfoPath team.  You can register for this talk by clicking on the following URL: http://msevents.microsoft.com/cui/webcasteventdetails.aspx?eventid=1032259546&culture=en-us.

     

    Here is more information about the talk:

     

    MSDN Webcast: Creating Custom Controls for InfoPath SP-1—Level 400    

     

    Start Time:       Monday, November 29, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada) 

    End Time:        Monday, November 29, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada) 

     

    Event Description 

    Get up to speed quickly with Microsoft® Office InfoPath™. Join us in this webcast as we discuss the steps needed to write an ActiveX control which works in InfoPath as a custom control.

     

    Presenter: Andrew Ma, Software Test Engineer, Microsoft Corp.

     

    Andrew Ma is a Software Test Engineer in the Microsoft® Office InfoPath™ team where he has been working for two years. His SP1 responsibilities were primarily the ActiveX support for custom control creation.

     

    Thanks,

    Scott

  • Microsoft InfoPath 2010

    Last Monday's Webcast: Digital Signatures in InfoPath 2003

    • 1 Comments

    Hello everyone,

    I want to thank those of you who attended Monday’s WebCast: Digital Signatures in InfoPath 2003 which was presented by Mihaela Cristina Cris.  I hope you enjoyed the talk as much as I did and were able to learn something new.  Also, I hope you filled out a survey at the end of the talk so you are entered in the Halo 2 contest.  (Please visit the following URL for more information about the contest: http://msdn.microsoft.com/office/understanding/infopath/multimedia/default.aspx.)

    If you were unable to attend the talk, don’t worry.  It was recorded and is available via the following URL: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032259544&Culture=en-US. (You will have to register before you can view the recorded WebCast.)

    There will be no WebCast next week  but please join us in two weeks on Monday, November 29 from 11am – 12:30am PST for the next presentation in the InfoPath WebCast series: “Creating Custom Controls for InfoPath SP-1” which will be presented by Andrew Ma, a Software Test Engineer on the InfoPath team.  You can register for this talk by clicking on the following URL: http://msevents.microsoft.com/cui/webcasteventdetails.aspx?eventid=1032259546&culture=en-us. I hope you will join us.

    Here is more information about the talk:

    MSDN Webcast: Creating Custom Controls for InfoPath SP-1—Level 400    

    Start Time:       Monday, November 29, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada

    End Time:        Monday, November 29, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada

    Event Description 

    Get up to speed quickly with Microsoft® Office InfoPath™. Join us in this webcast as we discuss the steps needed to write an ActiveX control which works in InfoPath as a custom control.

    Presenter: Andrew Ma, Software Test Engineer, Microsoft Corp.

    Andrew Ma is a Software Test Engineer in the Microsoft® Office InfoPath™ team where he has been working for two years. His SP1 responsibilities were primarily the ActiveX support for custom control creation.

    Thanks,

    Scott

  • Microsoft InfoPath 2010

    Monday's InfoPath WebCast: Digital Signatures in InfoPath 2003

    • 0 Comments

    Hello everyone,

    I hope you will join us for the next presentation in the InfoPath WebCast series - Digital Signatures in InfoPath 2003. This talk will be presented by Mihaela Cristina Cris, a Software Test Engineer in the InfoPath group, Monday starting at 11am PST.  If you haven’t already, you can register here: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032259544&Culture=en-US.  

    Also, remember that those of you who view the talk and fill out a survey will be entered into a drawing for a copy of Halo2.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/default.aspx.)

    Here is more information about the talk:

    MSDN Webcast: Digital Signatures in InfoPath 2003—Level 300    

    Start Time:       Monday, November 15, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada

    End Time:        Monday, November 15, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada

    Event Description 

    Microsoft® Office InfoPath™ 2003 SP1 implements digital signatures to secure data in InfoPath forms and to ensure the integrity, authenticity and support for non-repudiation related to data in XML forms. InfoPath digital signatures target data in InfoPath XML form files and can then design and create digital signatures for the entire form or for parts of the form, following the W3C XML Digital Signatures Standard specifications. All these features will be explained in detail during this webcast presentation, along with the InfoPath Object Model for digital signatures. The last part of the presentation will show users how to build a sample form that enables digital signatures and displays existing signatures in a dedicated task pane.

    Presenter: Mihaela Cristina Cris, Software Test Engineer, Microsoft Corp.

    Mihaela Cristina Cris is a Software Test Engineer in the Microsoft® Office InfoPath™ group working with digital signatures in both RTM and SP1 versions of the product.

    Thanks,

    Scott Roberts

  • Microsoft InfoPath 2010

    Yesterday's WebCast

    • 0 Comments

    Hello everyone,

    I want to personally thank those of you who attended yesterday’s WebCast: InfoPath in End-to-End Enterprise Solutions: Integrating InfoPath with Siebel and SAP which was presented by Hagen Green.  I hope you enjoyed the talk as much as I did and were able to learn something new.  Also, I hope you filled out a survey at the end of the talk so you are entered in the Halo 2 contest.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/halo/default.aspx.)

    If you were unable to attend the talk, don’t worry.  It was recorded and is available via the following URL: http://msevents.microsoft.com/cui/eventdetail.aspx?EventID=1032259542&Culture=en-US.  (You will have to register before you can view the recorded WebCast.)

    Please join us next Monday, November 15 from 11am – 12:30am PST for the next presentation in the InfoPath WebCast series: “Digital Signatures in InfoPath 2003” which will be presented by Mihaela Cristina Cris, a Software Test Engineer on the InfoPath team.  You can register for this talk by clicking on the following URL: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032259544&Culture=en-US. I hope you will join us.

    Here is more information about the talk:

    MSDN Webcast: Digital Signatures in InfoPath 2003—Level 300    

    Start Time:       Monday, November 15, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada

    End Time:        Monday, November 15, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada

    Event Description 

    Microsoft® Office InfoPath™ 2003 SP1 implements digital signatures to secure data in InfoPath forms and to ensure the integrity, authenticity and support for non-repudiation related to data in XML forms. InfoPath digital signatures target data in InfoPath XML form files and can then design and create digital signatures for the entire form or for parts of the form, following the W3C XML Digital Signatures Standard specifications. All these features will be explained in detail during this webcast presentation, along with the InfoPath Object Model for digital signatures. The last part of the presentation will show users how to build a sample form that enables digital signatures and displays existing signatures in a dedicated task pane.

    Presenter: Mihaela Cristina Cris, Software Test Engineer, Microsoft Corp.

    Mihaela Cristina Cris is a Software Test Engineer in the Microsoft® Office InfoPath™ group working with digital signatures in both RTM and SP1 versions of the product.

    Thanks,

    Scott

  • Microsoft InfoPath 2010

    MSDN Webcast: InfoPath in End-to-End Enterprise Solutions

    • 0 Comments

    Hello everyone,

    I hope you will join us for the next presentation in the InfoPath WebCast series - InfoPath in End-to-End Enterprise Solutions: Integrating InfoPath with Siebel and SAP. This talk will be presented by Hagen Green, a tester in the InfoPath group, Monday starting at 11am PST.  If you haven’t already, you can register here: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032259542&Culture=en-US.

    Also, remember that those of you who view the talk and fill out a survey will be entered into a drawing for a copy of Halo2.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/halo/default.aspx.)

    Here is more information about the talk:

    MSDN Webcast: InfoPath in End-to-End Enterprise Solutions: Integrating InfoPath with Siebel and SAP—Level 300    

    Start Time:       Monday, November 08, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada) 
    End Time:        Monday, November 08, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada) 

    Event Description 
    Integrate CRM software, such as SAP and Siebel, with Microsoft® Office InfoPath™.  In this presentation you will learn how to leverage the flexibility of XML Web services to create a seamless data flow between disparate systems. InfoPath provides for a rich data entry and viewing point while isolating the exposure of sensitive back-end data.

    Presenter: Hagen Green, Software Test Engineer, Microsoft Corp.

    Hagen Green is a Software Test Engineer for the Microsoft® Office InfoPath™ team. Hagen contributed to the InfoPath Designer platform, Web services, and ADO.NET support features.

    Thanks,
    Scott

     

     

  • Microsoft InfoPath 2010

    Yesterday’s WebCast

    • 0 Comments

    Hello everyone,

    I want to personally thank those of you who attended yesterday’s WebCast: Using Managed Code and Visual Studio to Build Solutions which was presented by Willson Raj David.  I hope you enjoyed the talk as much as I did and were able to learn something new.  Also, I hope you filled out a survey at the end of the talk so you are entered in the Halo 2 contest.  (Please visit the following URL to view the contest rules: http://msdn.microsoft.com/office/understanding/infopath/multimedia/halo/default.aspx.)

    If you were unable to attend the talk, don’t worry.  It was recorded and is available via the following URL: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032259540&CountryCode=US. (You will have to register before you can view the recorded WebCast.)

    Please join us next Monday, November 8 from 11am – 12:30am PST for the next presentation in the InfoPath WebCast series: “InfoPath in End-to-End Enterprise Solutions: Integrating InfoPath with Siebel and SAP” which will be presented by Hagen Green.  You can register for this talk by clicking on the following URL: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032259542&Culture=en-US. I hope you will join us.

    Here is more information about the talk:

    MSDN Webcast: InfoPath in End-to-End Enterprise Solutions: Integrating InfoPath with Siebel and SAP—Level 300    

    Start Time:       Monday, November 08, 2004 11:00 AM (GMT-08:00) Pacific Time (US & Canada) 
    End Time:        Monday, November 08, 2004 12:30 PM (GMT-08:00) Pacific Time (US & Canada) 

    Event Description 
    Integrate CRM software, such as SAP and Siebel, with Microsoft® Office InfoPath™.  In this presentation you will learn how to leverage the flexibility of XML Web services to create a seamless data flow between disparate systems. InfoPath provides for a rich data entry and viewing point while isolating the exposure of sensitive back-end data.

    Presenter: Hagen Green, Software Test Engineer, Microsoft Corp.

    Hagen Green is a Software Test Engineer for the Microsoft® Office InfoPath™ team. Hagen contributed to the InfoPath Designer platform, Web services, and ADO.NET support features.

    Thanks,
    Scott

Page 9 of 12 (298 items) «7891011»