BABEŞ-BOLYAI TUDOMÁNYEGYETEM, KOLOZSVÁR
ADATOK ÉRVÉNYESÍTÉSÉNEK TANÍTÁSA
Témavezető: Darvay Zsolt
Készítette: Csonta Ildikó
2011
Adatok érvényesítésének tanítása
2
Elméleti alapok
Adatérvényesítés általában Az adatérvényesítés az a folyamat, amelynek során megbizonyosodunk róla, hogy az alkalmazásunk helyes adatokkal dolgozik, kizárva a rosszindulatból vagy tévedésből adódó biztonsági problémákat és egyéb, adatvesztésből adódó, kellemetlenségeket. Az ellenőrzés, minél több hibalehetőség kizárása, a programfejlesztés lényeges része. Ellenőrzés történhet az alkalmazásban az adatbázis szintjén is: táblák közötti helyes kapcsolatok, elsődleges kulcsok és természetesen a triggerek használatával. Jobb azonban űrlapjainkat úgy megszerkeszteni, programozni, hogy a felhasználó ne az adatok elküldése után tudja meg, hogy nem sikerült az adatbázisba való beszúrás, hanem még az űrlapon lehetősége legyen, minél kevesebb kényelmetlenség árán, a hibákat kijavítani. A hibaüzenetek megfogalmazása, időzítése a felhasználóbarát felület, a megfelelő beviteli objektumok kiválasztása is mind segíthet a helyes adatbevitelben. Ezek mellett a megfelelő beállításokat is el kell végezni, hogy az adataink helyesen tárolódjanak: az adatok formátuma, hossza megfelelő legyen és az ékezetes karaktereink se alakuljanak át, hisz elküldés után is használhatatlanná válhat az adat.
Adatérvényesítési lehetőségek a Microsoft Visual C#-ban Adatérvényesítést megkönnyítő űrlapelemek Microsoft Visual C# 2010-ben: 1. A NumericUpDown (görgetőgombos adatbeviteli mező) osztály
rendelkezik
egy
Minimum
és
egy
Maximum
tulajdonságokkal, amelyek meghatározzák az ilyen típusú
Példa az 1. megoldott feladatból
objektumaink lehetséges értékeit: nem szükséges ellenőrizni, hogy az adott érték egész szám vagy hogy benne van egy adott intervallumban. 2. A ComboBox (kombinált lista mező) osztály lehetőséget ad, arra, hogy felkínáljunk előre beírt válaszokat, sőt amennyiben a DropDownList (lebomló listadoboz) típust választjuk, teljesen kontroláljuk a bekerülő értékeket: csak az általunk megadott értékek jöhetnek szóba, nem írhat be más értéket a felhasználó.
Példa az 1. megoldott feladatból
Adatok érvényesítésének tanítása
3
3. A RadioButton (rádiógomb) objektumokat csoportosítva elérhetjük ugyanazt, amit az előbbi lebomló listadobozzal: megadhatunk konkrétan választható elemeket a felhasználónak. Nem kell ellenőrizni, hogy többet választott vagy sem, hiszen egyszerre csak egy opciót lehet kijelölni, amennyiben egy közös konténer (pl. GroupBox) objektumon helyezünk el több ilyen rádiógombot.
Példa a 3. megoldott feladatból.
Amennyiben több elem kijelölését is megengedi a feladat javasolt a CheckBox osztály használata. 4. A MaskedTextBox (maszkolt adatbeviteli mező) osztály, a beviteli mező továbbfejlesztett formája. Itt megadhatunk egy úgynevezett maszkot, amelynek meg kell feleljen a beírt adat. A Mask tulajdonságnál adhatjuk meg a megfelelő formát: 0-val
Példa az 2. megoldott feladatból
lehet számjegyet „kényszeríteni” egy adott helyre, 9-cel számjegyet vagy szóközt, A-val tetszőleges karaktert, a legtöbb karakter viszont saját magát helyettesíti. 5. A DateTimePicker osztály kisegíthet minket, ha dátumot szeretnénk bekérni. Legtöbbször nem szükséges plusz ellenőrzés hiszen biztos, hogy helyes dátum formátumban kapjuk a bevitt értéket. Ugyanakkor a válaszható dátumok intervallumát is megadhatjuk: van MinDate és MaxDate tulajdonsága az osztálynak. Példa az 2. megoldott feladatból
Adatérvényesítést megkönnyítő események Microsoft Visual C# 2010-ben: Az általunk használt űrlapelemek a System.Windows.Forms.Control osztályból származnak, amelynek van néhány a téma szempontjából használható eseménye. Amennyiben nem csak egy gomb lenyomásakor akarjuk az ellenőrzést elvégezni, megtehetjük például minden egyes billentyű lenyomásra (OnKeyDown), vagy felengedésre (OnKeyUp) alkalmával, vagy ellenőrizhetünk, amikor a felhasználó ellép az adott elemről (OnLeave, LostFocus) stb. A maszkolt adatbeviteli adatmező osztály speciális eseménye a MaskInputRejected, amely akkor lép fel, ha olyan karakert ír be a felhasználó, amely nem felel meg a maszknak. Ez sokat segít az osztály használhatóvá tételén: a hibára azonnal értelmes reakciót kaphat a felhasználó.
Adatok érvényesítésének tanítása
4
Két érdekesebb eseményre térnék még ki: a Validating és Validated események akkor lépnek fel, ha az adott objektum esetén a CausesValidation tulajdonság igazra van állítva. Minden űrlapelemre a Leave (elhagyás) esemény után lép fel a Validating esemény, amely egy CancelEventArgs típusú paramétert kap – azaz egy Cancel tulajdonság lesz az eseményhez kapcsolva,
így
az
őt
lekezelő
alprogramban
visszafordíthatjuk
az
eseményt
vagy
„továbbengedhetjük”. A melléklet megoldott feladatokból is kiderül, hogy amennyiben a Cancel tulajdonság igaz lesz, az eseményt kiváltó objektumra visszatérünk és nem is foglalkozhat a felhasználó egyébbel, amíg az alprogramba leírt ellenőrzésen nem megy át a beírt tartalom. A Validating esemény után, a Validated következik, ha nem léptünk vissza. Itt megadhatjuk az érvényesítés utáni tennivalókat, amennyiben vannak ilyenek. Csak az első feladatnál használtam ezeket az eseményeket tekintve, hogy a felhasználó számára idegesítő lehet, hogy ki sem léphet az alkalmazásból, amíg egy elkezdett mezőt helyesen ki nem tölt. Azt hiszem elég a hibát jelezni és akkor nem engedni tovább, amikor a mentést kíséreli meg. A hibák felhasználóbarát visszajelzése: Az ellenőrzés során, ha hibát találunk egy űrlapon, mindenképpen lehetőséget kell adni a felhasználónak, hogy a lehető legkönnyebben kijavíthassa a hibáit. A megfelelő hibaüzenetet kell ilyenkor megjeleníteni és lehetőleg visszaküldeni a felhasználót a megfelelő helyre, azaz a fókuszt az érintett beviteli mezőnek átadni – minden ilyen osztály rendelkezik focus metódussal. A hibaüzenetek megjelenítésére alkalmas osztályok: 1. A Label osztály lehet alkalmas egy üzenet megjelenítésére. A Text tulajdonságnak értéket adva, színt és megfelelő betűtípust kiválasztva megfelel. programozó
Ezt sok
a
egy
módszert utánaolvasás
Példa az 1. feladat esetén.
kezdő
nélkül
is
kitalálhatja. A MessageBox osztály is alkalmas lehet hibajelzésre. A Show metódus segítségével tetszőleges
szöveget
egy
megjelenít.
Az
gomb
OK
kis
ablakban
lenyomásával
eltűnik. Könnyen használható objektum. Példa az 1. feladat esetén.
Adatok érvényesítésének tanítása
5
2. Az ErrorProvider osztály kimondottan hibajelzésre van tervezve. Az űrlapon, ha elhelyezünk egy ilyen objektumot, bármely űrlaphoz
tartozó
elemhez
Példa az 1. feladat esetén
kapcsolva
megjeleníthetünk üzenetet. A kis piros kör, addig pislog a megfelelő helyen, amíg a kurzort föléje igazítva, el nem
Az eszköztáron
olvassa a felhasználó az üzenetet. Megjeleníteni például az Validating, eltűntetni a Validated eseményre lehet, de a megoldott feladatok során más eset is előfordul. Megtörténhet, hogy felmerülhetnek olyan hibák, amelyek általunk is kijavíthatóak, ezekre lehetőleg fel kell készülni és a javítást futás közben megoldani. Például ha egy állomány, amibe írnunk kellene írásvédett, előbb meg kell próbálni a beállítást programból megoldani, mielőtt a felhasználónak üzenetet kiírva bezárjuk az alkalmazást. (lásd a 3. feladatot) Ha a problémák nem megoldhatóak sem az űrlapon a felhasználó által, sem a programozó által mindenképp jelezni kell a felhasználónak, hogy ne maradjon azzal a benyomással, hogy a művelet sikeresen véget ért. Az alkalmazás hibaüzenet nélküli becsukása szintén nem elfogadható: sokkal könnyebb megoldani a problémát, amennyiben a program jelzi, hogy mi a gond. A hiba esetén való „értelmes” kilépésre használható a try catch szerkezet. Ha egy művelet nem hajtható végre, kivétel (exception) léphet fel, aminek eredménye a programunk lefagyása vagy rendhagyó befejeződése. Ha olyan utasításunk van, amely ilyen kivételt eredményezhet bizonyos esetekben és másképp nem tudjuk megoldani a program normális lezárását, az utasítást a try részbe kell helyezni és a catch részben legalább egy hibaüzenetet, magyarázatot kell adni. Amennyiben meg lehet oldani másképp a helyzetet, más módszert kell alkalmazni. A második megoldott feladatban például kivétel léphetne fel, ha megpróbálnánk egyszerű int.Parse statikus eljárással a mennyiséget számmá alakítani, de mivel létezik a TryParse is, ezzel megoldható, hogy sikertelen átalakítás esetén a (try catch nélkül) visszaküldjük a felhasználót a mennyiség mezőhöz. A harmadik feladatnál az állománykezelésnél előfordul már több utasítás, amely kivételt okozna: például, ha az állomány nem létezik vagy írásvédett az OpenText metódus okozna gondot. Megoldás lehet előre ellenőrizni, hogy létezik az állomány (File.Exists) és ha nem, létrehozni. Az írásvédettség esetén megpróbálkozhatunk átállítani az állomány tulajdonságait. Ha viszont ehhez nincs jogunk, akkor mindenképp kivétel lép fel.
Adatok érvényesítésének tanítása
6
Megoldásra javasolt feladatok
1. feladat: Készíts egy alkalmazást, amely egy diák nevét, osztályát és a szakát kéri be, majd elmenti egy Access adatbázisba. Az adatokat, amennyire lehet még elküldés előtt ellenőrizni kell. Az alkalmazás a következő követelményeknek feleljen meg: a. A beírt nevet csak akkor lehet elfogadni, ha nem üres illetve legalább egy szóközt (család és személynév) tartalmaz. Próbáld ki a Validating és Validated eseményeket ennek megoldásában. b. Az osztály csak 9 és 12 közötti számértékeket vehet fel. Próbáld ki a görgetőgombos adatbeviteli mező objektumot (NumericUpDown) annak megoldására, hogy tényleg csak ilyen értékek kerülhessenek az osztály mezőbe. c. A
szak
lehet:
Filológia,
Társadalomtudományok,
Természettudományok,
Matematika – informatika, Matematika – intenzív informatika. Próbáld a kombinált lista objektumot (ComboBox) használni. Beállításokkal oldd meg, hogy nem lehessen más értéket megadni, csak amit előre megadtál. d. A Mentés gomb lenyomásával az adatok az adatbázisba kerüljenek. e. A Kilépés gomb lenyomásával az alkalmazás záródjon le. 2. feladat: Adott egy cég, amely ócskavasat szállít el a magánszemélyektől vagy cégektől. Készíts egy űrlapot nekik a következőképpen: a. A kliens vagy e-mail címet vagy telefonszámot adjon meg, hogy ha gond merül fel értesíteni tudják. Adhat meg mindkettőt vagy csak az egyiket. Ezt ellenőrizni kell. b. A telefonszám csak 10 számjegyű lehessen. c. Az email címre is alkalmazz ellenőrzést. d. A kliens adja meg az elszállítandó vas mennyiségét kilogrammban. Ellenőrizd, hogy szám legyen a megfelelő mezőben. e. Egy dátumot is adjon meg a felhasználó, amelyen megfelelne a szállítás neki. Gondoskodj róla, hogy ez a dátum legyen helyes és a jelentkezéstől számított két hónapon belüli legyen. f. A kliens adja meg a címet is, ahonnan a vasat el kell szállítani. Ez a mező se lehessen üres. Az alkalmazás megjelenítse meg kért mezőket és végezze el a szükséges ellenőrzéseket, ha minden le van ellenőrizve, írja ki, hogy helyes a kitöltés.
Adatok érvényesítésének tanítása
7
3. feladat: Készíts egy alkalmazást, amely segítségével a felhasználó válaszolhat egy három válaszlehetőséggel rendelkező kérdésre (szavazhat). Vedd figyelembe a következő szempontokat: a. a lehetséges válaszokat ne kelljen beírja a felhasználó, csak választania kelljen. Javasolom a RadioButton osztály használatát. b. A szavazás eddigi összegzett eredményét mentsd egy fájlba: a fájl három számot tartalmazzon, a három válasz előfordulási számait. Végezz ellenőrzést és írasd ki a megfelelő üzeneteket, ha a fájllal kapcsolatban hiba lép fel (pl. nem lehet bele írni). Ha még nem létezik a fájl egyszerűen létre kell hozni. c. Legyen egy Eredmény gomb, amely segítségével megnézheti a felhasználó, a válaszadás után, az eddigi válaszok számát. d. Hozz létre egy Kilépés gombot is.
Adatok érvényesítésének tanítása
8
A megoldások elemzése
1. feladat: A feladathoz az űrlapot a mellékelt képen látható formában szerkesztettem meg. a. A névhez egyszerű adatbeviteli mezőt (textBox) választottam.
Az
ellenőrzést
a
Validating
eseményt lekezelő alprogramban adtam meg. Mivel a névhez tartozó szövegdoboz kapja meg egyből az fókuszt, addig semmi egyebet nem lehet kezdeni az űrlapon, amíg egy „helyes” nevet be nem ír a felhasználó. private void textBox1_Validating(object sender, CancelEventArgs e)
Három dolgot ellenőriztem: -
először is azt, hogy üres vagy sem a szövegdoboz. Ebben az esetben az alább következő
ellenőrző feltételeken is fenn akadna a szövegdoboz tartalma, de nem a megfelelő üzenet jelenne meg: a Ki kell tölteni! üzenet helyett például Teljes nevet kérek!. if (textBox1.Text.Length==0) { e.Cancel = true;z errorProvider1.SetError(textBox1, "Ki kell tölteni!"); }
-
egy szóköz létezését – hogy teljes név (család és személynév) meglegyen else if (textBox1.Text.IndexOf(" ") == -1) { e.Cancel = true; errorProvider1.SetError(textBox1, "Teljes nevet kérek!"); }
-
szintén a szóközt megnéztem, hogy ne az első helyen legyen, hisz akkor a fenti feltétel
szerint helyes, pedig nincs két szó. if (textBox1.Text.IndexOf(" ") == 0) { e.Cancel = true; errorProvider1.SetError(textBox1, "Nem kezdődhet szóközzel!"); }
Az e.Cancel = true hatására visszatérünk az épp elhagyni készült szövegdobozra. A SetError metódus a második paraméterként megadott hibaüzenetet állítja be, az első paraméterként megadott objektumra.
Adatok érvényesítésének tanítása
9
b. A javasolt görgetőgombos adatbeviteli mező (NumericUpDown) objektum esetén, nem szükséges a további ellenőrzés, ha a Minimum tulajdonságot 9-re és a Maximumot 12-re állítjuk. c. A kombinált lista (ComboBox) esetén az Items tulajdonsághoz be lehet, már szerkesztési nézetben írni a lehetséges értékeket ennél a feladatnál. Programból is fel lehet tölteni (ez a gyakrabban
előforduló
eset)
az
InitializeComponent();
utasítás
után
comboBox1.Items.Add(" Filológia "); A DropDownStyle tulajdonságnál ki kell választani a DropDownList típust, hiszen a feladatban felsorolt értékeken kívül más érték beírása nem szükséges, csak lehetőséget adnánk hiba előfordulására. Itt sem szükséges az ellenőrzés, ha beállítjuk az alapértelmezett értéknek az első elemet. comboBox1.SelectedIndex = 1;. d. A Mentés gomb lenyomását kezelő alprogramban egy Access adatbázisba menti az űrlap tartalmát. Azért választottam az Access-t, mert az iskolában minden diák ismeri és minden gépen megtalálható program. Nem kell külön kitérni az adatbázis létrehozásának módjára. Ez a kód nem tartalmaz ellenőrzést, de lehetne… private void button1_Click(object sender, EventArgs e) { kapcs = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ab1.mdb"); OleDbCommand cmd = new OleDbCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "Insert Into szemely values('" + textBox1.Text + "'," + numericUpDown1.Value + ",'" + comboBox1.SelectedItem + "')"; cmd.Connection = kapcs; kapcs.Open(); cmd.ExecuteNonQuery(); kapcs.Close(); MessageBox.Show("A beszúrás megtörtént!"); textBox1.Text = ""; }
e. A Kilépés gomb esetén a végrehajtott utasítás Application.Exit();
2. feladat: A
mellékelt
ábra
által
megadott
űrlapot
készítettem a feladathoz. A telefonszám illetve az e-mail cím mezői a kipipálásra jelennek meg. A hibaellenőrzést ez esetben főként a Megvan gomb lenyomás eseményét kezelő alprogramban végeztettem
el,
az
üzenetekhez
megint
Adatok érvényesítésének tanítása
10
ErrorProvider típusú objektumot használtam. a. Az értesítés formáját a Kapcsolat csoportban CheckBox típusú objektumok segítségével jelölheti ki a felhasználó. Azt, hogy a pipálgatással megjelenjenek és eltűnjenek a szükséges mezők, a CheckedChanged eseményt lekezelő alprogramban oldottam meg. Mellékeltem a telefonost: if (checkBox1.Checked) { maskedTextBox1.Visible = true; label1.Visible = true; maskedTextBox1.Focus(); errorProvider1.SetError(groupBox1, ""); } else { maskedTextBox1.Visible = false; label1.Visible = false; }
A hibaüzenet kiüresítésére azért van szükség, hogy ha már ki van írva, hogy pipáljunk ki valamit, tüntesse el. A hibaüzenet akkor jelenik meg, ha nincs egyik se bejelölve és menteni akarunk: if ((!checkBox1.Checked) && (!checkBox2.Checked)) { groupBox1.Focus(); errorProvider1.SetError(groupBox1, "Ki kell az egyiket pipálni!"); hiba = true; }
b. A telefonszámot egy MaskEdit típusú objektumba kértem be. A Mask tulajdonság által megadott forma: 0000-000000, azaz 4 számjegy után egy vonal, majd még 6 számjegy. Ennél az objektumnál van kitöltés közbeni ellenőrzés is, kihasználva a MaskInputRejected esemény létezését. Ez akkor lép fel, ha olyan karakert ír be a felhasználó, amely nem felel meg a maszknak és ilyenkor szükséges az azonnali visszajelzés, hogy kiderüljön mi a hiba oka: private void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) { if (e.Position <= 10) errorProvider1.SetError(maskedTextBox1, "Csak számjegyeket lehet beírni!"); else errorProvider1.SetError(maskedTextBox1, "Csak 10 számjegyet leht beírni!"); }
Ha a hiba fellépett vagy nem számot írt be a felhasználó, ilyenkor a hiba az első 10 index helyen fordul elő (0-tól kezdünk), vagy több számot akarnak beírni mint szükséges. A hiba eltűntetését a KeyDown esemény fellépésre tettem. c. Az e-mail címet egy egyszerű beviteli dobozba (TextBox) írattam be. Az ellenőrzés Megvan gomb lenyomására történik, ilyenkor a piros felkiáltójel megjelenik mellette és a fókuszt is megkapja:
Adatok érvényesítésének tanítása
11
if (textBox1.Text.IndexOf("@") < 1) { textBox1.Focus(); errorProvider1.SetError(textBox1, "Az e-mail cím nem érvényes (@)!"); hiba = true; } else if (textBox1.Text.IndexOf(".") < 4) { textBox1.Focus(); errorProvider1.SetError(textBox1, "Az e-mail cím nem érvényes (.)!"); hiba = true; }
Hiba az, ha nincs @ vagy . benne. d. A mennyiség is beviteli mezőbe (TextBox) kerül. Szintén a Megvan gomb lenyomásakor hibát ad a program, ha üres és ha nem szám a beírt érték. if (!hiba) { int szam; if (textBox2.Text.Length == 0) { textBox2.Focus(); errorProvider1.SetError(textBox2, "Ki kell tölteni!"); hiba = true; } else if (!int.TryParse(textBox2.Text, out szam)) { textBox2.Focus(); errorProvider1.SetError(textBox2, "Természetes számot kell ide írni!"); hiba = true; } }
Az TryParse az int osztály statikus metódusa, amely átalakít egy szöveget egész számmá, ha nem megy, az nem okoz gondot, egyszerűen hamisat térít vissza és nem kezd semmit a szam változóval. e. A dátum bekéréséhez egy DateTimePicker objektumot használtam. Ellenőrzés nem szükséges hiszen az intervallum beállítható előre és a formátumot a felhasználó nem tudja elrontani. dateTimePicker1.MinDate = DateTime.Today; dateTimePicker1.MaxDate = DateTime.Today.AddMonths(2);
f. A címet is egyszerű adatbeviteli mezőbe (TextBox) írattam. Az üresség leellenőrzését a textBox2-höz hasonlóan végeztem szintén a Megvan gomb lenyomása esetén. g. Az ellenőrzés nagy részét, amint említettem a gomb lenyomásra végeztem. A fennebb megadott részekben gyakran szereplő hiba változó segítségével oldottam meg, hogy egyszerre csak egy hibát jelezzen. Az első hibát, ahogy megtalálta, kiírja az üzenetet a megfelelő objektum mellé, és nem keres tovább. Ha minden ellenőrzésen végig halad és a hiba még mindig hamis, akkor megjelenik az üzenet: if (!hiba) { MessageBox.Show("Az adatokat sikeresen kitöltötted"); Application.Exit(); }
Adatok érvényesítésének tanítása
12
3. feladat: Az alkalmazás űrlapját a mellékelt ábra szerint állítottam össze. a.
A beírásnál a hibák elkerülése végett a válaszok előre meg vannak adva, ezek közül ebben az esetben rádiógombok (RadioButton) segítségével lehet választani. Ezek egy GroupBox típusú objektumon helyezkednek el: így csak egyik lehet kijelölve: nem szükséges ellenőrizni a bemenetet ezen elem esetén.
b. Az eredmény fájlba való mentése több hibalehetőséget behoz: -
Lehet, hogy nem létezik a fájl: a fájlmegnyitáskor az File.OpenText létrehozná automatikusan, de megtörténhet, hogy nincs joga a programnak, ezért már előre megpróbálom létrehozni, hogy ne szavazás után derüljön ki, hogy nem fog menni a mentés: try { File.Create(utvonal); } catch (System.UnauthorizedAccessException) { MessageBox.Show("Nem hozható létre a szoveg.txt!"); Application.Exit(); }
Ha nem megy a létrehozás, csak akkor adom fel. -
Ha a program hozza létre a fájlt, akkor is meg kell oldani, hogy három darab 0-ról induljunk az újonnan létrehozott állományba: a szavazás eredményét a szam tömbbe olvassuk, de kezdeti értékeik 0-k, így ha üres a fájl a kezdőértékekről indul.
-
Lehet, hogy a fájl tartalma nem megfelelő, nem számok vannak benne: a tryParse, ha nem megy, marad a 0 a fent említett számtömbben. Ha nincs elég sor az sem gond, mert csak addig olvas, amíg van adat. StreamReader sr = File.OpenText(utvonal); string s; int i = 0; while ((!sr.EndOfStream) && (i<3)) { s = sr.ReadLine(); int.TryParse(s, out szam[i]); i++; } sr.Close();
-
Lehet, hogy a fájl létezik, de pl. rejtett. Ilyenkor a program megpróbálja átállítani, ha nem megy, kilép:
Adatok érvényesítésének tanítása
13
bool rejtett = ((File.GetAttributes(utvonal) & FileAttributes.Hidden) == FileAttributes.Hidden); if (rejtett) { try { File.SetAttributes(utvonal, File.GetAttributes(utvonal) & ~FileAttributes.Hidden); } catch (System.UnauthorizedAccessException) { MessageBox.Show("A szoveg.txt állomány rejtett!"); Application.Exit(); } }
-
a szavazás mentésekor megtörténhet, hasonló módon, hogy írásvédett az állomány. Ez az eddigi műveletek során nem derült volna ki. Hasonlóan meg próbálja a program átállítani az állomány egy tulajdonságát, mint a rejtettséget. Itt az FileAttributes.ReadOnly tulajdonsággal kell dolgozni. A & jel, a bitenkénti és, azért szükséges, hogy hozzáférjünk a rejtett vagy írásvédett tulajdonságot megadó bithez. Ha az ellenőrzések, megvannak jöhet a mentés: if (radioButton1.Checked) szam[0]++; if (radioButton2.Checked) szam[1]++; if (radioButton3.Checked) szam[2]++; StreamWriter sw = File.CreateText(utvonal); for (i = 0; i < 3; i++) sw.WriteLine(szam[i]); w.Close();
c. Az eredmény kiíratásakor, mivel a szam tömb az űrlap osztály változója, minden alprogramban látszik, nem kell újra beolvasni, ki lehet egyből íratni. Ahhoz, hogy a gomb csak a szavazás után látszódjon, kezdetben inaktívvá kell tenni, majd szavazás után aktiválni. Az enabled tulajdonság alkalmas erre.
Adatok érvényesítésének tanítása
14
Felhasznált források:
A feladatok megoldásához használt Microsoft Visual C# 2010 alkalmazás letöltésének helye: http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express A képek kivágásához a GIMP 2.6.9-ot használtam. http://www.gimp.org/downloads/ Az elmélet megírásában, a feladatok kitalálásában segítségemre voltak a következő olvasmányok: http://en.wikipedia.org/wiki/Data_validation http://msdn.microsoft.com/en-us/library/aa291820%28v=VS.71%29.aspx
Az elemek leírásában, a kódok megírásában használtam: http://msdn.microsoft.com/en-us/library/kx37x362.aspx - és rengeteg aloldalát Fájlműveletekhez : http://www.geekpedia.com/tutorial109_File-operations-IorO.html Állomány tulajdonságok: http://www.csharp-examples.net/file-attributes/ Access kapcsolat: http://www.youtube.com/user/imrantaj82 Érvényesítés és egyéb ötletek: http://www.youtube.com/user/pvjneji
Adatok érvényesítésének tanítása
15
Tartalomjegyzék
Elméleti alapok .................................................................................................................................... 2 Adatérvényesítés általában ............................................................................................................... 2 Adatérvényesítési lehetőségek a Microsoft Visual C#-ban ............................................................. 2 Adatérvényesítést megkönnyítő űrlapelemek Microsoft Visual C# 2010-ben: ........................... 2 Adatérvényesítést megkönnyítő események Microsoft Visual C# 2010-ben: ............................. 3 A hibák felhasználóbarát visszajelzése: ....................................................................................... 4 Megoldásra javasolt feladatok ............................................................................................................. 6 A megoldások elemzése ....................................................................................................................... 8 1. feladat: .......................................................................................................................................... 8 2. feladat: .......................................................................................................................................... 9 3. feladat: ........................................................................................................................................ 12 Felhasznált források: .......................................................................................................................... 14