Verifiering av användarindata i Windows-formulär
När användarna anger data i ditt program kanske du vill kontrollera att data är giltiga innan programmet använder dem. Du kan kräva att vissa textfält inte är nolllängds, att ett fält formateras som ett telefonnummer eller annan typ av välformulerade data eller att en sträng inte innehåller några osäkra tecken som kan användas för att äventyra säkerheten för en databas. Windows Forms tillhandahåller flera sätt för dig att verifiera indata i ditt program.
Validering med MaskedTextBox-kontrollen
Om du behöver kräva att användarna anger data i ett väldefinierat format, till exempel ett telefonnummer eller ett artikelnummer, kan du göra detta snabbt och med minimal kod med hjälp av MaskedTextBox kontroll. En mask är en sträng som består av tecken från ett maskeringsspråk som anger vilka tecken som kan anges vid en viss position i textrutan. Kontrollen visar en uppsättning uppmaningar till användaren. Om användaren skriver en felaktig post, till exempel om användaren skriver en bokstav när en siffra krävs, avvisar kontrollen automatiskt indata.
Maskeringsspråket som används av MaskedTextBox är mycket flexibelt. Du kan ange obligatoriska tecken, valfria tecken, literaltecken, till exempel bindestreck och parenteser, valutatecken och datumavgränsare. Kontrollen fungerar också bra när den är bunden till en datakälla. Den Format händelsen på en databindning kan användas för att formatera om inkommande data för att följa masken, och den Parse händelsen kan användas för att formatera om utgående data för att uppfylla specifikationerna för datafältet.
Mer information finns i MaskedTextBox Control.
Event-Driven validering
Om du vill ha fullständig programmatisk kontroll över valideringen eller behöver utföra komplexa valideringskontroller bör du använda de valideringshändelser som är inbyggda i de flesta Windows Forms-kontroller. Varje kontroll som accepterar användarindata i fritt format har en Validating händelse som inträffar när kontrollen kräver dataverifiering. I Validating händelsehanteringsmetod kan du verifiera användarindata på flera sätt. Om du till exempel har en textruta som måste innehålla ett postnummer kan du utföra valideringen på följande sätt:
Om postnumret måste tillhöra en specifik grupp med postnummer kan du utföra en strängjämförelse på indata för att verifiera de data som användaren anger. Om postnumret till exempel måste finnas i uppsättningen {10001, 10002, 10003}, kan du använda en strängjämförelse för att verifiera data.
Om postnumret måste vara i ett visst formulär kan du använda reguljära uttryck för att verifiera de data som användaren anger. Om du till exempel vill verifiera formuläret
#####
eller#####-####
kan du använda det reguljära uttrycket^(\d{5})(-\d{4})?$
. Om du vill verifiera formuläretA#A #A#
kan du använda det reguljära uttrycket[A-Z]\d[A-Z] \d[A-Z]\d
. Mer information om reguljära uttryck finns i .NET Framework Regular Expressions and Regular Expression Examples.Om postnumret måste vara ett giltigt postnummer i USA kan du anropa en postnummerwebbtjänst för att verifiera de data som användaren har angett.
Till händelsen Validating tillhandahålls ett objekt av typen CancelEventArgs. Om du anser att kontrollens data inte är giltiga kan du avbryta händelsen Validating genom att ange objektets egenskap Cancel till true
. Om du inte anger egenskapen Cancel förutsätter Windows Forms att verifieringen lyckades för kontrollen och genererar händelsen Validated.
Ett kodexempel som verifierar en e-postadress i en TextBoxfinns i Validating.
Databindning och Event-Driven validering
Validering är mycket användbart när du har bundit kontrollerna till en datakälla, till exempel en databastabell. Genom att använda validering kan du se till att kontrollens data uppfyller det format som krävs av datakällan och att de inte innehåller några specialtecken, till exempel citattecken och snedstreck som kan vara osäkra.
När du använder databindning synkroniseras data i kontrollen med datakällan under körningen av händelsen Validating. Om du avbryter Validating-händelsen synkroniseras inte data med datakällan.
Viktig
Om du har en anpassad validering som äger rum efter händelsen Validating påverkas inte databindningen. Om du till exempel har kod i en Validated händelse som försöker avbryta databindningen, kommer databindningen fortfarande att ske. Om du i det här fallet vill utföra validering i händelsen Validated ändrar du kontrollens uppdateringsläge för datakälla (under (Databindings)\(Avancerat)) från OnValidation till Aldrigoch lägger till Control.DataBindings["
<YOURFIELD->"].WriteValue()
i verifieringskoden.
Implicit och explicit validering
Så när verifieras en kontrolls data? Det är upp till dig, utvecklaren. Du kan använda antingen implicit eller explicit validering, beroende på programmets behov.
Implicit validering
Den implicita valideringsmetoden validerar data när användaren anger dem. Du kan verifiera data när data anges i en kontroll genom att läsa nycklarna när de trycks in, eller oftare när användaren tar indatafokuset från en kontroll och går vidare till nästa. Den här metoden är användbar när du vill ge användaren omedelbar feedback om data när de fungerar.
Om du vill använda implicit validering för en kontroll måste du ange den kontrollens AutoValidate egenskap till EnablePreventFocusChange eller EnableAllowFocusChange. Om du avbryter händelsen Validating bestäms kontrollens beteende av vilket värde som du har tilldelat AutoValidate. Om du har tilldelat EnablePreventFocusChange, kommer inte Validated-händelsen att inträffa om den andra händelsen avbryts. Indatafokus ligger kvar på den aktuella kontroll tills användaren ändrar input till en giltig inmatning. Om du har tilldelat EnableAllowFocusChangeinträffar inte händelsen Validated när du avbryter händelsen, men fokus ändras fortfarande till nästa kontroll.
Att tilldela Disable till egenskapen AutoValidate förhindrar implicit validering helt och hållet. För att verifiera dina kontroller måste du använda explicit validering.
Explicit validering
Den explicita valideringsmetoden validerar data i taget. Du kan verifiera data som svar på en användaråtgärd, till exempel genom att klicka på knappen Spara eller en Nästa-länk. När användaråtgärden inträffar kan du utlösa explicit validering på något av följande sätt:
Anropa Validate för att verifiera att den senaste kontrollen har förlorat fokus.
Anropa ValidateChildren för att verifiera alla underordnade kontroller i ett formulär eller en containerkontroll.
Anropa en anpassad metod för att verifiera data i kontrollerna manuellt.
Standardbeteende för implicit validering för Windows Forms-kontroller
Olika Windows Forms-kontroller har olika standardvärden för sin AutoValidate egenskap. I följande tabell visas de vanligaste kontrollerna och deras standardvärden.
Kontroll | Standardverifieringsbeteende |
---|---|
ContainerControl | Inherit |
Form | EnableAllowFocusChange |
PropertyGrid | Egenskapen exponeras inte i Visual Studio |
ToolStripContainer | Egenskapen exponeras inte i Visual Studio |
SplitContainer | Inherit |
UserControl | EnableAllowFocusChange |
Stänga formuläret och åsidosätta verifieringen
När en kontroll bibehåller fokus eftersom de data som den innehåller är ogiltiga är det omöjligt att stänga det överordnade formuläret på något av de vanliga sätten:
Genom att klicka på knappen Stäng.
Genom att välja Stäng på menyn System.
Genom att anropa Close-metoden programmatiskt.
Men i vissa fall kanske du vill låta användaren stänga formuläret oavsett om värdena i kontrollerna är giltiga. Du kan åsidosätta verifieringen och stänga ett formulär som fortfarande innehåller ogiltiga data genom att skapa en hanterare för formulärets FormClosing händelse. I händelsen anger du egenskapen Cancel till false
. Detta tvingar formuläret att stängas. Mer information och ett exempel finns i Form.FormClosing.
Not
Om du tvingar formuläret att stängas på det här sättet går alla data i formulärets kontroller som inte redan har sparats förlorade. Dessutom validerar modalformulär inte innehållet i kontrollerna när de stängs. Du kan fortfarande använda kontrollverifiering för att låsa fokus till en kontroll, men du behöver inte bry dig om det beteende som är associerat med att stänga formuläret.
Se även
.NET Desktop feedback