Strukturell redigering i eksempelskjemaet Structural Editing
Strukturell redigering i et Microsoft Office InfoPath 2003-skjema skjer når en bruker fyller ut et skjema og redigeringshandlingene som utføres, resulterer i en strukturell endring av skjemaets underliggende XML-dokument. Strukturelle endringer omfatter innsetting eller fjerning av elementer og attributter i det underliggende XML-dokumentet som skjemaet er bundet til. I eksempelskjemaet Structural Editing gjøres for eksempel strukturelle endringer når en bruker setter inn eller fjerner elementer fra Parts-tabellen (Deler) eller den punktmerkede notatlisten.
Kontroller for strukturell redigering inneholder forhåndsdefinerte redigeringshandlinger som kan knyttes til verktøylinjeknapper og menyelementer i brukergrensesnittområder i InfoPath. I Commands-dialogboksen (Kommandoer), som er tilgjengelig fra dialogboksen Properties (Egenskaper) for en kontroll for strukturell redigering, kan du velge hvilke redigeringshandlinger som skal være tilgjengelig for brukerne, hvilke områder i brukergrensesnittet de skal vises i, og hvilke etiketter som skal brukes for de tilknyttede knappene eller menyelementene. Kontrollene for strukturell redigering som brukes i dette eksempelskjemaet, omfatter en gjentakende tabell og en punktmerket liste.
Strukturell redigering kan implementeres ved hjelp av en InfoPath-kontroll for strukturell redigering eller ved å bruke skriptkode for å behandle dataene i skjemaets underliggende XML-dokument direkte. Hvis skjemaet omfatter en kontroll, for eksempel en gjentakende inndeling som er bundet til de endrede (innsatte eller slettede) dataene, vil dataene i skjemaet oppdateres automatisk.
Bruke kontroller for strukturell redigering
Når du drar en kontroll for strukturell redigering til et skjema i utformingsmodus og deretter binder kontrollen til et felt eller en gruppe, oppretter InfoPath en oppføring i skjemadefinisjonsfilen (.xsf) som angir redigeringskomponenten, XML-feltet eller -gruppen som redigeringskomponenten er bundet til, og XML-fragmentet som skal brukes ved innsetting av nye elementer i den tilknyttede tabellen, inndelingen eller listen.
Redigeringskomponenter er InfoPaths implementering av noen av kontrollene som brukes i et skjema, og de angis i component-attributtet for editWith-elementet i .xsf-filen. InfoPath bruker redigeringskomponentene xField, xTextList, xCollection, xOptional, xReplace og xImage.
I eksemplet fra eksempelskjemaet Structural Editing nedenfor inneholder editing-elementet i .xsf-filen informasjon om Parts-tabellen. Parts-tabellen implementeres som en gjentakende tabellkontroll som i .xsf-filen tilsvarer redigeringskomponenten xCollection. Redigeringskomponenten xCollection er oppført i component-attributtet for editWith-elementet. editWith-elementet inneholder et underordnet element med navnet fragmentToInsert, som igjen inneholder et underordnet element med navnet chooseFragment. chooseFragment-elementet inneholder XML-fragmentet som vil bli satt inn i kilde-XML-dokumentet når en bruker velger å legge til et element i Parts-tabellen.
<xsf:editing>
<xsf:xmlToEdit name="1"
item="/invoice/list/item"
container="/invoice">
<xsf:editWith caption="item" component="xCollection"
xd:autogeneration="template">
<xsf:fragmentToInsert>
<xsf:chooseFragment parent="list">
<item>
<partNumber></partNumber>
<partDescription></partDescription>
<unitPrice></unitPrice>
<quantity></quantity>
<discount>0</discount>
<netDiscount>0</netDiscount>
<total>0</total>
</item>
</xsf:chooseFragment>
</xsf:fragmentToInsert>
</xsf:editWith>
</xsf:xmlToEdit>
...
</xsf:editing>
Bruke skript for strukturell redigering
Skriptredigering i et InfoPath-skjema skjer når en bruker fyller ut et skjema og redigeringshandlingene som kan utføres, bestemmes av egendefinert skriptkode som er skrevet av skjemautviklere ved hjelp av Microsoft Script Editor (MSE). Hvis for eksempel brukeren merker et element i den egendefinerte oppgaveruten Part Catalog (Delekatalog) i eksempelskjemaet Structural Editing og klikker knappen Add To Invoice (Legg til faktura), blir det lagt til en ny rad med deledata i Parts-tabellen gjennom et kall til den egendefinerte funksjonen InsertPartFromCatalog.
Obs! InfoPath støtter skriving av skript i Microsoft VBScript og Microsoft JScript. Du kan imidlertid ikke bruke begge skriptspråkene i samme skjema.
Den egendefinerte funksjonen InsertPartFromCatalog i skriptfilen script.js (se nedenfor) for eksempelskjemaet Structural Editing inneholder skriptkoden som brukes til å sette inn det merkede elementet i skjemaets kilde-XML-dokument. Funksjonen henter først XML DOMen som tilsvarer skjemadefinisjonsfilen (.xsf), ved hjelp av DOM-egenskapen for Solution-objektet, som er tilgjengelig via XDocument-objektet. Deretter brukes XML DOM-standardmetoden selectSingleNode til å hente XML-fragmentet som skal settes inn. Så endres de aktuelle feltene i fragmentet slik at de tilsvarer de merkede elementene i den egendefinerte oppgaveruten. Til slutt settes fragmentet inn i kilde-XML-dokumentet ved hjelp av DOM-egenskapen for XDocument-objektet og XML DOM-standardmetodene selectSingleNode og appendChild.
function InsertPartFromCatalog
(strPartNumber, strPartDescription, intUnitPrice)
{
var objFragmentToInsert = null;
// Get the XML fragment to insert from the manifest.xsf.
objFragmentToInsert = XDocument.Solution.DOM
.documentElement.selectSingleNode
("//xsf:view[@name='View']//xsf:xmlToEdit[@item='/invoice/list/item']" +
"/xsf:editWith[@component='xCollection']/xsf:fragmentToInsert/
xsf:chooseFragment[@parent='list']/*[1]");
// Make a copy of the fragment and update the fields with the
// values from the catalog. Any changes to the fragment are
// made before inserting it into the document so that the
// insertion can be undone with a single Undo.
objFragmentToInsert = objFragmentToInsert.cloneNode(true);
objFragmentToInsert.selectSingleNode("partNumber").text = strPartNumber;
objFragmentToInsert.selectSingleNode("partDescription").text = strPartDescription;
objFragmentToInsert.selectSingleNode("unitPrice").text = intUnitPrice;
// Insert the XML fragment into the document.
XDocument.DOM.selectSingleNode("/invoice/list")
.appendChild(objFragmentToInsert);
}
Som vist i eksemplet nedenfor, kalles den egendefinerte funksjonen InsertPartFromCatalog fra den egendefinerte oppgaveruten Part Catalog ved hjelp av den egendefinerte funksjonen AddPartToInvoice som er implementert i koden for den egendefinerte oppgaveruten. Denne funksjonen bruker Extension-egenskapen for XDocument-objektet til å få tilgang til de egendefinerte funksjonene i skriptfilen script.js og kaller funksjonen InsertPartFromCatalog når en bruker klikker knappen Add To Invoice.
function AddPartToInvoice(objPart)
{
// Call the insertPartFromCatalog function in the business logic, passing
// the details for the part.
window.external.Window.XDocument.Extension.InsertPartFromCatalog
(objPart.PartNumber, objPart.PartDescription, objPart.UnitCost);
}