Virheentarkistukset ja yksinkertaiset komponentit - Pääteohjaus 2
Tehdään lomakkeelle virheentarkistus sekä luodaan ensimmäinen oma yksinkertainen komponentti.
Tehtävien tekeminen edellyttää, että on katsonut seuraavat luennot:
Virheentarkistukset
Luodaan uusi yksinkertainen tekstikenttäkomponentti, joka osaa tarkistaa siihen syötetyn luvun kelvollisuuden
- Luo Visual Studiolla uusi projekti ja Solution mutta älä valitse tyypiksi Windows Forms vaan Windows Forms Control Library. Jos sinulla on uusin versio visual studiosta niin Windows Forms Control Library on piilotettu Classic Desktop-valinnan alle. Vanhemmissa versioissa se löytyy Windows Forms -valikon kautta. Keksi kuvaava nimi esim. PositiveTextBox
- Nimeä Solution Explorerista usercontrol1.cs samalle nimelle kuin projektisi eli esim. PositiveTextBox. Anna Visual Studion uudelleennimetä kaikki muukin tarpeellinen.
- Peri komponenttisi TextBox-luokasta äläkä valmiina tarjotusta UserControl-luokasta
- Yritä kääntää komponenttisi (F6). Saat läjän virheilmoituksia. Poista rivit, jotka aiheuttavat virheen. Käännä uudelleen. Huom. Älä yritä suorittaa komponenttia, koska se ei ole mahdollista. Ainoastaan käännä.
- Lisää solutioniin uusi projekti, jonka tyyppi on nyt Windows Forms Application. Anna nimeksi vaikkapa Testipenkki.
- Lisää testipenkin lomakkeelle uusi komponenttisi, jonka pitäisi löytyä Toolboxista jos vain sait komponentin käännettyä. Jos komponentti ei ilmesty toolboxiin niin varmista, että komponenttisi on käännetty. Jos vieläkään ei näy niin tarkista, että seuraa asetus on True: Tools|Options|Windows Forms Designer|General|Toolbox|AutoToolboxPopulate
- Yritä suorittaa testipenkki. Jos sait virheilmoituksen niin varmista, että testipenkki on oletuksena käännettävä projekti (Set as Startup Project)
- Määrittele komponentissasi Validating-tapahtuma, joka suoritetaan aina, kun tekstikentän tekstikentästä yritetään poistua. Tapahtuma löytyy ihan normaalisti komponenttisi tapahtumalistauksesta vaikka komponentin design-näkymä näyttääkin vain harmaata ruutua. Lisää metodiin tarkistus, joka tutkii onko kenttään syötetty positiivinen numero. Jos luku ei ole positiivinen niin aseta e.Cancel = true, joka tarkoittaa, että syöte ei ollut kelvollinen.
- Lisää komponenttiisi ErrorProvider. Aseta ErrorProviderilla komponenttisi viereen virheikoni ja virheteksti aina jos syötetty luku on epäkelpo (Validating-tapahtumassa).
- Lisää testipenkkiisi myös painike tai joku muu kontrolli niin voit testata tekstikentästäsi poistumista ja ErrorProvideria, kun aktivoit lomakkeelta jonkun muun kontrollin.
- Lisää komponenttiisi Validated-tapahtuma, joka tapahtuu aina, kun kentän syöte on kelvollinen. Poista Validated-tapahtumassa ErrorProvider näkyvistä asettamalla virheteksti tyhjäksi.
- Kokeile nyt häviääkö ja ilmestyykö virheikoni aina tarpeen mukaan.
- Testaa mitä vaikuttaa virhetarkistuksien toimintaan, kun muutat lomakkeen AutoValidate-ominaisuuden arvoja. Eri vaihtoehtojen merkitys on selitetty luentomateriaalissa.
- Lisää lomakkeellesi useampi PositiveTextBox-kenttä. Muuta virheentarkistus toimimaan siten, että kaikkien kenttien virheet (ValidateChildren) tarkistetaan vasta, kun lomaketta yritetään sulkea. kts. Form.FormClosing-tapahtuma
- Lisää lomakkeelle myös OK-painike jolla lomakkeen voi sulkea jos kentissä ei ole virheellisiä syötteitä. Huomioi myös lomakkeen sulkeminen ruksista!
- Jos haluat, että lomakkeen voi sulkea vaikka kentissä olisi virheitä niin lisää lomakkeen FormClosing-tapahtumaan
rivi:
e.Cancel = false;
Tapahtumat
Katso luento, esimerkki (esimerkki zip-pakettina) ja lue selitys ennen kuin jatkat.
Luo uusi komponentti PalindromiTextBox, jonka perit TextBox-luokasta. Uusi komponentti kelpuuttaa syötteeksi vain kirjaimia eli numerot ja erikoismerkit eivät kelpaa. Lisäksi komponentti osaa ilmoittaa milloin siihen syötetty merkkijono on palindromi. Mallia voit katsoa luennolta. Tarkista mitä kaikkea mukavaa String-luokka osaa ja käytä valmiita metodeja apunasi. Esim. IndexOf- ja C# Tips & Tricks: String Reversal-sivulla esitetty LINQ-versio stringin kääntämisestä voivat olla hyödyksi. Muista, että C#-kielessä string on immutable eli sitä ei voi muuttaa.
- Luo komponentti ja tee siihen aiemmin tehtyyn tapaan toimivat tarkistukset
- Lisää komponenttiisi tapahtuma, joka suoritetaan jos kenttään syötetään
palindromi. Määrittele sopiva delegaattityyppi ja esittele sellainen esim:
public delegate void PalindromiHandler(); public event PalindromiHandler Palindromi;
Katso Delegaatit- ja tapahtumat esimerkki (Esimerkki zip-paketissa) - Kutsu Palindromi()-funktiota silloin kun syötetty teksti on
palindromi. Huom. varmista, että Palindromi on määritelty ennen
kutsumista (Palindromi != null).
if (Palindromi != null) Palindromi();
- Käännä komponentti uudelleen (rebuild). Kokeile komponenttia testipenkissä.
Komponenttisi tapahtumalistasta pitäisi löytyä nyt tapahtuma Palindromi.
Lisää Palindromi-tapahtumaan jotain millä voit testata toimiiko komponenttisi tapahtuma esim:
MessageBox.Show ("Syötit palindromin!", "Testipenkki", MessageBoxButtons.OK);
Nyt lomake saa aina tiedon kentän virhesyötteestä ja voi sen perusteella reagoida asiaan tai olla reagoimatta.
Komponenttien design time propertyt
Vinkkejä: Design-Time Attributes for Components
- Luo uusi komponentti LukuvaliTextBox, joka kelpuuttaa syötteeksi vain kokonaislukuja halutulta väliltä esim. 0 - 10.
- Rakenna komponenttiin syötteentarkistukset edellätehtyyn tapaan
- Lisää luokkaan kaksi propertyä min ja max joilla voi suoraan visual studiossa määrätä kelpaavaan lukuvälin.
- Aseta uusille propertyille oikeanlainen avustus ym. Vinkkiä saat dokumentista: User Controls Custom Properties
Lisätietoa
- Attributes and Design-Time Support
- Developing Windows Forms Controls at Design Time
- AutoValidate Enumeration
- Validation in Windows Forms
- Defining Default Values with the ShouldSerialize and Reset Methods
- User Input Validation in Windows Forms
- Extending Windows Forms with a Custom Validation Component Library
- WinForms Data Validation
- ErrorProvider Class
- Lesson 14: Introduction to Delegates and Events
Käyttäjien kommentit