Feltredigering i eksempelskjemaet Structural Editing
Feltredigering i et Microsoft Office InfoPath 2003-skjema skjer når en bruker skriver inn data direkte i et skjemafelt (vanligvis en tekstbokskontroll) når skjemaet fylles ut. Dataene lagres som en verdi av elementet eller attributtet for XML-feltet (element eller attributt) i det underliggende XML-dokumentet som kontrollen er bundet til. I eksempelskjemaet Structural Editing brukes for eksempel tekstbokser til redigering av data i feltene Part Number (Delenummer), Description (Beskrivelse), Quantity (Antall) og Unit Price (Enhetspris).
Feltredigering skjer vanligvis når en bruker skriver inn data i en kontroll i et skjema. Dataene lagres i skjemaets underliggende XML-dokument. Du kan imidlertid også bruke skriptkode til å behandle dataene i XML-dokumentet ved å endre selve XML-dokumentet. Hvis skjemaet inneholder en kontroll, for eksempel en tekstboks som er bundet til de endrede dataene, vil dataene som vises i skjemaet, bli oppdatert automatisk.
Bruke kontroller for feltredigering
Når du arbeider med et skjema i utformingsmodus, kan du dra kontroller fra Controls-oppgaveruten (Kontroller) til skjemaet slik at brukerne kan skrive inn data. Disse kontrollene er bundet til skjemaets XML-datakilde. Noen kontroller brukes til feltredigering, for eksempel tekstbokser, uttrykksbokser, rik tekst-bokser og lister, mens andre brukes til strukturell redigering, for eksempel valgfrie inndelinger, gjentakende inndelinger, gjentakende tabeller og lister.
Når du har plassert en kontroll i et skjema, kan du bruke kontrollens Properties-dialogboks (Egenskaper), som du får frem ved å høyreklikke kontrollen i utformingsmodus, til å angi ulike egenskaper for kontrollen, inkludert standardverdi, datavalidering, betinget formatering, plassholdertekst og andre data- og visningsalternativer.
Når du drar en feltredigeringskontroll til et skjema og deretter binder kontrollen til et felt, oppretter InfoPath vanligvis en oppføring i skjemadefinisjonsfilen (.xsf) som angir redigeringskomponent, XML-feltene som redigeringskomponenten er bundet til, og andre egenskaper for kontrollen, for eksempel stavekontroll og autofullføring.
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 Unit Price-feltet. Dette feltet implementeres som en tekstboks som i .xsf-filen tilsvarer redigeringskomponenten xField. Redigeringskomponenten xField er oppført i component-attributtet for editWith-elementet. Feltet som redigeringskomponenten er bundet til, er angitt i item-attributtet for xmlToEdit-elementet.
<xsf:editing>
...
<xsf:xmlToEdit
name="14"
item="/invoice/list/item/unitPrice">
<xsf:editWith
component="xField"
proofing="no"
autoComplete="no">
</xsf:editWith>
</xsf:xmlToEdit>
...
</xsf:editing>
Bruke skript for feltredigering
Skriptredigering i et InfoPath-skjema skjer når en bruker fyller ut et skjema. Hvilke typer redigeringshandlinger som kan utføres, bestemmes av egendefinert skriptkode skrevet av skjemautviklere ved hjelp av Microsoft Script Editor (MSE). Hvis for eksempel en rad i Parts-tabellen (Deler) i eksempelskjemaet Structural Editing er merket og brukeren klikker et element på Apply Discount-menyen (Bruk rabatt) på den egendefinerte verktøylinjen Part Toolbar (deleverktøylinje), oppdateres feltene Discount (Rabatt) og Total i Parts-tabellen.
Obs! InfoPath støtter skriving av skript i Microsoft VBScript og Microsoft JScript. Du kan imidlertid ikke bruke begge skriptspråkene i samme skjema.
Når en bruker velger en rabatt som skal brukes i en rad i Parts-tabellen, kalles OnClick-hendelsen for den valgte rabattknappen, som igjen kaller den egendefinerte funksjonen ApplyDiscount. ApplyDiscount-funksjonen bruker GetSelectedNodes-metoden for View-objektet, som er tilgjengelig via XDocument-objektet, til å returnere en samling av XML-noder som tilsvarer de merkede feltene, inndelingene eller radene i skjemaet. Hvis rader i Parts-tabellen er merket, bruker funksjonen en for-løkke som gjentas gjennom samlingen, til å kalle den egendefinerte funksjonen ApplyDiscountToItem for å oppdatere Discount-feltet i hver rad.
Obs! InfoPath støtter ikke opprettelse av OnClick-knappehendelser for egendefinerte knapper i utformingsmodus. Hvis du vil opprette hendelsesbehandling for egendefinerte knapper, må du skrive inn hendelsesbehandlingen OnClick manuelt i skjemaets skriptfil.
Hvis ingen rader er merket, bruker den egendefinerte funksjonen ApplyDiscount GetContextNodes-metoden for View-objektet til å returnere en samling av XML-noder som er basert på brukerens gjeldende kontekst (utvalg eller innsettingspunkt). Hvis gjeldende utvalg er innenfor en av radene, brukes den egendefinerte funksjonen ApplyDiscountToItem til å oppdatere Discount-feltet i den raden. Hvis gjeldende utvalg ikke er innenfor en av radene, kaller ApplyDiscount-funksjonen den egendefinerte funksjonen Prompt for å spørre brukeren om rabatten skal brukes i alle radene i Parts-tabellen. Dette er koden som brukes for den egendefinerte funksjonen ApplyDiscount i skriptfilen logic.js for eksempelskjemaet Structural Editing:
function ApplyDiscount(intPercentage)
{
var objSelectedItems = null;
var objContextNodes = null;
var blnAppliedDiscount = false;
// Get the XML node selection corresponding to the current HTML selection.
objSelectedItems = XDocument.View.GetSelectedNodes();
// Apply the discount to the selected items.
if (objSelectedItems.Count > 0)
{
// Apply discount to each of the selected items.
for (var i = 0; i < objSelectedItems.Count; i++)
{
if (objSelectedItems.Item(i).nodeName == "item")
{
ApplyDiscountToItem(objSelectedItems.Item(i), intPercentage);
blnAppliedDiscount = true;
}
}
}
// If there is no selection or the selection was not on an item node,
// keep looking for something to do.
if (!blnAppliedDiscount)
{
// Get a collection of all of the XML nodes that are bound to a control
// on the view, starting at the node which currently has focus.
objContextNodes = XDocument.View.GetContextNodes();
// Scan the list of context nodes for an item node and if one is found
// apply the discount to it.
for (var i = 0; i < objContextNodes.Count; i++)
{
if (objContextNodes.item(i).nodeName == "item")
{
ApplyDiscountToItem(objContextNodes.item(i), intPercentage);
blnAppliedDiscount = true;
break;
}
}
// If there weren't any context nodes found (i.e. nothing is selected)
// or there were no item nodes (i.e. focus is not within the part list)
// give the user the option of applying the discount to every item.
if (objContextNodes.Count == 0 || blnAppliedDiscount==false)
{
if (Prompt("There are no items selected. Do you want to apply the
discount to each item?", "Structural Editing Developer Sample Form", "YN"))
{
var objItemNodes = XDocument.DOM.selectNodes("//item");
// Apply discount to each of the items.
for (var i = 0; i < objItemNodes.length; i++)
{
ApplyDiscountToItem(objItemNodes.item(i), intPercentage);
}
}
}
}
}
Den egendefinerte funksjonen ApplyDiscountToItem bruker standard selectSingleNode-metode for XML DOMen (Document Object Model) til å angi text-egenskapen for det angitte XML-nodeargumentet og setter discountApplied-attributtet for noden til True.
function ApplyDiscountToItem(objItemNode, intPercentage)
{
var objDiscountNode = null;
// Set discount value to specified percentage.
objDiscountNode = objItemNode.selectSingleNode("discount");
objDiscountNode.text = intPercentage;
// Mark the node as having the discount applied to it or not.
objItemNode.setAttribute("discountApplied",
intPercentage>0 ? "true" : "false");
}
Når Discount-feltet er oppdatert, inntreffer OnAfterChange-hendelsen, og totalsummene for Parts-tabellen beregnes av den egendefinerte funksjonen Calculate. Hvis du vil se koden for funksjonen Calculate, åpner du først eksempelskjemaet Structural Editing i utformingsmodus og deretter Microsoft Script Editor.