Översikt över hur du verifierar användarindata

När användarna anger data i ditt program kan du 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 att en sträng inte innehåller ogiltiga tecken. Windows Forms tillhandahåller flera sätt för dig att verifiera indata i ditt program.

MaskedTextBox-kontroll

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 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.

Händelsedriven validering

Om du vill ha fullständig programmatisk kontroll över valideringen eller behöver 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 aktiveras när kontrollen kräver dataverifiering. I händelsehanterarkoden Validating 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 göra valideringen på följande sätt:

  • Om postnumret måste tillhöra en specifik grupp med postnummer kan du göra en strängjämförelse på indata för att verifiera de data som angetts av användaren. 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äret A#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 Exempel på reguljära .NET-uttryck och reguljära uttryck.

  • 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 avbryter Validating du händelsen genom att ange objektets Cancel egenskap till true. Om du inte anger egenskapen förutsätter Windows Forms att verifieringen Cancel lyckades för den Validated kontrollen och genererar händelsen.

Ett kodexempel som verifierar en e-postadress i en TextBoxfinns i händelsereferensen Validating .

Databundna kontroller för händelsedriven validering

Validering är 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 händelsen Validating synkroniseras inte data med datakällan.

Viktigt!

Om du har en anpassad validering som äger rum efter Validating händelsen 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 verifieringen Validated i händelsen ändrar du kontrollens Binding.DataSourceUpdateMode egenskap från DataSourceUpdateMode.OnValidation till DataSourceUpdateMode.Neveroch lägger till your-control.DataBindings["field-name"].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. Verifiera data genom att läsa av tangenterna när de nedtrycks, eller oftare när användaren flyttar fokuset bort från kontrollenheten. Den här metoden är användbar när du vill ge användaren direkt feedback om data medan de arbetar.

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 du har tilldelat till AutoValidate. Om du har tilldelat EnablePreventFocusChange, avbryter du händelsen förhindrar Validated från att inträffa. Indatafokus ligger kvar på den aktuella kontrollen tills användaren ändrar data till ett giltigt format. Om du har tilldelat EnableAllowFocusChangeValidated inträffar inte händelsen 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. Använd explicit verifiering för att verifiera dina kontroller.

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 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 datan den innehåller är ogiltig, så är det omöjligt att stänga det överordnade formuläret på ett av de vanliga sätten:

  • Genom att klicka på knappen Stäng.
  • Genom att välja menyn Systemstängning>.
  • 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.

Anmärkning

Om du tvingar formuläret att stängas på det här sättet går data som inte sparats förlorade. Dessutom validerar inte modala formulär innehållet i kontroller 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