Public Overrides Sub PopulateListOrComboContent( _
ByVal ControlID As Integer, _
ByVal ApplicationName As String, _
ByVal LocaleID As Integer, _
ByVal Text As String, _
ByVal Xml As String, _
ByVal Target As Object, _
ByVal Props As Microsoft.Office.Interop.SmartTag. _
ISmartDocProperties,
ByRef List() As String, _
ByRef Count As Integer, _
ByRef InitialSelected As Integer)
regionNode = DocumentUtils.GetData( _
DocumentUtils.DataTableType.region)
regions = New Hashtable
regionList = New ArrayList
ControlID = DocumentUtils.GetRealControlID( _
ControlID)
Select Case ControlID
Case 1
Dim regionNodes As XmlNodeList = _
regionNode.SelectNodes("//region")
Dim regionEnum As IEnumerator = _
regionNodes.GetEnumerator
Dim intCount As Integer = regionNodes.Count
ReDim Preserve List(intCount - 1)
Dim iterator As Integer = 0
While regionEnum.MoveNext
Dim node As XmlNode = _
CType(regionEnum.Current, XmlNode)
regions.Add(node.Attributes("ID").Value,
node.Attributes("Description").Value)
regionList.Add(node.Attributes("ID").Value)
List.SetValue(CType(node.Attributes( _
"Description").Value, String), iterator)
iterator = iterator + 1
End While
Count = intCount - 1
InitialSelected = 1
intSelectedValue = InitialSelected
End Select
End Sub
In the preceding method note these critical items.
- List()This is a ByRef array parameter that the API uses to populate the combo or list display values. You can use the List.SetValue method to set the value at the proper index as shown above.
- CountByRef parameter where you can set the number of items being returned.
- InitialSelectedSet this ByRef parameter to the index value of the item you want to be the default selection in the combo box. The sample code uses 1.
The code uses an ArrayList (
regionList) to maintain the ID values because of a constraint in the way this COM-based combo box works. COM-based combo boxes don't have the concepts of
DisplayMember and
ValueMember; therefore you have to maintain an ArrayList of primary keys and match them with the appropriate selected value. When a user selects an item, the following
OnListOrComboSelectChange method shown below passes a
Selected parameter that provides the selected item's index, while the
Value parameter provides the corresponding display value.
Public Overrides Sub OnListOrComboSelectChange( _
ByVal ControlID As Integer, _
ByVal Target As Object, _
ByVal Selected As Integer, _
ByVal Value As String)
intSelectedValue = Selected
End Sub
The region XMLType has an
Invoke method called when a user clicks the Apply button. Note the way it fetches the context of the "region" node and later adds its attribute items "id," and "tax."
Dim rangeNode As Word.XMLNode = CType(Target, _
Word.Range).XMLNodes(1)
Dim idAttr As Word.XMLNode = _
rangeNode.Attributes.Add("id", _
Constants.DOCUMENT_NAMESPACE)
idAttr.NodeValue = CType(regionList.Item( _
intSelectedValue - 1), String)
Dim taxAttr As Word.XMLNode = _
rangeNode.Attributes.Add("tax", _
Constants.DOCUMENT_NAMESPACE)
taxAttr.NodeValue = regionNode.SelectSingleNode( _
"//region[@ID='" + regionList.Item( _
intSelectedValue - 1) + "']/@Tax").InnerText
rangeNode.Text = regions.Item( _
regionList.Item(intSelectedValue - 1))
After adding these attributes your document becomes valid against the schema. You set the attributes and value for the
itemname node and populate the
total price and other nodes in a similar way. I suggest you take a step-by-step debug mode walkthrough approach until you're sure everything works.