Using a Template Part
Once you have a template part—whether you created it yourself as we just did or you are reusing one created by somebody else—you can add it to your Controls task pane so that you can use it just like any of the built-in InfoPath controls. Let's look at how you can install template parts so they can be inserted into your form templates.
Adding a Template Part to the Controls Task Pane
Reusing the address block template part in your own form template is easy. First you must create a new form template or open an existing one in design mode. Then open the Controls task pane. At the bottom of the task pane is a link titled Add or Remove Custom Controls. Clicking on this link opens the Add or Remove Custom Controls dialog (Figure 10.6). From this dialog, you can add or manage all your custom controls, whether they are template parts or ActiveX controls. If you've never added a custom control before, this dialog will be empty. However, once you add a control or two, each control name will appear in the Custom controls list box. (Figure 10.6 shows the Add or Remove Custom Controls dialog after adding the AddressBlock template part.)
Figure 10.6 Add or Remove Custom Controls dialog
In order to add a custom control, just click on the Add button, which will start the Add Custom Control Wizard. When you first start the wizard, the Select a Control Type page appears (Figure 10.7), from which you choose the type of control you want to insert into the Controls task pane.
Figure 10.7 Add Custom Control Wizard's Select a Control Type page
As we've mentioned, InfoPath supports two types of custom controls—template parts and ActiveX controls. Since we are going to add a template part (and this option is the default), click the Next button, which will open the Select an InfoPath Template Part page (Figure 10.8). From this page you can select which template part you want to install. Clicking on the Browse button will open the typical Browse dialog that we all know and love. Select a template part from your local machine, a shared location, a SharePoint site, or any Web site you choose. As we mentioned, template part files have an extension of .xtp, so this dialog will show only those types of files by default.
Figure 10.8 Add Custom Control Wizard's Select an InfoPath Template Part page
Once you choose the template part you want, click the Open button in the Browse dialog, and then click the Finish button after the dialog is closed. The Custom Control Added wizard page appears (Figure 10.9). As you can see, template parts have an icon and a version number associated with them. InfoPath automatically sets the version number and increments it each time you save the template part. We'll show you a little later in this chapter how to change the icon for the template part.
Figure 10.9 Add Custom Control Wizard's Custom Control Added page
Once you click the Close button on the Custom Control Added page of the wizard, the name of the template part is added to the list of custom controls in the Add or Remove Custom Controls dialog, as we shown earlier in Figure 10.6. Once you close this dialog, the template part is added to the Custom category of the Controls task pane (Figure 10.10). Once the template part appears in the Controls task pane, you can insert it into your form template just like any of the built-in controls supplied by InfoPath.
Figure 10.10 Custom category of the Controls task pane after adding the AddressBlock template part
Inserting a Template Part into a Form Template
Once you install a template part by using the Add Custom Control Wizard, you can use it in any form template you create. Let's take a look at what happens when you insert a template part into a form template. As we mentioned, once the template part is in your Controls task pane, you can use it just like any of the other built-in controls—you can click on it in the task pane to insert it into the view, drag it into the view, or open the Data Source task pane and bind it to any field or group just as you can with the built-in InfoPath controls. If you insert your template part into a form template that has the Automatically create data source option set in the Controls task pane and you've created a blank template part (not one based on an XML file or schema), the data structure specified by the template part will be inserted into the form template. (We'll talk more about this shortly.)
If, instead, you open the Data Source pane to bind your template part to existing data in a form template, the data structure you can bind the template part to will depend on how the template part is defined. For example, look at the data structure for the AddressBlock template part in Figure 10.2 again. This template part is associated with a group node that has five fields below it. Therefore, you can bind the AddressBlock template part only to a group node that has at least five field nodes as children. If there are more than five child nodes, the first five nodes are used and the remaining nodes are ignored.
However, those first five nodes must match the data structure defined by the template part. Also, the data types of the nodes must be compatible with the data types to which you are trying to bind the template part (e.g., string and whole number data types are compatible but whole number and XHTML are not). Also, all template parts include at least one top-level group node. Therefore, in order to bind a template part to data in a form template, the data structure you are binding to must start with a group node. (Note, however, that it's not necessary for the field names in the form template to match the names of the fields in the template part itself.)
If you right-click on a group node in the Data Source task pane that fits the requirements just mentioned, the AddressBlock template part will be available. If you click on a group node that has only four children, for example, then the AddressBlock template part will not be available. (Note that template parts have a lower priority than the built-in control types. Therefore, to bind a template part to a node in the Data Source task pane, you may have to click on the More menu item on the context menu when you right-click on a node in the Data Source task pane. You will find template parts in the Select a Control dialog, which is opened from this menu item.)
Now, let's insert our AddressBlock template part into a new form template and see what's happening behind the scenes. Figure 10.11 shows this template part after inserting it into a blank form. As you can see, it looks a little different than the address block shown in Figure 10.1. In this case, the entire address block is inside a Section control. Since template parts are custom components, they are always contained within a Section control. This helps InfoPath treat the template part as a component, which is necessary for such things as updating existing parts. (You'll see why this is needed later in this chapter.)
Figure 10.11 AddressBlock template part inserted into a blank form
Once the template part is in the view, the contents of the template part (e.g., controls, calculated default values, data validation, and so on) all become part of the form template you are designing. In other words, once inserted into the form template, the template part is no longer a component treated as one atomic unit. You are free to move controls around in the view (or delete them); change rules, data validation, and calculated default values; change the data structure; and so on.
However, since the template part is no longer an atomic unit, you cannot delete everything added to the form template when you inserted the template part with one simple delete operation. (Undo won't help in this regard, either.) If you want to remove everything you added, you have to delete every item individually—the controls (which can all be deleted by deleting the template part Section control as long as you haven't moved any controls outside of it), the data structure, and so on.
As you can see, template parts provide you with an easy way to share and reuse aspects of your form, but they are not atomic controls such as a Text Box or Date Picker. In fact, template parts are more like the compound built-in controls such as the Master/Detail or Horizontal Repeating Table.
When you insert a template part into the view from the Controls task pane, how the data binding for the template part is handled depends on how it was originally created. If it was created as a blank template part, when you insert it into a form template, InfoPath treats it like one of the built-in controls. If your form template into which you have inserted a template part was created based on a blank form template or your form template is based on an open schema, not only are the controls inserted into the view, but the underlying data structure is created as well. If you designed your template part based on an existing XML file or schema, when you insert the template part into a form template, you will be asked to choose the group node to which the template part should be bound. (Of course, in either case, if you insert a template part into a form template that is based on a fixed schema, you will always be asked to choose the group node to which the template part should be bound. You must bind the template part to a group node since the component is always wrapped in a Section control, as mentioned earlier.)
Since our AddressBlock template part was created from scratch, when you insert it into a form template that allows editing of the data source, a group node containing five field nodes will be inserted into the main data source. As with other controls, where in the data source this group node is inserted depends on the current data source context in the view when you insert the control. For example, if the insertion point is inside a Repeating Section control in the view when you insert the AddressBlock, the group node for this template part will be inserted as a child of the repeating group node to which the Repeating Section is bound.
In addition to creating the data structure, when a template part is inserted, any calculated default values, rules, data validation, or data connections associated with the component are incorporated into the form template as well. When you insert a template part into a blank form template, this just means that these items are added to the new form template. However, if you are inserting a template part into an existing form template, you should be careful. Be particularly careful if you are binding it to a node that has calculated default values or data validation associated with it already or if your template part has rules and/or data connections associated with it and you have previously inserted it into the same form template.
When you insert a template part, if you are binding it to an existing node that has calculated default values or data validation, the existing values and data validation will be replaced. If the values and data validation were created when you previously inserted this template part and you haven't made any changes, this shouldn't cause a problem. If you have made changes, though, you will lose those changes when you insert the template part. (This is a good reason to make regular backups of your form templates.) You will be warned about the fact that you might lose some of your changes ahead of time and will be given the option to cancel. However, the warning helps only if you know ahead of time that you have made changes to these items in the form template, which you may not know if you're maintaining an existing form template, for example. You can use the Logic Inspector as explained in Chapter 5 to determine whether there are calculated default values and data validation associated with a node.
If your template part has rules and data connections associated with it and you have previously inserted this template part into the form template, when you insert it again, those rules and data connections will also be replaced. However, in this case, only those rules and data connections associated with this particular template part will be replaced. Those from other template parts will not be affected. The main point here is to be careful and to know what calculated default values, rules, data validation, and data connections exist in your form template. Also, if you are modifying an existing form template, it's always a good idea to make a backup copy before you make any changes.