Word Content Controls
Word Content Controls zijn op zichzelf staande controls die je naar eigen inzicht kunt aanpassen om te gebruiken in je templates en documenten. Een van de mogelijkheden is om op deze manier formulieren te maken met een verbeterde look-and-feel. De gebruiker kan door deze werkwijze worden geholpen bij het invullen van dit formulier.
Als voorbeeld zou je een listbox aan je document kunnen toevoegen met een beperkt aantal keuzemogelijkheden waaruit de gebruiker zijn keuze moet maken. Ook kan tekst worden toegevoegd aan de control om de gebruiker instructies te geven bij het invullen en de control te laten verdwijnen zodra er iets is ingevuld.
Middels het standaard Object Model van Word 2007 is kan er worden gecommuniceerd met de Content Controls en kun je de programmatuur laten reageren op events die door Word worden getriggered.
Om functies en mogelijkheden uit te breiden is er door de VSTO ontwikkelaars naast het standaard Object Model van Word een aantal uitbreidingen aangebracht om het leven van de Office ontwikkelaar nog een stukje makkelijker te maken. Door middel van de Document Designer in Visual Studio kan op visuele wijze het document worden samengesteld.
De Content Controls
In Word 2007 is er een achttal Word Content Controls beschikbaar die kunnen worden teruggevonden op de Developer Tab van de Ribbon in Word. Standaard wordt deze Developer Tab echter niet getoond. Om deze toch te tonen kies je Word Options onder het Office menu (de grote ronde knop) en zet een check in de checkbox bij “Show Developer Tab in the Ribbon”.
Elk van de Content Controls heeft zijn eigen specifieke eigenschappen die de control kenmerken. Zo kan de Rich Text control tekst bevatten in meerdere stijlen, en kan het zelfs andere Content Controls bevatten, een mogelijkheid die ook de Building Block Gallery en de Group Content Control kennen. Alle andere controls kunnen maar één stijl en geen andere Content Controls bevatten.
Het volgende overzicht geeft inzicht in de verschillende soorten controls die er zijn. Tussen haakjes staat achter de naam van de Control de ID van de Control zoals je die kunt terugvinden in de Object Browser van Word.
Rich Text (wdContentControlRichText)
De Rich Text Content Control kan tekst in meerdere stijlen en andere controls bevatten. De formattering in Rich Text is bij de meeste mensen wel bekend door het gebruik van Word en Outlook. Er zijn weinig grenzen binnen dit type en de mogelijkheden zijn talrijk.

Fig. 1: Rich Text Content Control
Text (wdContentControlText)
De Text Content Control kan de tekst slechts in één stijl en één font opslaan. Het is binnen deze Content Control niet mogelijk om te wisselen van stijl en/of font type. Als dat een vereiste is zal gekozen moeten worden voor de Rich Text Content Control.

Fig. 2: Plain Text Content Control
Picture Content Control (wdContentControlPicture)
De Picture Content Control is de control om een plaatje weer te geven, een beperkte Control speciaal bestemd voor dit doel.

Fig. 3: Picture Content Control
Combo Box (wdContentControlComboBox)
De Combo Box Control bevat een Combo Box met een aantal listitems om uit te kunnen kiezen. In de Combo Box Control kan handmatig een tekst worden getypt in het invulveld van het uitklapgedeelte. Als je wilt dat er alleen kan worden gekozen uit een vaste lijst, dan is daarvoor de Drop-Down List Content Control bedacht die je hierna zult zien.

Fig. 4: Combo Box Content Control
Drop-Down List (wdContentControlDropdownList)
De Drop-Down List bevat een Drop-Down List met een aantal items om uit te kunnen kiezen. Deze Content Control biedt in tegenstelling tot de Combo Box Control niet de mogelijkheid tot het invoeren van vrije tekst als keuze, maar moet er een keuze uit de gedefinieerde lijst worden gemaakt.

Fig. 5: Drop-Down List Content Control
Buiding Block Gallery (wdContentControlBuildingBlockGallery)
De Building Block Gallery is een speciaal soort control die het mogelijk maakt om de gebruiker te laten kiezen uit vooraf geprepareerde Building Blocks. Building Blocks zijn kant en klare tekst fragmenten of onderdelen van een document inclusief layout en stijlen die in zijn geheel (Quick Part, Autotext, e.d.) kunnen worden ingevoegd door te kiezen uit een Building Blocks gallery. De mogelijkheden en het gebruik van Building Blocks is zeer uitgebreid en het voert te ver om in dit artikel alle mogelijkheden te bespreken.

Fig. 6: Date Picker Content Control
Date Picker (wdContentControlDate)
De Date Picker maakt het de gebruiker makkelijker om een datum in te voeren. Met deze control kan een kleine kalender worden getoond waarmee de gebruiker door de kalender bladerend de gewenste datum kan selecteren. Wat ook belangrijk is bij deze Content Control is de formattering van de datum. Er kan worden aangegeven wat de ‘locale’ is en welke volgorde van jaar-, maand- en dagvelden is gewenst.

Fig. 7: Date Picker Content Control
Group (wdContentControlGroup)
De Group Content Control is een speciaal soort control waarmee een aantal Content Controls kunnen worden gebundeld tot één enkele control. Op die manier ontstaat er een bundeling van controls die nu als één control worden beschouwd.

Fig. 8: Group Content Control
Door op de Developer Tab de Content Controls te tonen in Designer Mode wordt in het document de structuur zichtbaar van de gebruikte controls en zijn extra labels zichtbaar zoals bijvoorbeeld de “Group” labels.
Tot zover de beschrijving van de verschillende Content Controls die de ontwikkelaar ter beschikking staan. Elk van de bovengenoemde Content Controls heeft zijn specifieke kenmerken. Het is raadzaam deze uitgebreid te bekijken.
Events
Zoals gebruikelijk is bij Microsoft software zijn er Content Controls Events gedefinieerd. Dit houdt in dat als er iets (een event) gebeurt met een Content Control of iets dat gerelateerd is aan een Content Control, er dan een signaal wordt gegeven over hetgeen heeft plaatsgevonden.
Een eenvoudig voorbeeld is het event waarbij een signaal wordt gegeven in het geval een Content Control wordt binnengegaan (ContentControlOnEnter) of wanneer een Content Control weer wordt verlaten (ContentControlOnExit).
Zoals gebruikelijk is bij Microsoft software zijn er Content Controls Events gedefinieerd
Door gebruik te maken van deze events kan op uitstekende wijze worden gemonitord wat er met de gebruikte Content Controls wordt gedaan en kan worden aangegeven of er andere opvolgende acties benodigd zijn voor verdere afhandeling van het document. Een goed voorbeeld is een Content Control dat deel uitmaakt van een adresblok. Op het moment dat zo’n control wordt binnengegaan kan de ontwikkelaar een TaskPane activeren aan de rechter zijde van het document om daar vervolgens een voor het invullen van dit adres een hulpmiddel te plaatsen die bij het intikken van de postcode meteen de bijbehorende plaatsnaam opzoekt. Bij het verlaten van het veld dat onderdeel uitmaakt van het adres kan de TaskPane weer worden gesloten.
Een kort overzicht van beschikbare events op de Content Controls:
- ContentControlAfterAdd: vindt plaats na het invoegen van een Content Control;
- ContentControlBeforeContentUpdate: vindt plaats voor het bijwerken van een Content Control maar alleen wanneer de inhoud van de control afkomstig is van de Office XML data store;
- ContentControlBeforeDelete: vindt plaats op het moment dat een Content Control wordt verwijderd en dit event treedt op vlak voor de verwijdering;
- ContentControlBeforeStoreUpdate: vindt plaats op het moment dat XML datastore van het document wordt bijgewerkt;
- ContentControlOnEnter: vindt plaats wanneer een Content Control wordt binnengegaan;
- ContentControlOnExit: vindt plaats wanneer een Content Control wordt verlaten;
- BuildingBlockInsert: dit event wijkt iets af van alle andere events en wordt geactiveerd na het invoegen van een Building Block.
Deze events zijn de standaard events zoals deze beschikbaar zijn op het document. In Visual Studio krijg je echter een aantal extra events tot je beschikking wanneer je in de Document Designer een Content Control toevoegt en daar de Properties bekijkt:

Fig. 9: VSTO Events
Deze events komen in grote lijnen overeen met de events die op het document zijn gedefinieerd, maar kunnen nu op eenvoudige wijze worden afgehandeld per Content Control, dit in tegenstelling tot de events die op document niveau zijn gedefinieerd. Bij de op document niveau gedefinieerde events moet eerst worden uitgezocht op welk Content Control het event van toepassing is, terwijl bij de VSTO events deze per control kunnen worden uitgewerkt.
Data Binding
Interessant wordt het pas wanneer blijkt dat de Content Controls kunnen worden gebonden aan objecten zoals Document Properties of zelfs databasevelden. Dit maakt het mogelijk om het document te vullen met informatie uit het bedrijfssysteem. Het binden aan databases kan worden gedaan in een ‘read only’ modus maar ook in een tweeweg-binding waarbij wijzigingen kunnen worden teruggezonden naar de database. Bij deze laatste mogelijkheid krijgt de ontwikkelaar van de documenten de mogelijkheid om geavanceerde formulieren te bouwen die gebruik maken van een achterliggende database.
Praktijkvoorbeeld
Tot zover de theorie. In het volgende voorbeeld wil ik laten zien op welke wijze het mogelijk is om een Word document te koppelen aan een database en vervolgens de gegevens uit deze database op te nemen in dit document. Uiteraard betreft het hier nog een redelijk eenvoudige opzet, maar het maakt duidelijk wat de kracht is van het systeem en dat dit verder kan worden uitgewerkt tot een complete bedrijfstoepassing.
Allereerst maken we in Visual Studio 2008 een nieuw project aan door in het menu te kiezen voor File, New, Project. In dit geval kiezen we ervoor om het project te ontwikkelen in Visual Basic en kiezen daarom onder het kopje “Visual Basic, Office, Version2007” voor het project type “Word 2007 Document” en bevestigen twee keer via OK het aanmaken van het nieuwe project en het bijbehorende document. Het aangemaakte document verschijnt vervolgens in de Document Designer mode binnen Visual Studio als eerste geopende item.
Vervolgens voegen we NORTHWIND.MDB toe aan het project, de door Microsoft ontwikkelde database die vaak als demo database wordt gebruikt, en selecteren de Employee tabel voor opname in de dataset. We doen dit om later in het project de werknemergegevens te kunnen tonen in het Word document.

Fig. 10: Database Objects
Na accepteren van de dialoogopties verschijnt in Visual Studio naast de Document Designer in de Data Sources dialoog een overzicht van de gekozen DataSet met de daarin gekozen “Employees” tabel. Door nu op een van de velden uit de View te klikken verschijnt er een Drop-Down List met daarin ten opzichte van voorgaande versies van Visual Studio een aantal nieuwe opties.
Het is in deze versie mogelijk om bij de velden het type te geven van een van de Word Content Controls. In het voorbeeld van het “Title” veld kan gekozen worden uit de Content Controls PlainTextContentControl, RichTextContentControl, ComboBoxContentControl, DatePickerContentControl en BuildingBlockGalleryContentControl. In ons geval is het voldoende om de velden op het document te plaatsen als PlainTextControl. Dit houdt in dat er slechts één stijl en één font beschikbaar is. We houden dus de standaard door het systeem gekozen typen aan.

Fig. 11: Content Controls en Data Source
Na het aanmaken van een tabel voegen we door te slepen alle velden toe in een rij van een door ons vooraf aangemaakte tabel en verfraaien de tekst hier en daar om het er allemaal wat fraaier uit te laten zien.
Dit gedaan hebbende is het tijd om te kijken of hetgeen we tot nu toe hebben gebouwd ook daadwerkelijk functioneert. We bouwen het project door op F5 te drukken en vervolgens zal het document dat we net hebben gemodelleerd worden geopend in Word. Tevens zullen daarbij de gegevens van de eerste werknemer worden opgehaald en getoond op de eerste pagina van het Word document.

Fig. 12: Resultaat Output
Op zich nog niet zo heel spannend, maar we willen natuurlijk ook kijken of we door de data van de database heen kunnen manouvreren en zelfs de data kunnen aanpassen en opslaan in de database.
Allereerst voegen we daarvoor aan ons project een Ribbon toe door rechts te klikken op de projectnaam en te kiezen voor “Add, New Item”. Onder de Office sectie kiezen we voor “Ribbon (Visual Designer)”. Een nieuwe Ribbon zal nu in de designer worden geopend zodat we nu een tweetal Buttons kunnen toevoegen aan de Group die standaard al voor ons is aangemaakt.
Dubbelklik nu op de eerste button en voeg de code toe om terug te gaan naar het voorgaande record in de database:
Globals.ThisDocument.EmployeesBindingSource.MovePrevious()
Dubbeklik op de tweede button en voeg ook daar extra code toe, deze keer om verder te gaan naar het volgende record in de database:
Globals.ThisDocument.EmployeesBindingSource.MoveNext()
Opnieuw starten we het project op door op F5 te drukken. Als alles goed is gegaan zien we nu achteraan op de Ribbon een extra Tab verschijnen die “Add-Ins” heet met daarop de zojuist aangemaakte buttons. Druk nu een aantal keer op de knoppen. Het document zal afhankelijk van de gekozen knop de volgende of het vorige record ophalen uit de database en in het document tonen.
Wat nu als we een gegeven wijzigen en daarna van de pagina af gaan. Probeer dit eens door de functie van de medewerker te selecteren en daar deze tekst te wijzigen in iets anders. Vervolgens druk je eenmaal op volgende en eenmaal op vorige record om weer terug te keren op het gewijzigde record. Je zult zien dat de wijziging **niet** is opgeslagen. We moeten iets extra’s doen om de gegevens ook daadwerkelijk vast te houden.
We maken om dit mogelijk te maken een extra button aan op de Ribbon en voegen de volgende code toe:
Globals.ThisDocument.PlainTextContentControl11.
DataBindings("Text").WriteValue()
Globals.ThisDocument.EmployeesBindingSource.EndEdit()
Globals.ThisDocument.EmployeesTableAdapter.
Update(Globals.ThisDocument.NorthwindDataSet.Employees)
MsgBox("Functie bijgewerkt")
PlainTextContentControl11 in de code is de Content Control voor de achternaam van de medewerker.
Als we nu opnieuw het project laten draaien en op een van de medewerkers de functie wijzigen om daarna van record te wisselen, dan zul je zien dat de gegevens daadwerkelijk worden vastgehouden.
Conclusie
In dit artikel is getoond wat de Word Content Controls zijn en welke events op deze controls beschikbaar zijn, en bovendien dat het mogelijk is om een koppeling te leggen naar een achterliggende database en zelfs wijzigingen vast te leggen. Met deze informatie moet men zelfstandig grotere projecten kunnen uitvoeren.
Word Content Controls zijn flexibele en stabiele elementen in de Word 2007 omgeving die het mogelijk maken om documenten zeer intuïtief te laten werken en gebruikers te ondersteunen bij het aanmaken van documenten. De Content Controls waren oorspronkelijk bedoeld om de wat instabielere Bookmarks te vervangen, maar zijn vele malen krachtiger en beter inzetbaar.
Door de laatste toevoegingen van VSTO in Visual Studio 2008 is het vooral eenvoudiger geworden om krachtige OBA’s (Office Business Applications) te ontwerpen en ontwikkelen. Ontsluiten van uw bedrijfsinformatie naar de eindgebruiker behoort hierbij zeker tot één van de mogelijkheden om de productiviteit binnen het bedrijf te verhogen.