You are on page 1of 165

MUC LUC

Phn 1 C ban v ngn ng lp trinh C#...........................................................................................................................4 Bai thc hanh 1.1. Chng trinh u tin...........................................................................................................4 Tm tt.............................................................................................................................................................4 K thut c trnh by...................................................................................................................................4 Trnh t thc hin............................................................................................................................................4 Bai thc hanh 1.2. Module hoa chng trinh......................................................................................................7 Tm tt.............................................................................................................................................................7 K thut c trnh by...................................................................................................................................7 Trnh t thc hin............................................................................................................................................7 Bi thc hnh 1.3. To th vin s dng chung..................................................................................................9 Tm tt.............................................................................................................................................................9 K thut c trnh by...................................................................................................................................9 Trnh t thc hin............................................................................................................................................9 M rng.........................................................................................................................................................10 Bai thc hanh 1.4. Tam giac Pascal ..................................................................................................................11 Tm tt...........................................................................................................................................................11 K thut c trnh by.................................................................................................................................11 Trnh t thc hin..........................................................................................................................................11 M rng.........................................................................................................................................................12 Bai thc hanh 1.5. Tam giac Pascal array version.........................................................................................13 Tm tt...........................................................................................................................................................13 K thut c trnh by.................................................................................................................................13 Trnh t thc hin..........................................................................................................................................13 M rng.........................................................................................................................................................13 Bai thc hanh 1.6. MyTYPE...............................................................................................................................14 Tm tt...........................................................................................................................................................14 K thut c trnh by.................................................................................................................................14 Trnh t thc hin..........................................................................................................................................14 M rng.........................................................................................................................................................14 Bai thc hanh 1.7. Quan ly sinh vin.................................................................................................................15 Tm tt...........................................................................................................................................................15 K thut c trnh by.................................................................................................................................15 Trnh t thc hin..........................................................................................................................................15 Yu cu thm.................................................................................................................................................20 Phn 2 Lp trinh ng dung vi winforms........................................................................................................................21 Bi thc hnh 2.1 helloWinForms.....................................................................................................................21 Tm tt...........................................................................................................................................................21 K thut c trnh by.................................................................................................................................21 Trnh t thc hin..........................................................................................................................................21 M rng.........................................................................................................................................................32 Bi thc hnh 2.2 usingControls.......................................................................................................................33 Tm tt...........................................................................................................................................................33

K thut c trnh by.................................................................................................................................33 Trnh t thc hin..........................................................................................................................................33 Bi thc hnh 2.3 textFormat............................................................................................................................37 Tm tt...........................................................................................................................................................37 K thut c trnh by.................................................................................................................................37 Trnh t thc hin..........................................................................................................................................37 M rng.........................................................................................................................................................44 Bai thc hanh 2.4 myCalculator........................................................................................................................45 Tm tt...........................................................................................................................................................45 K thut c trnh by:...............................................................................................................................45 Trnh t thc hin..........................................................................................................................................45 M rng.........................................................................................................................................................49 Bai thc hanh 2.5 myNotePAD...........................................................................................................................50 Tm tt...........................................................................................................................................................50 K thut c trnh by.................................................................................................................................50 Trnh t thc hin..........................................................................................................................................50 M rng.........................................................................................................................................................54 Bai thc hanh 2.6 Quan ly sinh vin - WinForms version.................................................................................55 Tm tt...........................................................................................................................................................55 K thut c trnh by.................................................................................................................................56 Trnh t thc hin..........................................................................................................................................56 M rng.........................................................................................................................................................61 Bai thc hanh 2.7 myFileViewer........................................................................................................................62 Tm tt...........................................................................................................................................................62 K thut c trnh by.................................................................................................................................62 Trnh t thc hin..........................................................................................................................................62 M rng.........................................................................................................................................................72 Phn 3 X ly d liu vi ADO.NET.................................................................................................................................73 Kin thc c bn v ADO.NET 2.0....................................................................................................................73 3.1 Kin trc tng quan ca ADO.NET........................................................................................................73 3.2 Tng quan v cc m hnh x l d liu trong ADO.NET: M hnh Kt ni (Connected Model) v M hnh Ngt Kt ni (Disconnected Model)......................................................................................................75 3.3 Lm vic vi m hnh Kt ni trong ADO.NET.....................................................................................78 3.3.4 V d.....................................................................................................................................................89 3.5 Lm vic vi m hnh Ngt kt ni: DataSet v DataTable....................................................................96 3.5 S dng Data Binding...........................................................................................................................113 3.6 La chn gia m hnh Kt ni v m hnh Ngt kt ni.....................................................................113 3.6 To i tng DataSet...........................................................................................................................115 3.7 Kt hp gia nhiu bng.......................................................................................................................118 3.8 Thay i cc bn ghi ca c s d liu.................................................................................................123 3.9 Truy cp v hin th d liu...................................................................................................................124 3.10 Cp nht mt dng d liu...................................................................................................................124 3.11 Xa mt dng d liu..........................................................................................................................126 3.12 To mt dng d liu mi...................................................................................................................127 Phn 4 Xy dng ng dung Web vi WebForms..........................................................................................................139 4.1 Tm hiu v Web Forms..............................................................................................................................139

Bi tp thc hnh Chuyn Visual Studio .NET

4.2 Cc s kin ca Web Forms.......................................................................................................................139 4.2.1 S kin PostBack v Non-PostBack...................................................................................................140 4.2.2 Trng thi ca ng dng Web (State).................................................................................................140 4.2.3 Chu trnh sng ca mt Web-Form....................................................................................................140 4.3 iu khin xc nhn hp............................................................................................................................143 4.4 Mt s v d mu minh ha........................................................................................................................143 4.5 Cc dch v Web.........................................................................................................................................158 Phn 5 Phu luc..................................................................................................................................................................163 Ph lc A Chui kt ni cho cc loi ngun d liu........................................................................................163 Ph lc B Bng tng quan/chuyn i kiu d liu .NET Framework vi cc Data Provider..................163 Phn Tai liu tham khao...............................................................................................................................................165

Bi tp thc hnh Chuyn Visual Studio .NET

PHN 1 C BAN V NGN NG LP TRINH NH C#


Bai thc hanh 1.1. Chng trinh u tin Tm tt Bai thc hanh nay giup ban lam quen vi mi trng Visual Studio 2005 va cac thao tac nhp xut c ban thng qua giao din ban phim. Cu th, chng trinh yu cu ngi s dung nhp hai s, sau o in ra man hinh tng, tich va thng cua hai s nay. K thut c trnh by - Lam quen vi mi trng Visual Studio 2005. Cu truc mt solution, project va cac tai nguyn co lin quan Cach thc s dung th vin MSDN tra cu, hng dn S dung thao tac nhp xut c ban

Trnh t thc hin 1. Khi ng Microsoft Visual Studio 2005. Nhn Ctrl + Shift + N hoc chon menu tng ng la File New Project tao mi mt project

2. Chn loi ng dng cn pht trin l Visual C# Console Application. Chn th mc cha project v t tn cho project. V mt thc cht, Visual Studio coi project thuc v mt solution no , v mt solution c th cha nhiu

Bi tp thc hnh Chuyn Visual Studio .NET

project. Tuy nhin, trong nhiu bi ton n gin (nh v d ca chng ta chng hn), mt solution ch c 1 project. 3. t tn cho project ca chng ta thnh firstApp. Sau khi nhn nt OK, hy kho st xem cu trc ca th mc cha solution ca chng ta. Bn phi lun nm chc v ngha ca cc tp tin, th mc c to ra trong qu trnh lm vic. 4. G m lnh nh minh ha vo trong phn m ngun ca tp tin Program.cs

5. S dng MSDN tra cu cc thng tin bn cha bit v: a. Console v cc phng thc ReadLine(), WriteLine() ca n b. Cch chuyn i kiu chui thnh s, v d nh int.Parse() 6. Nhn Ctrl + F5 thc hin chy chng trnh. Sau quan st cu trc th mc ca solution, cho bit s thay i ca n so vi khi mi c to ra bc 3. 7. Th thay i kt cu lnh float thuong = (float)x / y; thnh float thuong = x / y; ri chy chng trnh, quan st kt qu v rt ra kt lun.

Bi tp thc hnh Chuyn Visual Studio .NET

8. S dng thm cc cu trc lnh khc tinh chnh hot ng ca chng trnh (x l php chia cho 0, )

Bi tp thc hnh Chuyn Visual Studio .NET

Bai thc hanh 1.2. Module hoa chng trinh Tm tt Vit chng trinh nhp vao mt s nguyn N t ban phim. Sau o a. In ra man hinh gia tri N!. b. Nhp thm mt s nguyn K t ban phim. Sau o in ra CKN = N!/(K!*(N-K)!) K thut c trnh by - Cu trc, cch qun l logic v vt l, cch lm vic ca solution v project Thc hin chia nho ng dung thanh chuyn mn hoa cac phn C ban v cac kiu phng thc trong mt lp

Trnh t thc hin 1. M solution lm Bi thc hnh 1.1. Chnh sa tn ca solution t firstApp thnh day1 cho c ngha. Xem cu trc th mc ca solution sau khi thay i.

2. Thm mt project vo solution ny bng menu lnh File Add New project . Tng t nh cch to mi project bi thc hnh trc, chn th loi project l Console Application. t tn cho project mi l modular. 3. Quan st cu trc cy th mc ca solution trong ca s Solution Explorer v c trong Windows Explorer. rng, trong ca s Solution Explorer, project firstApp c t m. iu ny c ngha, firstApp ng vai tr l Startup

Bi tp thc hnh Chuyn Visual Studio .NET

project. Khi nhn Ctrl + F5 th project ny s c gi thc thi ch khng phi l project modular m ta mi to ra. Trong ca s Solution Explorer, nhp phi chut ln modular. Trong menu hin ra, chn menu lnh Set as Startup project thit lp li startup project cho solution. 4. Vic nhp n, tnh n! ri in kt qu bn hon ton c th thc hin c bng cc cu lnh n gin. Tuy nhin, tng tnh r rng v ti s dng, bn nn to ra mt phng thc h tr vic tnh ton n!. Xem m lnh bn di

5. Chy th chng trnh xem kt qu. Hy rng, khai bo phng thc giaiThua l static long giaiThua(int n). Th xa static trong khai bo ny ri chy li chng trnh. Li nhn c cho bit ch cc phng thc static mi c triu gi, s dng ln nhau 6. Bng cch to ra phng thc long giaiThua() nh trn, chng ta c th gii quyt c vn tnh Ckn mt cch d dng. Li gi tnh C kn nh sau: GiaiThua(n)/(GiaiThua(n-k)*GiaiThua(k)) 7. Hay tao ra mt phng thc tinh t hp chp k cua n phn t (ban t quyt inh cac tham s va kiu d liu tra v).

Bi tp thc hnh Chuyn Visual Studio .NET

Bi thc hnh 1.3. To th vin s dng chung Tm tt Trong thc t, mt ng dng c th l c kh nng thc thi (executable) hoc ch n thun l th vin cha cc chc nng, lp i tng. Bi thc hnh ny hng dn bn to th vin cha cc phng thc thng dng. Vi mc ch minh ha, th vin ny ch cha 2 hm tin ch gip tnh giai tha v t hp chp. Sau khi bin dch, bn s c c mt file nh vi phn m rng l DLL. Th vin ny, khi cn, s c tham chiu n trong cc ng dng khc. K thut c trnh by - To loi ng dng loi th vin Trnh t thc hin 1. To mi mt project, t tn l commonUtils (common utilities - cc tin ch dng chung). Ch chn loi ng dng cn to l Class Library 2. Mc nh Visual Studio 2005 s to ra trong namespace CommonUtils mt lp tn l Class1. i tn lp ny li thnh Math. Sau ci t cc phng thc nh sau:

3. R rng, y khng phi l mt chng trnh chy nh cc ng dng bn vit trc - class Math khng c phng thc static public Main() tc l bn khng th nhn Ctrl + F5 chy chng trnh. Bin dch project ny bng menu lnh Build Build commonUtils. Kt qu, bn s c mt th vin commonUtils.dll trong th mc bin\Release hoc bin\Debug ca project ty

Bi tp thc hnh Chuyn Visual Studio .NET

theo cch chn ch bin dch. Th vin ny s c dng tham chiu n trong cc ng dng cn n. M rng B sung cc phng thc thng dng khc vo th vin, chng hn nh phng thc xc nh xem mt s c phi l nguyn t hay khng, phng thc hon i gi tr ca hai s cho trc,

Bi tp thc hnh Chuyn Visual Studio .NET

10

Bai thc hanh 1.4. Tam giac Pascal Tm tt Vit chng trinh nhp mt s nguyn N t ban phim, sau o in ra man hinh N dong u tin cua tam giac Pascal. K thut c trnh by - S dng th vin c sn Trnh t thc hin 1. To mi mt ng dng kiu Console Application. t tn project l pascalTriangle1 2. Thc hin b sung tham kho n th vin commonUtils bng cch: Nhp phi chut vo project pascalTriangle1 trong ca s Solution Explorer Trong menu hin ra, chn Add Reference

Trong tab Browse ca hp thoi Add Reference, tm n th vin commonUtils.dll to ra trc . D thy rng th vin c tham kho n khng ch c dng DLL m c th c cc dng khc, bao gm EXE, OCX,

Bi tp thc hnh Chuyn Visual Studio .NET

11

3. Hon thin phn m ngun c s dng tham chiu n th vin va b sung nh hnh di:

M rng Hy t rt ra nhng ghi ch cn thit v vic: Khai bo phng thc C(int n, int k) trong commonUtils l public static long C(int n, int k) static, public y c ngha g, c th thay th hoc b i? Tng t cho phng thc giaiThua(int n); Ti sao trong qu trnh s dng phng thc C() li phi ghi y l commonUtils.Math.C()? Ch cn ghi Math.C() c c khng?

Bi tp thc hnh Chuyn Visual Studio .NET

12

Bai thc hanh 1.5. Tam giac Pascal array version Tm tt S dng array xy dng tam gic Pascal nh Bi thc hnh 1.4. K thut c trnh by - S dung array Trnh t thc hin 1. To mi mt project kiu Console Application vi tn l pascalTriangle2
2. S dng cc tnh cht C00 = Ckk = 1, Cnk = Cn-1k-1 + Cn-1k , ta s xy dng mt

jagged array t nh n ln. Chi tit nh phn m ngun pha di:

M rng C th dng array nhiu chiu trong trng hp ny khng? Nu c th c s khc nhau no so vi dng jagged array?

Bi tp thc hnh Chuyn Visual Studio .NET

13

Bai thc hanh 1.6. MyTYPE Tm tt Vit chng trinh in ni dung vn ban ra man hinh (nh lnh TYPE Ms DOS). Tn file c truyn theo tham s dong lnh. K thut c trnh by - S dng tham s dng lnh c truyn vo S dng namespace System.IO c ni dung tp tin

Trnh t thc hin 1. To mi mt projecet kiu Console Application vi tn myTYPE 2. Khai bo s dng thm namespace System.IO ri hon thin phn m ngun nh minh ha di

M rng - Cch kim tra s tn ti ca tp tin trc khi c v hin th n nh trn an ton cha? C trng hp no m s tn ti ca tp tin li cha m bo cho vic c v hin th n? Gii quyt bng cch no? Thm phn kim tra s lng tham s truyn vo dng lnh chng trnh c th hot ng chnh xc hn (s dng args.Length) S dng MSDN tm hiu thm cc lp khc trong namespace System.IO

Bi tp thc hnh Chuyn Visual Studio .NET

14

Bai thc hanh 1.7. Quan ly sinh vin Tm tt Vit chng trnh qun l sinh vin cua mt trng. Sinh vin c th hc cac chuyn nganh Cng ngh Thng tin, Vt l, Ng vn. Mi chuyn nganh tng ng c cac mn hc khc nhau. Sinh vin khoa Cng ngh Thng tin phi hc 3 mn Pascal, C# v SQL. Sinh vin khoa Vt l phi hc 4 mn: C hc, in hc, Quang hc, Vt l ht nhn. Sinh vin khoa Vn phi hc 2 mn Vn hc c in v Vn hc Hin i Chng trnh cho php nhp danh sch sinh vin, sau in danh sch sinh vin cng vi im trung bnh ca h ra mn hnh. In ra danh sch nhng sinh vin c im trung bnh cao trn 5.0 ra mn hnh. Thng tin hin th c dng H tn, Chuyn nganh ao tao, im trung bnh. K thut c trnh by - Truy xut tp tin c nh dng cho trc S dng mt phng thc ca lp String Cc k thut hng i tng c s dng trong bi ton thc t

Trnh t thc hin 1. Trc khi tin hnh ci t, ta kho st qua s lp c s dng. Vi nhng m t kh r rng trong yu cu bi ton, ta c c ci nhn tng quan v cc lp nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

15

Lu rng, phng thc dtb() c ci t l virtual chng ta c th override mt cch c th, chi tit hn trong cc lp k tha t class SinhVien. Phng thc ToString() c ci t override t lp object s dng trong vic in ni dung ca i tng. 2. To mi mt project kiu Console Application vi tn l studentManager 3. Ti cy phn cp Solution Explorer nhp phi chut v chn Add New Item Trong hp thoi hin ra, chn to mi class SinhVien.cs

Bi tp thc hnh Chuyn Visual Studio .NET

16

4. Ci t cc thnh phn c bn cho lp SinhVien

Bi tp thc hnh Chuyn Visual Studio .NET

17

5. B sung thm cc class SinhVienCNTT, SinhVienVan, SinhVienVL theo phn tch thit k lp t trc. Di y l phn m t ci t cho lp SinhVienVan. Hai lp cn li SinhVienCNTT, SinhVienVL c ci t mt cch tng t.

Bi tp thc hnh Chuyn Visual Studio .NET

18

6. Trong phn chng trnh (tp tin Program.cs) chng ta thc hin yu cu bi ton nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

19

Yu cu thm - In ra 3 sinh vin c im trung bnh cao nht trng. Chnh sa ngi s dng c th nhp danh sch m khng bit trc s lng sinh vin (s dng vng lp while, do, ) Chnh sa c th nhp d liu cc sinh vin t file.

Bi tp thc hnh Chuyn Visual Studio .NET

20

PHN 2 L P TRINH NH NG NG DUNG NG VI WINFORMS


Phn nay keo dai trong 2 bui. Cac bai thc hanh nay se c gii thiu nh la ni dung c ban nht ma sinh vin cn nm. Cac ky thut khac sinh vin t tham khao va trao i vi lp. Bi thc hnh 2.1 helloWinForms Tm tt Chng trnh K thut c trnh by - Cu trc ca v c ch hot ng ca mt project Windows Form Application. C ch x l s kin ca cc Control trong mt Windows Form Mt s phng thc, thuc tnh, s kin quan trng ca cc iu khin trong mt Windows Form.

Trnh t thc hin 1. To mi mt ng dng kiu Windows Form Application vi tn l 01-helloWindowsForm nh hnh v

Bi tp thc hnh Chuyn Visual Studio .NET

21

2. Theo mc nh, mt solution vi mt project c to ra. Project ny c mt lp Form1. Kho st ni dung ca project trong Windows Explorer, chng ta s thy cu trc ca th mc v cc tp tin tng t nh hnh di:

C th thy, mi Form c to ra tng ng vi 3 tp tin c tip u ng l ging nhau, ly v d l Form1 Form1.Designer.cs: cha cc m lnh do Form Designer t sinh ra tng ng vi cc thao tc do ngi s dng ko th cc Control t ToolBox vo b mt Form hay thc hin cc thit lp i vi cc Control.

Bi tp thc hnh Chuyn Visual Studio .NET

22

Form1.cs: cha phn m lnh v khai bo thm do ngi s dng ci t. Form1.resx: cha cc m t, khai bo v cc ti nguyn c s dng trong Form. 3. Chng ta cng c th quan st cu trc ca solution hay project bng cch kho st ca s Solution Explorer:

4. T ca s Solution Explorer, i tn tp tin Form1.cs thnh FormMain.cs. rng, c ba tp tin lin quan n Form1 u c thay i theo mt cch ng b. 5. Thit k giao din cho FormMain nh hnh v

Bi tp thc hnh Chuyn Visual Studio .NET

23

6. Bc tip theo, chng ta s thc hin ci t phng thc x l s kin Click ca nt bm btnCurrentTime: a. Chn iu khin nt bm btnCurrentTime trong ca s thit k Form. b. trang Event trong ca s Properties Windows, nhp p chut vo s kin Click (xem hnh v di). Form Designer s sinh ra phng thc x l s kin c tn mc nh l btnCurrentTime_Click(). (Phng thc x l s kin c mc nh t tn l <tniuKhin>_<TnSKin>)

Son tho phn m lnh cho phng thc ny nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

24

7. Thc hin chy chng trnh, khi nhn vo nt bm btnCurrentTime, mt hp thng bo c hin th ra nh hnh v

8. Thc ra chng ta c th t t tn cho phng thc x l s kin. Chng hn, ci t phng thc x l s kin MouseEnter cho nt bm btnCurrentTime, trong ca s Properties trang Events, tm n mc MouseEnter v: a. Nhp vo tn phng thc x l s kin: btn_MouseEnter b. Nhn Enter c. FormDesigner s to ra phng thc vi tn tng ng

Bi tp thc hnh Chuyn Visual Studio .NET

25

d. Tin hnh ci t m lnh cho phng thc x l s kin trn nh sau: private void btn_MouseEnter(object sender, EventArgs e) { btnCurrentTime.ForeColor = Color.Red; } 9. Tng t, chng ta ci t tip phng thc x l s kin MouseLeave cho nt bm btnCurrentTime nh sau private void btn_MouseLeave(object sender, EventArgs e) { btnCurrentTime.ForeColor = SystemColors.ControlText; } 10. Chy chng trnh v quan st kt qu: iu khin nt bm btnCurrentTime s c hiu ng mouse hover kh n tng: khi r con tr chut vo nt bm btnCurrentTime, mu ch ca n s i sang mu ; mu ch ca nt bm tr thnh bnh thng (mu ControlText) khi con tr chut r ra khi nt bm. 11. tm hiu k hn bn cht ca vic gn kt phng thc x l s kin, chng ta nhp p chut vo FormMain.Designer.cs trong ca s Solution Explorer xem phn ni dung c sinh ra bi Form Designer:

Bi tp thc hnh Chuyn Visual Studio .NET

26

Ch nhng phn c t sng trong hnh v ni trn; t suy ra c bn cht ca vic gn kt phng thc x l s kin trong khi thit k.

Bi tp thc hnh Chuyn Visual Studio .NET

27

12. ng file ni dung FormMain.Designer.cs li. Cc bc tip theo s minh ha cch thc dng chung mt phng thc x l s kin cho nhiu i tng khc nhau. 13. Trong ca s thit k ca FormMain, thc hin a. Chn c hai i tng btnClose v btnAbout b. Trong trang Events ca ca s Properties, g tn phng thc x l s kin Click cho c hai iu khin nt bm ny l btnTask_Click ri nhn Enter (xem hnh v)

14. Thc hin ci t m lnh cho phng thc ny nh sau: private void btnTask_Click(object sender, EventArgs e) { if (sender == btnClose) this.Close(); else if (sender == btnAbout)1 MessageBox.Show("Day la chuong trinh minh hoa", "Thong bao"); } Trong phng thc trn, chng ta s dng i s sender nhn bit iu khin no pht sinh s kin. Chng ta cng c th thc hin nh th ny:
1

Thc ra khng nht thit phi c nhnh else if, ch cn else l , bi v y chng ta ch p dng phng thc ny cho hai iu khin btnClose v btnAbout!.

Bi tp thc hnh Chuyn Visual Studio .NET

28

private void btnTask_Click(object sender, EventArgs e) { string stTask = (sender as Button).Text; 2 if (stTask == "Close") this.Close(); else if (stTask == "About") MessageBox.Show("Day la chuong trinh minh hoa", "Thong bao"); } 15. By gi, chng ta tinh chnh thm chng trnh h tr hiu ng mouse hover cho tt c cc iu khin trong form: a. Sa li phn m ngun cho 2 phng thc x l s kin btn_MouseEnter v btn_MouseLeave nh sau: private void btn_MouseEnter(object sender, EventArgs e) { (sender as Control).ForeColor = Color.Red; } private void btn_MouseLeave(object sender, EventArgs e) { (sender as Control).ForeColor = SystemColors.ControlText; } b. Trong phn FormDesigner, chn tt c cc i tng trn b mt Form. c. Trong ca s Properties, chn phng thc x l s kin MouseLeave cho tt c cc i tng ang chn l btn_MouseLeave (xem hnh v)

Php chuyn kiu (sender as Button) trong cu lnh ny l thnh cng v c btnClose v btnAbout u l cc iu khin kiu Button

Bi tp thc hnh Chuyn Visual Studio .NET

29

d. Lm tng t gn phng thc x l s kin MouseEnter cho tt c cc iu khin ni trn l btn_Enter. e. Chy chng trnh xem hiu ng: khi r con tr chut qua cc iu khin, font ch ca chng s c i thnh mu . 16. Trong bc 11, chng ta bit c cch thc a mt thnh phn iu khin vo giao din ca mt Windows Form thng qua m lnh (bng cch tm hiu phn m sinh ra bi Form Designer). By gi, chng ta s p dng thc hin thm cc iu khin vo Form v gn phng thc x l s kin cho chng trong thi gian thc thi chng trnh a. B sung vo Form mt nt bm btnCreateButton

b. Ci t phng thc x l s kin Click cho nt bm ny nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

30

c. Chy chng trnh v quan st kt qu.

Bi tp thc hnh Chuyn Visual Studio .NET

31

M rng - Hy tm hiu ngha ca vic ci t m lnh bc 15.a: (sender as Control). C th s dng php p kiu no khc khng? Ti sao? iu chnh trong giao din chng trnh, trong c mt s iu khin (Label, TextBox, RadioButton, CheckBox hoc Button) s dng mu khc vi mu mc nh (l SystemColors.ControlText). Khi , hiu ng mouse hover hot ng khng ng na. Hy chnh sa chng trnh khc phc pht sinh ny.

Bi tp thc hnh Chuyn Visual Studio .NET

32

Bi thc hnh 2.2 usingControls Tm tt Xy dng chng trnh in thng tin c nhn nh minh ha

K thut c trnh by - Gii thiu mt ng dng WinForms c bn Cch thc lu file vi ni dung ting Vit Cc thnh phn iu khin c bn: Button, Label, TextBox, PictureBox, Timer, Np mt nh t file

Trnh t thc hin 1. To mi mt project loi Windows Application, t tn l usingControls 2. Theo mc nh, mt lp Form1 c sinh ra. Chnh sa cc thuc tnh ca Form1 vi cc gi tr nh bng di: Thuc tnh Name Text FormBorderStyl e MaximizeBox Gi tr FormMain Hello WinForms FixedSingle False Tiu ca ca s Kch thc ca ca s s khng c thay i khi chy chng trnh V hiu ha nt Maximize ca ca s Ghi ch

Bi tp thc hnh Chuyn Visual Studio .NET

33

Ch rng, nhng thuc tnh c thay i gi tr so vi mc nh s c hin th trong ca s Properties di dng ch in m 3. Thit k giao din ca form nh minh ha. Lu , vi mi iu khin bn a vo form, nu d nh truy xut n trong phn m ngun khi lp trnh th hy t tn n thay v nh tn mc nh.

Chnh sa thuc tnh ca mt s i tng nh sau: iu khin dtpDOB txtOther lblInfo picImage lblName tmrScroll Thuc tnh Format CustomFormat Enable Font SizeMode BackColor Interval Gi tr Custom dd/MM/yyyy False Chn font thch hp, in m StretchImage Transparent (Web) 120

4. Nhn Ctrl + S lu ni dung project. Do chng ta c s dng k t ting Vit trong Form nn Visual Studio c hin th hp thoi yu cu ch nh bng m lu k t:

Bi tp thc hnh Chuyn Visual Studio .NET

34

Nhn nt Save With Other Encoding chn bng m thch hp sau bn c th chn cch lu theo UTF8 nh hnh di (cng c th chn ty chn Unicode Codepage 1200):

5. Ci t phn m lnh cho s kin Click ca nt bm btnSelectImage nh sau:

Khi ngi s dng nhn vo nt ny, mt hp thoi s hin ra cho php chn nh. Ch cc tp tin c phn m rng l BMP, JPG, GIF mi c hin th la chn. iu ny c thit lp thng qua thuc tnh Filter ca i tng dlgOpen (thuc lp OpenFileDialog).

Bi tp thc hnh Chuyn Visual Studio .NET

35

6. Khi ngi s dng g tn ca h vo txtName th ni dung ca lblName cng thay i theo. Mun vy, ta ci t m lnh cho s kin TextChanged ca txtName nh (1) xem minh ha code di 7. i tng txtOther ch c s dng (Enabled) khi m chkOther c check vo, do ta cng ci t m lnh cho s kin CheckChanged ca chkOther nh (2) 8. Khi nhn nt Cp nht th ni dung ca lblInfo c cp nht theo nh phn m lnh ci t cho s kin Click ca btnUpdate (3) 9. Ngi s dng c th bt tt ch cun ni dung dng ch lblInfo bng cch nhn chut vo n. Ci t m lnh cho s kin Click ca lblInfo nh (5) 10. cun ni dung dng ch, ci t m lnh cho s kin Tick ca tmrScroll nh (4)

Bi tp thc hnh Chuyn Visual Studio .NET

36

Bi thc hnh 2.3 textFormat Tm tt Xy dng chng trnh th hin nh dng cho on vn bn tnh (Label) K thut c trnh by - Cch s dng Font, FontStyle trong ng dng Windows Form Truy xut cc thnh phn d liu gia cc Form S dng ca s dng Dialog trong chng trnh

Trnh t thc hin 1. To mi mt ng dng loi Windows Applications, t tn l textFormat 2. Theo mc nh, mt lp Form1 c sinh ra. Chnh sa cc thuc tnh ca Form1 vi cc thuc tnh gi tr nh hnh di: Thuc tnh Name Text FormBorderStyl e MaximizeBox Gi tr FormMain Text formartting FixedSingle False Tiu ca ca s Kch thc ca ca s s khng c thay i khi chy chng trnh V hiu ha nt Maximize ca ca s Ghi ch

Ch rng, nhng thuc tnh c thay i gi tr so vi mc nh s c hin th trong ca s Properties di dng ch in m 3. Thit k giao din cho FormMain nh hnh di y

STT Thuc tnh 1 2 3 Name Name Name Text

Gi tr lblAdvert pnlAdvert btnChangeText ChangeText

Ghi ch Label Panel Button

Bi tp thc hnh Chuyn Visual Studio .NET

37

Name Text

btnClose Close

Button

4. B sung vo Project thm mt WindowForm bng cch chn menu lnh Project Add Windows Forms

Chn tn file ca Windows Form cn to l FormSettings.cs nh hnh rn. 5. Thit k giao din cho FormSettings va c to ra nh hnh di.

Trnh t t cc iu khin vo form c th thc hin nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

38

iu khin TextBox t tn l txtAdvert. iu khin Frame vi thuc tnh Text l Format 4 CheckBox c tn l chkB, chkI, chkU, chkS vi thuc tnh Text c thit lp tng ng l Bold, Italic, Underline v Strike out 4 RadioButton c tn l rbRed, rbGreen, rbBlue, rbYellow vi thuc tnh Text c thit lp tng ng vi 4 tn mu Red, Green, Blue v Yellow 3 nt bm btnOK, btnApply, btnCancel. Sau thit lp thuc tnh DialogResult ca cc nt bm btnOK, btnCancel ln lt l OK v Cancel

6. Tin hnh ci t m lnh cho nt bm btnChangeText FormMain nh sau: private void btnChangeText_Click(object sender, EventArgs e) { FormSettings frm = new FormSettings(); if (frm.ShowDialog() == DialogResult.OK) { lblAdvert.Text = Youve clicked at OK button!; } } 7. Thc hin chy chng trnh v quan st kt qu. rng, vi vic thit lp thuc tnh DialogResult cho 2 nt bm btnOK v btnCancel nh bc 5 trn, chng ta khng cn ci t m lnh cho 2 nt ny m vn c hiu ng frm (mt th hin ca FormSettings) b ng khi mt trong 2 nt ny c nhn. Hn na, chng ta s bit c ngi s dng nhn vo nt no bng cch kim tra kt qu ca hm frm.ShowDialog() nh trn.

Bi tp thc hnh Chuyn Visual Studio .NET

39

Trong Bc tip theo, chng ta s lm cho hai form s tng tc d liu c vi nhau trong thi gian thc thi. 8. Trong FormMain, to ra mt thuc tnh AdvertText kiu string nh sau: public string AdvertText { get { return lblAdvert.Text; } set { lblAdvert.Text = value; } } 9. Trong FormSettings, chng ta thm khai bo bin thnh phn v sa li phng thc khi dng ca lp: public partial class FormSettings: Form { FormMain formMain; public FormSettings(FormMain frmMain) { InitializeComponent(); this.formMain = frmMain; } private void FormSettings_Load(object sender, EventArgs e) { this.txtAdvert.Text = formMain.AdvertText; } ..... ..... } 10. Ci t phng thc x l s kin Click ca nt bm btnApply nh sau public void btnApply_Click(object sender, EventArgs e) { formMain.AdvertText = this.txtAdvert.Text; } rng, bn phi chnh sa modifier ca phng thc bntApply_Click thnh public thay v private nh FormDesigner sinh ra theo mc nh. iu ny cho

Bi tp thc hnh Chuyn Visual Studio .NET

40

php phng thc ny c th c triu gi t ngoi lp FormSettings nh bc 11 di y. 11. Chnh sa li phng thc x l s kin Click ca nt bm btnChangeText FormMain nh sau: private void btnChangeText_Click(object sender, EventArgs e) { FormSettings frm = new FormSettings(this); if (frm.ShowDialog() == DialogResult.OK) { frm.btnApply_Click(null, null); } } 12. Chy th chng trnh v quan st kt qu. Tm li, chng ta thc hin nhng bc sau y c th thay i d liu t 2 form: a. To property (AdvertText) c modifier kiu public cho phn d liu mun truy xut (lblAdvert.Text) b. Tm cch truyn tham chiu ca form cha property ni trn (FormMain) n form mun truy xut (FormSettings) 13. Tip theo, chng ta s to ra property tn AdvertForeColor c kiu Color trong lp FormMain thc hin thay i mu sc ca lblAdvert: public Color AdvertForeColor { get { return lblAdvert.ForeColor; } set { lblAdvert.ForeColor = value; } } 14. Cp nht li phng thc x l s kin Click ca nt bm btnApply v s kin Load trong lp FormSettings: private void FormSettings_Load(object sender, EventArgs e) { this.txtAdvert.Text = formMain.AdvertText; rbRed.Checked = formMain.AdvertForeColor == Color.Red; rbGreen.Checked = formMain.AdvertForeColor == Color.Green; rbBlue.Checked = formMain.AdvertForeColor == Color.Blue; rbYellow.Checked = formMain.AdvertForeColor == Color.Yellow; }

Bi tp thc hnh Chuyn Visual Studio .NET

41

public void btnApply_Click(object sender, EventArgs e) { formMain.AdvertText = this.txtAdvert.Text; if (rbRed.Checked) formMain.AdvertForeColor = Color.Red; else if (rbGreen.Checked) formMain.AdvertForeColor = Color.Green; else if (rbBlue.Checked) formMain.AdvertForeColor = Color.Blue; else formMain.AdvertForeColor = Color.Yellow; } 15. Nh vy, trong cc bc trn, chng ta to ra mt property kiu Color v ng b ha n vi 4 iu khin RadioButton. Nhng bc tip theo chng ta to ra thm mt property khc thay i nh dng font ch cho lblAdvert. Trc ht, chng ta cn bit a. Cc thuc tnh nh Bold, Italic, .. ca lblAdvert.Font l ch c. Th nn khng th thc hin php gn thay i lblAdvert.Font.Bold c b. Vic thay i tnh cht Bold, Italic, ca mt i tng Font c thc hin bng cch to mi i tng Font (tham kho thm MSDN bit 13 hm np chng khi to mt i tng Font) c. Mt trong cc hm np chng kh n gin m chng ta c th s dng to mt i tng Font c c php l:

Trong , family s l tn font, emSize l kch c font, style l kiu font. Gi tr ca style s l s tng hp theo php ton or ca cc gi tr FontStyle.Bold, FontStyle.Italic, FontStyle.Underline v FontStyle.Strikeout. 16. To property AdvertFontFormat trong lp FormMain nh sau: public bool[] AdvertFontFormat { get { Font f = lblAdvert.Font; return (new bool[] {f.Bold, f.Italic, f.Underline, f.Strikeout}); } set { if (value.Length == 4) { FontStyle fs = FontStyle.Regular;
Bi tp thc hnh Chuyn Visual Studio .NET 42

if (value[0]) fs = fs | FontStyle.Bold; if (value[1]) fs = fs | FontStyle.Italic; if (value[2]) fs = fs | FontStyle.Underline; if (value[3]) fs = fs | FontStyle.Strikeout; lblAdvert.Font = new Font(lblAdvert.Font.Name, lblAdvert.Font.Size, fs); } } } Property AdvertFontFormat c kiu d liu l mt mng bool gm 4 phn t m th t ca chng s tng ng biu din tnh cht Bold, Italic, Underline v Strikeout ca mt FontStyle. 17. Tip n, chng ta s cp nht cc phng thc cn thit trong lp FormSettings s dng thuc tnh AdvertFontFormat va to nh sau: private void FormSettings_Load(object sender, EventArgs e) { this.txtAdvert.Text = formMain.AdvertText; rbRed.Checked = formMain.AdvertForeColor == Color.Red; rbGreen.Checked = formMain.AdvertForeColor == Color.Green; rbBlue.Checked = formMain.AdvertForeColor == Color.Blue; rbYellow.Checked = formMain.AdvertForeColor == Color.Yellow; this.chkB.Checked = formMain.AdvertFontFormat[0]; this.chkI.Checked = formMain.AdvertFontFormat[1]; this.chkU.Checked = formMain.AdvertFontFormat[2]; this.chkS.Checked = formMain.AdvertFontFormat[3]; } public void btnApply_Click(object sender, EventArgs e) { formMain.AdvertText = this.txtAdvert.Text; if (rbRed.Checked) formMain.AdvertForeColor = Color.Red; else if (rbGreen.Checked) formMain.AdvertForeColor = Color.Green; else if (rbBlue.Checked) formMain.AdvertForeColor = Color.Blue; else formMain.AdvertForeColor = Color.Yellow;

Bi tp thc hnh Chuyn Visual Studio .NET

43

formMain.AdvertFontFormat = new bool[] { chkB.Checked, chkI.Checked, chkU.Checked, chkS.Checked }; } 18. Chy chng trnh xem kt qu. M rng - Qua qu trnh ci t, c th thy, Form Designer ca Visual Studio .NET khng h tr vic to mng iu khin ging nh Visual Basic. Tuy nhin, chng ta c th m phng mng iu khin bng cch to ra cc Property hoc l Indexer nh x n cc iu khin.

Bi tp thc hnh Chuyn Visual Studio .NET

44

Bai thc hanh 2.4 myCalculator Tm tt Xy dng chng trnh m phng mt my tnh in t n gin. K thut c trnh by: - Xy dng ng dng GUI vi WinForms Cch thc ci t, gn kt, x l events vi mt thnh phn giao din To hiu ng transparent vi Form

Trnh t thc hin 1. To mi mt project loi Windows Application, t tn l myCalculator 2. Theo mc nh, mt lp Form1 c sinh ra. Chnh sa cc thuc tnh ca Form1 vi cc gi tr nh bn di: Thuc tnh Name Text FormBorderStyl e MaximizeBox Gi tr FormMain my Calculator FixedSingle False Tiu ca ca s Kch thc ca ca s s khng c thay i khi chy chng trnh V hiu ha nt Maximize ca ca s Ghi ch

3. To giao din cho chng trnh nh hnh minh ha

Sau khi to ra c giao din vi cc iu khin c v tr, kch thc hp l, bn nn c nh chng. Thc hin iu ny bng cch nhp phi chut ln b mt ca FormMain, trong menu hin ra, chn Lock Controls. iu chnh cc thuc tnh ca i tng mn hnh hin th nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

45

i tng Mn hnh hin th

Thuc tnh Name Text Font ReadOnly TextAlign

Gi tr txtScreen 0 Chn font thch hp True Right

4. Trc khi bt tay vo vit m lnh, bn phi hnh dung cch thc lm vic ca chng trnh cng nh vic chun b cc kiu i tng, d liu. Giao din ca chng trnh ch l cc nt bm v mn hnh hin th kt qu. Do ch l my tnh n gin nn chng trnh ch h tr cc php tnh 2 ngi c bn. C th phn bit nt bm thuc cc nhm: (1) Nt bm ch s 0, 1, , 9, k hiu du chm thp phn, nt o du, nt xa tri xc nh hai ton hng tham gia vo php tnh. (2) Nt bm php tnh +, -, x, / xc nh php tnh (3) Nt Enter kch hot vic thc hin php tnh v hin th kt qu (4) Nt C khi to mt php ton mi Trnh t cc bc s dng ca my tnh thng thng nh sau: Ngi s dng nhp vo s th nht, xc nh php ton, sau nhp vo s th hai, cui cng nhn du = Khi nim nhp vo y c ngha l ngi s dng dng lin tip cc nt bm thuc nhm (1). Ch rng du chm thp phn ch xut hin 1 ln trong 1 s hng. Vic xc nh php ton c th xc nh nhiu ln gia hai ln nhp hai s hng. Tm li, khi ngi s dng nhn mt nt bm trong nhm (1), ta lun bit c anh ta ang nhp s liu cho s hng no: nu cha xc nh php ton th c ngha anh ta ang nhp cho s th nht, ngc li th ang nhp cho s th hai. iu khc na cn phi tnh n, l lu tr d liu nh th no? Trong bi ton ny, vic s dng string lu tr cc s hng l hp l cho vic nhp s. Php tnh s c lu tr bng mt k t. 5. Ngay trong u phn m ngun partial class FormMain: Form, b sung khai bo cc bin a. stNum1, stNum2 kiu string i din cho hai chui s hng. b. op kiu char i din cho php ton (op l vit tt ca operator) 6. Ci t phn m lnh cho s kin FormLoad v s kin click ca nt C nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

46

7. Cc nt bm trong nhm (1) c ci t phn m lnh tng ng vi s kin click nh sau:

8. Phng thc x l s kin click ca nt bm thuc nhm (2) xc nh php tnh

9. Cui cng, phng thc x l s kin click ca nt bm = c ci t nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

47

10. n y, cc tnh nng c bn ca my tnh c ci t. Chng ta kho st thm mt s hiu ng c bit ca lp i tng Form: a. Thit lp thuc tnh TopMost bng True trong thi gian thc thi, ca s chng trnh lun lun ni. b. B sung phng thc x l s kin Activated v Deactive cho FormMain. Hai s kin ny c kch hot tng ng khi ngi dng chuyn focus t vo ng dng (Activated) hay ra khi ng dng (Deactive)

c. Minh ha khi chy chng trnh: khi ngi s dng chuyn focus ra khi ca s ng dng, ca s ny s b m i 50%.

Bi tp thc hnh Chuyn Visual Studio .NET

48

M rng - Ci t thm cc tnh nng khc cho my tnh, chng hn h tr php tnh 1 ngi nh cn bc 2, nghch o, phn trm, Ch phn x l li (v d nh chia cho 0, cn bc hai vi s m) H tr ngi s dng c th nhp d liu bng bn phm.

Bi tp thc hnh Chuyn Visual Studio .NET

49

Bai thc hanh 2.5 myNotePAD Tm tt Chng trnh c cc chc nng c bn ca mt chng trnh son tho vn bn n gin (nh Ms Windows NotePAD): To mi, Son tho, Lu ln a, M t a. Chng trnh cng cho php ngi s dng thit lp cc cu hnh ph nh: font ch th hin (loi font, kch thc, mu sc, ...). K thut c trnh by - S dung menu Xy dng ng dung vi nhiu form Ly danh sch font h thng Cach lin h gia cac i tng thanh phn thuc cac form, module khac nhau

Trnh t thc hin 1. To mi mt project kiu Windows Application, t tn l myNotePAD 2. i thuc tnh Name ca form thnh FormMain 3. B sung cc thnh phn StatusBarStrip, MenuStrip vi cc menu lnh nh minh ha.

4. B sung thm thnh phn TextBox vi tn gi l txtDoc. Thit lp cc thuc tnh ca txtDoc nh sau: Thuc tnh Multiline Dock Gi tr True Fill

Bi tp thc hnh Chuyn Visual Studio .NET

50

5. Khai bo mt bin fileName kiu string u phn m t lp. Bin ny s lu tn file ang c son tho. Sau ci t phng thc x l s kin cho tt c cc ToolStripMenuItem nh sau:

Phn x l cho else if (stTask == Configuration) s c ci t sau.

Bi tp thc hnh Chuyn Visual Studio .NET

51

Ch rng thuc tnh Text ca cc ToolStripMenuItem c s dng vit cc cu lnh if trn. Vy nn, bn phi nh chnh xc cc thuc tnh Text ca chng vit m lnh ng. Thc ra, bn c th vit ring r cho tng phng thc x l s kin Click ca tng ToolStripMenuItem, tuy nhin theo kin ca ring ngi vit gio trnh ny, cch gp chung nh trn gip bn tp trung m lnh hn. 6. Bc tip theo chng ta ci t phn m lnh cho php ngi s dng thay i font hin th ti liu: B sung mt Form vo project bng cch nhn t hp phm Ctrl + Shift + A. Mt hp thoi nh sau hin ra:

Chn loi i tng cn thm l Windows Form, g tn file l FormConfig.cs ri nhn Add. Sau thao tc ny, Visual Studio s to ra mt file trong c khai bo lp FormConfig (trng tn vi tn file m bn cung cp). Nu mun, chng ta c th i tn lp ca form ny. 7. FormConfig s lm nhim v hin th danh sch cc fonts hin c trong h thng ngi s dng chn. Thit k giao din ca FormConfig nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

52

D kin, khi form ny bt u np n s hin th danh sch tt c cc fonts ang c ci t trong h thng vo lstFonts. Font ang c s dng txtDoc ( FormMain) s c t sng trong lstFonts. Cui cng, khi ngi s dng nhn nt OK, font c chn trong lstFonts s c s dng cho txtDoc. Nh vy, c s s dng bin thnh phn gia hai forms: FormMain v FormConfig.

8. Trc ht, thit lp thuc tnh DialogResult ca hai nt OK v Cancel l OK v Cancel. C th thit lp thm cc thuc tnh Anchor ca cc i tng c giao din hp l. 9. Thit lp thuc tnh Modifiers ca lstFonts l Public. Bng cch ny, chng ta c th truy xut n thnh phn lstFonts t bn ngoi. 10. B sung bin thnh phn stFontName kiu string vo khai bo FormConfig, xem (1). 11. Sa phng thc khi dng ca lp FormConfig nh (2). 12. Vit m cho phng thc x l s kin Load ca form nh (3).

13. Hon thin phn gi FormConfig FormMain nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

53

M rng - Ci t thm cc chc nng thng dng khc i vi ng dng son tho vn bn Sa li ng dng theo giao din MDI

Bi tp thc hnh Chuyn Visual Studio .NET

54

Bai thc hanh 2.6 Quan ly sinh vin - WinForms version Tm tt Thc hin lai chng trinh quan ly sinh vin nh bai thc hanh 1.7 nhng giao tip vi ngi s dung thng qua giao din Windows.

Chng trnh c th to mi, m v lu tp tin cha d liu v cc sinh vin c nh dng nh v d sau: Nguyn Vn Trung|True|1981/10/25 00:00:00|9|10|10 Trnh Phng|False|1984/11/20 00:00:00|4|9 Trn Vn Phc|True|1999/10/01 00:00:00|6|6.5|6.5|8 ng Phng Nam|True|1991/10/25 00:00:00|2|10 Trnh Phng Lan|False|1994/11/20 00:00:00|2|9 Theo nh dng lu ny, mi dng thng tin s cha cc thng tin H tn, Gii tnh, Ngy sinh, sau l cc ct im. Nu c 3 (tng ng 2, 4) ct im th sinh vin thuc chuyn ngnh CNTT (tng ng Vn, Vt l). (Xem li Bi thc hnh 1.7 bit thm v m t thng tin sinh vin). Khi ngi s dng chn mt sinh vin trong danh sch (danh sch ny ch hin th tn sinh vin) th cc thng tin chi tit v sinh vin ny s c hin th v cho php chnh sa tng ng (xem hnh v). Ch rng, ty theo chuyn ngnh ca sinh vin, tn cc mn hc s c hin th mt cch hp l.

Bi tp thc hnh Chuyn Visual Studio .NET

55

K thut c trnh by - S dng k thut hng i tng trn ng dng GUI Truy xut file c nh dng quy c sn

Trnh t thc hin 1. To form c giao din nh minh ha. t tn cc thnh phn cho hp l

2. Thit k cc lp i tng sinh vin nh s lp c m t di. Cc phng thc, thuc tnh ca cc lp ny c xy dng trong cc bi thc hnh trc, y ta ch tho lun thm v hm ToFormatText() cc lp:

Bi tp thc hnh Chuyn Visual Studio .NET

56

Trong lp SinhVien, c t hm ny nh l mt hm o v khng cho s dng trc tip t th hin thuc lp SinhVien nh sau:

i vi lp SinhVienCNTT, hm ny c override li thnh:

Tng t, i vi lp SinhVienVan v SinhVienVL, hm ny ln lt c ci t nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

57

3. X l s kin m file d liu, np vo listBox: o B sung bin thnh phn fileName cha tn file d liu o B sung thm phng thc void updateFormTitle() o Thm s kin Click cho nt Open nh sau:

Ch rng, cc lp SinhVienVan, SinhVienCNTT, SinhVienVL u phi override hm ToString() c hin th ngn gn trong hp danh sch. 4. X l s kin to mi file d liu

Bi tp thc hnh Chuyn Visual Studio .NET

58

a. Thm phng thc x l s kin Click ca nt New

b. Gn phng thc x l s kin ny cho s kin Load ca Form 5. Khi ngi s dng chn 1 sinh vin trong lstSinhVien, thng tin chi tit v sinh vin ny s c hin th. Vit phng thc x l s kin SelectedIndexChanged ca lstSinhVien nh sau:

6. Vit phng thc x l s kin Click ca nt Cp nht, Xa v B cp nht nh (1), (2), (3):

Bi tp thc hnh Chuyn Visual Studio .NET

59

7. Ci t phng thc x l s kin Click cho 4 nt |<, <, >, >| nh sau:

8. Tip n, ci t phng thc x l s kin Click ca nt bm Save v Save as

Bi tp thc hnh Chuyn Visual Studio .NET

60

M rng - Thm phn x l li cho chng trnh B sung chc nng To mi Sinh vin

Bi tp thc hnh Chuyn Visual Studio .NET

61

Bai thc hanh 2.7 myFileViewer Tm tt Trong bi thc hnh ny, bn s c tip cn mt s k thut nng cao nh: k tha form, thnh phn iu khin TreeView, ListView, ... ng dng cui cng c to ra s l ng dng qun l tp tin kiu ACDSee.

K thut c trnh by - Tha k form Lm quen vi cc component, cc th vin nng cao

Trnh t thc hin 1. To mi mt ng dng kiu Windows Application vi tn l fileViewer. t tn cho form chnh l FormMain. 2. Thit k giao din ban u cho FormMain nh hnh v. Khi chy chng trnh, vng bn tay tri s hin th cy th mc (i tng tvwDirs). Mi khi chn 1 th mc cy, ni dung ca n c hin th lvwItems bn phi. Ngay pha di tvwDirs l vng preview ni dung ca file c chn trong lvwItems.

Bi tp thc hnh Chuyn Visual Studio .NET

62

3. Thm vo Form mt i tng ImageList c tn l imageList1 vi cc nh nh hnh di:

4. Gn imageList1 cho thuc tnh ImageList ca tvwDirs v lvItems. 5. Vit m lnh cho s kin Load ca FormMain nh (1)

Bi tp thc hnh Chuyn Visual Studio .NET

63

Trc ht, ly danh sch cc a ca h thng. ng vi mi a nh vy, ta s thm tt c cc th mc con cp 1 ca a (hy gii thch?) bng cch gi phng thc (2). rng (2) s c gi quy. 6. Khi ngi dng nhn vo du + ca mt node trn treeview m nhnh ny ra, ta phi hin th c tt c cc th mc con ca n. Vic ny c chun b qua phng thc x l s kin BeforeExpand ca treeview tvwDirs:

7. Khi ngi s dng chn mt node trn cy th ni dung ca th mc tng ng (bao gm tt c th mc v files cha trong n) s c hin th trong listview lvItems. thun tin cho nhng thao tc khc sau ny ca ng dng, chng ta quy c, trong lvItems, phn t i din cho file s c ImageIndex l 2, cn phn t i din cho th mc s c ImageIndex l 0. Chng ta x l s kin AfterSelect ca tvwDirs nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

64

Ch rng, ngoi cc th mc v tp tin, ta thm vo mt th mc c bit, th mc .. i din cho th mc cha ca th mc hin ti. 8. Tip n, chng ta vit m cho s kin nhn p chut vo mt phn t trong listview. C 3 kh nng xy ra: (1) ngi s dng nhn p vo phn t l th mc .. chuyn n th mc trn cp ca th mc hin ti (2) ngi s dng nhn p vo phn t th mc bnh thng chn th mc lm th mc hin ti (3) ngi s dng nhn p vo phn t l mt file hin th ni dung ca file ny ra mt ca s ring mt cch thch hp theo ni dung ca n. Trong phn code di y, ta ch quan tm n 2 kh nng u. Kh nng cn li s c hon thin cc bc sau.

Bi tp thc hnh Chuyn Visual Studio .NET

65

9. Tip theo, ta s ci t thm chc nng Preview ni dung ca phn t file nh ang c chn trong listview lvItems. S kin SelectedIndexChanged ca lvItems c x l nh sau:

10. Phn cn li ca bi thc hnh s hng dn bn ci t phn x l kh nng (3) trong bc 8. Gi s rng, ng dng ca chng ta ch h tr hin th ra ca s 2 loi ni dung: nh v vn bn. Nh th, hin th mi loi ni dung, chng ta cn 1 loi form khc nhau. Tuy th, c hai loi form ny cng c mt s thuc tnh v hnh vi chung. Ta xc nh mi quan h ca chng qua s lp nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

66

To mi mt Form hin th ni dung file nh sau:

11. Thit k giao din cho FormFile nh sau: o t mt Panel tn pnlButtons neo pha di Form (Dock = Bottom). o Trn pnlButtons, t nt btnClose vo v tr thch hp. o C th trang tr thm cho pnlButtons, v d t mt Label trong n nh hnh minh ha. o Phn trng cn li ca form d kin s dng hin th ni dung ca file.

Bi tp thc hnh Chuyn Visual Studio .NET

67

12. Ci t m lnh cho form nh sau o Ci t phng thc x l s kin Click ca nt btnClose (1) o B sung thm hm virtual showContent() vo lp (2). D kin hm ny s lm nhim v hin th ni dung ca file: ty theo file nh hay file vn bn m c cch hin th khc nhau, nhng thao tc chung nht l hin th ng dn ca file ln tiu ca s.

13. Lu v Build ng dng. (rt quan trng cho cc bc sau!) 14. By gi, ta b sung thm mt Windows Form vo project. Tuy nhin khc vi cc lp ca s ta b sung trc , ln ny ta s b sung mt Windows Form k tha t mt lp ta thit k. C th l FormFileImage k tha t FormFile.

Bi tp thc hnh Chuyn Visual Studio .NET

68

15. Visual Studio s hin th hp thoi hi lp m FormFileImage c k tha:

Chn FormFile lm Form k tha ri nhn OK 16. FormFileImage c to ra vi giao din nh di y:

Bi tp thc hnh Chuyn Visual Studio .NET

69

, cc thnh phn c k tha s t lp cha c mi tn nh bn gc tri. Hn na, nhng thnh phn thuc loi Private th s c thm biu tng kha, bn khng th thay i thuc tnh ca n trong lp k tha. V d, nu mun chnh sa thuc tnh Text ca nt btnClose trong FormFileImage, bn phi thit lp btnClose FormFile thuc loi Protected hoc Public. 17. By gi, b sung thm mt PictureBox c tn l pic vo FormFileImage. Thit lp thuc tnh Dock ca n l Fill. Xem hnh minh ha

18. Trong phn m lnh cho FormFileImage, ta override hm showContent nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

70

19. Tng t nh cc bc to FormFileImage, ta to thm mt Windows Form c tn l FormFileText k tha t FormFile c giao din v phn ci t m lnh nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

71

20. Cui cng, ta hon chnh chc nng (3) m t Bc 8 bng cch sa li phng thc x l s kin DoubleClick ca lvItems nh sau:

M rng - B sung thm chc nng preview cho file vn bn Ci t chc nng cho cc menu

Bi tp thc hnh Chuyn Visual Studio .NET

72

PHN 3 X LY D LIU VI ADO.NET


X l d liu l nhim v ph bin v quan trng ca nhiu chng trnh ng dng. D liu c truy xut, x l ca mt chng trnh ng dng c th l mt tp tin vn bn, tp tin cc bn ghi, hay l mt ngun d liu t CSDL no . .NET Framework cung cp mt lng ln cc thnh phn giao din (Win Forms, Web Forms) h tr cho vic trnh by, kt buc (bind) d liu. Cng vi l nn tng x l d liu ADO.NET cung cp cch thc lm vic vi nhiu loi ngun d liu khc nhau mt cch linh ng. Do tnh cht quan trng ca vic x l d liu trong mt ng dng cng vi s phc tp ca ADO.NET, trc khi bt tay vo thc hin cc bi tp thc hnh, chng ta kho st qua mt s im l thuyt c bn. Kin thc c bn v ADO.NET 2.0 3.1 Kin trc tng quan ca ADO.NET Kin trc ca ADO.NET c m t nh hnh di, bao gm hai thnh phn chnh: Thnh phn truy cp ngun d liu v thnh phn lu tr x l d liu.

Thnh phn th nht:.NET Framework Data Provider c thit k thc hin cc thao tc kt ni, gi cc lnh x l n CSDL (thnh phn ny cn c gi vi mt tn khc l lp kt ni Connectectivity Layer). Trong ADO.NET, c 4 i tng chnh vi cc chc nng c bn nh sau: Connection: gip thc hin kt ni n cc CSDL

Bi tp thc hnh Chuyn Visual Studio .NET

73

Command: gip truy cp n CSDL v thc hin cc pht biu SQL hay th tc lu tr sn (stored procedure) ca CSDL DataReader: dng c nhanh ngun d liu, ch c duyt tun t theo chiu tin ca cc record DataAdapter: dng chuyn d liu truy vn c cho cc i tng lu tr v x l (DataSet, DataTable). DataAdapter ch yu thc hin cc thao tc nh SELECT, INSERT, UPDATE, DELETE V mt thc cht, thnh phn .NET Framework Data Provider cung cp giao din lp trnh chung lm vic vi cc ngun d liu. Mi nh cung cp 3 c th s a ra mt loi data provider ring. Di y l bng m t giao din lp trnh cng vi cc lp c bn ca cc data provider m ADO.NET cung cp sn:
Interface IDbConnection IDbDataAdapter IDbCommand IDbDataReader SQL Server Provider SqlConnection SqlDataAdapter SqlCommand SqlDataReader Oracle Provider OracleConnection OracleDataAdapter OracleCommand OracleDataReader OLEDB Provider OledbConnection OledbDataAdapter OledbCommand OledbDataReader ODBC Provider OdbcConnection OdbcDataAdapter OdbcCommand OdbcDataReader

s dng data provider no, chng ta phi tin hnh khi bo using namspace tng ng. Chng hn, using System.Data.SqlClient; Ngoi nhng data provider m t bng trn, chng ta c th reference n cc data provider khc khng c tch hp sn bi ADO.NET trong Visual Studio .NET, chng hn nh data provider dng cho MySQL, Postgre, Thnh phn th hai trong kin trc ADO.NET DataSet c xem nh l container dng lu tr i tng lin quan n d liu nh DataTable, DataRelation, DataView. Thnh phn ny cn c gi l lp khng kt ni (disconected layer). DataSet nh l mt CSDL thu nh ti my client, c th cha cc i tng table, view, constaint, ralationship gia cc table, Tt c d liu t ngun d liu thc s c np vo DataSet di dng cc DataTable, l mt snapshot ca ngun d liu thc. Khi d liu ny s c chnh sa c lp, sau nu cn s c cp nht tr li ngun d liu thc. Theo nguyn tc ny, chng ta khng cn duy tr kt ni lin tc mt cch khng cn thit vi ngun d liu thc trong sut qu trnh thao tc vi n.

Nh cung cp y c hiu theo ngha c v loi ngun d liu ln cch thc truy xut ngun d liu. V d, ngoi data provider SqlClient do Microsoft cung cp, cng c th c mt t chc khc pht trin mt provider khc truy xut loi ngun d liu ny.

Bi tp thc hnh Chuyn Visual Studio .NET

74

3.2 Tng quan v cc m hnh x l d liu trong ADO.NET: M hnh Kt ni (Connected Model) v M hnh Ngt Kt ni (Disconnected Model) 3.2.1 M hnh Kt ni Trong m hnh kt ni ca ADO.NET, c mt connection hot ng c duy tr gia i tng DataReader ca ng dng v mt data source (ngun d liu). Mt dng d liu (data row) c tr v t data source mi khi phng thc Read ca i tng DataReader c thc thi. im quan trng nht ca m hnh kt ni l d liu c ly t tp d liu (cc record c tr v bi mt lnh SQL no ) theo kiu tng record mt cho mt ln c, ch c (read-only), v ch theo mt hng tin (forward-only). Hnh di y m t cch s dng DataReader trong ch kt ni.

Cc bc in hnh lm vic vi i tng DataReader l nh sau: 1. To i tng Connection bng cch truyn mt chui Connection string cho hm khi dng ca n. 2. Khi to mt bin chui v gn cho cu lnh SQL da theo d liu mun np v. 3. Khi to mt i tng Command t vi ni dung cu lnh SQL xc nh trn. 4. To i tng DataReader bng cch thc thi phng thc Command.ExecuteReader(). i tng ny sau s c dng c kt qu ca cu truy vn mi dng mt ln. on code sau minh ha cc bc trn vi Data Provider SqlClient. on code s c danh sch h tn cc sinh vin trong mt bng SinhVien ca c s d liu v hin th ln mt iu khin ListBox. Chi tit v cc i tng DataReader, Command, Connection s c cp chi tit sau. using System.Data.SqlClient; ... // (1) Tao Connection SqlConnection cn = new SqlConnection(chuoiKetNoi); cn.Open();

Bi tp thc hnh Chuyn Visual Studio .NET

75

// (2) Chuoi SQL thuc hien lay danh sach ten cac sinh vien xep tang dan theo NgaySinh string sql = "SELECT HoTen FROM SinhVien ORDER BY NgaySinh"; // (3) Tao doi tuong Command SqlCommand cmd = new SqlCommand(sql, conn); DbDataReader rdr; // (4) Tao doi tuong DataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); while (rdr.Read()) listBox1.Items.Add(rdr["HoTen"]); // Fill ListBox rdr.Close(); // Dong datareader sau khi da su dung xong Tham s c s dng trong phng thc ExecuteReader xc nh i tng Connection s c ng sau khi DataReader c ng. 3.2.2 M hnh Ngt Kt ni Trit l ca m hnh Ngt kt ni l: D liu c np s dng mt lnh SQL t ngun d liu bn ngoi vo b nh m ti my client; tp kt qu c x l ti my cc b; mi cp nht sau s c truyn t d liu trong b nh ngc tr li ngun d liu. M hnh c gi l ngt kt ni bi v i tng kt ni ch c m lu c d liu t ngun d liu v tin hnh cc thao tc cp nht. Bng cch a d liu v pha my client, ti nguyn ca server chng hn nh thng tin d liu Connection, b nh, thi gian x l s c gii phng bt. Tuy vy, m hnh ny cng c nhc im v thi gian cn np tp d liu v b nh dng cha d liu ti my client. Nh hnh di y minh ha, cc thnh phn chnh ca m hnh ngt kt ni l DataApdapter v DataSet. DataAdapter lm nhim v nh l cu ni gia ngun d liu v DataSet, np d liu vo cc bng ca DataSet v y cc thay i ngc tr li ngun d liu. Mt DataSet ng vai tr nh l mt c s d liu quan h nm trong b nh, cha mt hay nhiu DataTables, gia cc DataTable ny cng c th c cc mi quan h vi nhau nh trong mt c s d liu quan h thc. Mt DataTable cha cc dng v cc ct d liu thng c ly t c s d liu ngun.

Bi tp thc hnh Chuyn Visual Studio .NET

76

Trong s cc phng thc v thuc tnh ca DataAdapter th Fill() v Update() l hai phng thc quan trng nht. Fill() chuyn mt query n c s d liu v lu tp kt qu tr v trong mt DataTable no ; phng thc Update() thc hin mt thao tc thm, xa, cp nht da trn nhng thay i ca i tng DataSet. Cc lnh cp nht thc s c cha trong cc thuc tnh ca DataAdapter. Chi tit v DataAdapter s c cp phn sau. minh ha cch thc lm vic vi DataAdapter v DataSet, on code di y gii thiu cch to ra mt i tng DataTable, np d liu t mt c s d liu, v a n vo mt DataSet. string sql = "SELECT MaSinhVien, HoTen, NgaySinh FROM SinhVien"; string connStr = "Data Source=MYSERVER;Initial Catalog=qlsinhvien; User Id=k28;Password=k28;"; // (1) Tao doi tuong data adapter SqlDataAdapter da = new SqlDataAdapter(sql, connStr); // (2) Tao doi tuong dataset DataSet ds = new DataSet(); // (3) Tao mot Table co ten SinhVien trong dataset va nap du lieu cho no da.Fill(ds, "SinhVien"); // (4) Hien thi danh sach ten sinh vien ra list box DataTable dt = ds.Tables["SinhVien"]; for (int i=0; i< dt.Rows.Count;i++) { DataRow row = dt.Rows[i]; listBox1.Items.Add(row["HoTen"]); } Bc u tin l to ra mt th hin ca SqlDataAdapter bng cch truyn mt cu lnh SELECT v chui kt ni cho phng thc khi dng ca lp ny. DataAdapter s lo n vic to ra i tng Connection cng nh vic m, ng Connection khi cn thit. Sau khi mt DataSet rng s c to ra, phng thc Fill()

Bi tp thc hnh Chuyn Visual Studio .NET

77

ca DataAdapter s to ra mt DataTable c tn l SinhVien trong DataSet v np cc dng d liu vo DataTable ny (bng cu ln SQL dng SELECT ca DataAdapter). Mi column ca DataTable s tng ng vi mt column trong bng ca c s d liu ngun. D liu trong bng d liu sau c a vo mt ListBox bng cch duyt qua danh sch cc dng ca DataTable. 3.3 Lm vic vi m hnh Kt ni trong ADO.NET Nh m t tng quan trong phn trc, m hnh Kt ni c da trn vic thit lp mt Connection n CSDL v sau s dng cc Command thc hin vic thm, xa, sa, hay c d liu t data source (ngun d liu) c kt ni. c im phn bit ca m hnh ny l cc Command c pht sinh, lm vic vi data source thng qua mt Connection ang hot ng Connection ny s m cho n khi cc thao tc c hon tt. Cho d l lm vic vi m hnh Kt ni hay Ngt kt ni, bc u tin trong qu trnh truy xut mt data source l to ra mt i tng Connection lm ng truyn gia ng dng vi data source. 3.3.1 Lp Connection C nhiu lp Connection trong ADO.NET mi lp tng ng vi mt Data Provider bao gm SqlConnection, OracleConnection, OleDbConnection, OdbcConnection. Mc d mi lp c th gm nhng c tnh ring, nhng cc lp ny u phi implement interface IDbConnection. Bng di y tm tt cc thnh phn c nh ngha bi interface ny. Loi Tn M t Property ConnectionString Get/Sets chui kt ni n data source. Property ConnectionTimeout Khong thi gian ti a tnh bng giy ch thc hin vic kt ni n data source Property Database Tn CSDL ng vi Connection hin ti Property State Trng thi hin ti ca Connection. Tr v mt gi tr kiu lit k (enumeration): Broken, Closed, Connecting, Executing, Fetching, hoc Open Method Open M mt Connection. Roll back mi thao tc ang Close lm d. ng Connection tr Connection cho Connection Pool nu nh c s dng Connection Pool Method BeginTransaction Khi to mt database transaction Method ChangeDatabase Thay i CSDL hin ti cho Connection ang m. Chui m t tn CSDL mi c truyn cho phng thc ny Method CreateCommand To ra mt i tng Command ng vi Connection

Bi tp thc hnh Chuyn Visual Studio .NET

78

3.3.1.1 Connection string Thuc tnh ConnectionString xc nh data source v cc thng tin cn thit truy xut data source, chng hn nh User ID v Password, Ngoi nhng thng tin c bn ny, Connection string cn c th cha cc gi tr cho cc trng d liu c trng cho data provider. V d, Connection string cho Ms Sql Server c th cha cc gi tr quy nh Connection Timeout v Packet Size. Di y l cc v d v cch thnh lp chui kt ni cho cc data provider thng gp. Danh sch y v cch thnh lp cc chui kt ni c cho Ph lc A. SqlConnection s dng c ch xc thc kiu SQL Server: server=;database=;uid=;pwd= hoc Data Source=;Initial Catalog=;User ID=;Password= SqlConnection s dng c ch xc thc kiu Windows: Server=;Database=;Trusted_Connection=yes y, l tn/my ch cha CSDL, l tn CSDL, l tn ng nhp, l mt khu tng ng. V
server=192.168.0.1;database=qlnhanvien;uid=k28;pwd=spider Server=192.168.0.1;Database=qlnhanvien;Trusted_Connection=yes

d:

hoc

OleDbConnection s dng kt ni CSDL Access phin bn trc 2003: Provider=Microsoft.Jet.OLEDB.4.0;DataSource= V d:


o string stConnection =

string.Format(Provider=Microsoft.Jet.OLEDB.4.0;DataSource={0}, @c:\program files\qlnhanvien.mdb); o S dng trong ng dng Internet: string stConnection =


string.Format(Provider=Microsoft.Jet.OLEDB.4.0;DataSource={0}, Server.MapPath(/data/qlnhanvien.mdb);

ODBC: DSN= vi l Data Source Name (DSN), v d DSN=qlnhanvien Cc Connection string c dng to ra i tng Connection. Cch thc hin thng thng l truyn chui ny cho hm khi dng nh v d di y:

Bi tp thc hnh Chuyn Visual Studio .NET

79

string stConnection = "Data Source=192.168.0.1; + Initial Catalog=films; + User Id=k28;+ Password=spider"; SqlConnection cn = new SqlConnection(stConnection); cn.Open(); //Open connection 3.3.1.2 Connection Pooling To mt Connection l mt qu trnh tn nhiu thi gian trong mt s trng hp, vic ny thm ch cn tn thi gian hn vic thc thi cc Command. loi b iu ny, ADO.NET cung cp mt khi nim gi l connection pool. Connection pool qun l cc Connection c trng Connection string ti u ha s ln thit lp, hp l ha thng tin kt ni. Cc quy tc quy nh connection pool cn bit:
-

C ch Connection pooling c kch hot theo mc nh. C ch ny c tt bng cch thm vo Connection string Pooling=false i vi SqlConnection hoc OLE DB Services=-4 i vi OleDbConnection. Mi connection pool c ng vi mt connection string duy nht. Khi c mt Connection c yu cu, pool handler (b qun l pool) s so snh connection string vi nhng connection string trong cc pools ang tn ti. Nu c mt Connection trng khp th Connection tng ng s c xc nh trong pool. Nu tt c cc connection trong pool ang c s dng khi li c yu cu v connection th yu cu s c xp vo hng i cho n khi c mt connection rnh. Cc connection s c gii phng khi phng thc Close hay Dispose ca i tng connection c gi. Connection pool c ng khi tt c cc connection trong n c gii phng v ht thi gian (time out).

i vi SQL Server, bn c th iu khin hnh vi ca conneciton pooling bng cch gp cc cp key-value vo connection string. Cc key ny c th c s dng thit lp s lng nh nht v ln nht cc connection trong pool cng nh xc nh xem mt connection c cn phi reset khi n c ly t pool ra hay khng. Mt key c bit ch l key c tn Lifetime, xc nh thi gian m connection c th tn ti trc khi n b hy b. Gi tr ny c kim tra khi mt connection c tr v cho pool. Nu connection c m trc , v lu hn gi tr Lifetime th n s b hy. on code di y minh ha cc dng cc key ny cho SqlClient:

Bi tp thc hnh Chuyn Visual Studio .NET

80

string stConnection = "Server=192.168.0.1; + Trusted_Connection=yes; + database=qlnhanvien;" + "connection reset=false;" + "connection Lifetime=60;" + // Seconds "min pool size=1;" + "max pool size=50"; // Default=100 SqlConnection cn = new SqlConnection(cnString); 3.3.2 i tng Command Sau khi mt i tng connection c to ra, bc tip theo trong qu trnh truy xut CSDL i vi m hnh Kt ni l to ra mt i tng Command gi mt query (select) hay mt action command (thm, xa, sa) n data source. C nhiu loi lp Command ng vi cc data provider; cc lp ny u implement interface IDbCommand. 3.3.2.1 To i tng Command Bn c th dng mt trong nhiu hm khi dng to i tng Command mt cch trc tip hoc s dng cch tip cn ProviderFactory. on code di y minh ha cc to ra mt i tng Command v thit lp cc thuc tnh ca n. SqlConnection conn = new SqlConnection(connstr); conn.open(); string sql = "INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES (@pMaSinhVien, @pHoTen)"; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.commandText = sql; cmd.Parameters.AddWithValue ("@pMaSinhVien", 12); cmd.Parameters.AddWithValue ("@pHoTen", "tnv spider"); Trong trng hp ng dng c th phi s dng nhiu data provider, bn nn s dng cch tip cn provider factory. Factory c to ra bng cch truyn chui data provider cho hm khi dng ca n. Tip n, phng thc CreateCommand c gi tr v mt i tng command. string provider = "System.Data.SqlClient";
Bi tp thc hnh Chuyn Visual Studio .NET 81

DBProviderFactory factory = DbProviderFactories.GetFactory(provider); DbCommand cmd = factory.CreateCommand(); // DbCommand l mt lp tru tng cmd.CommandText = sql; // sql l mt chui query hay command

cmd.Connection = conn; // conn l mt Connection 3.3.2.2 Thc thi mt Command Lnh SQL c gn trong thuc tnh CommandText ca i tng Command s c thc thi bng mt trong cc phng thc c ch ra bng di y Phng thc ExecuteNonQuery M t Thc thi truy vn hnh ng (action query) v tr v s lng dng d liu b nh hng bi truy vn : cmd.CommandText = "DELETE SinhVien WHERE MaSinhVien=12"; int soLuong = cmd.ExecuteNonQuery(); ExecuteReader Thc thi mt query v tr v i tng DataReader c th truy cp tp kt qu ca query . Phng thc ny nhn mt tham s ty chn kiu CommandBehavior c th tng hiu nng thc thi query. cmd.CommandText = "SELECT * FROM SinhVien + WHERE YEAR(NgaySinh) > 1981; SqlDataReader rdr= cmd.ExecuteReader(); ExecuteScalar Thc thi mt query v tr v gi tr ca ct u tin trong dng u tin ca tp kt qu. cmd.CommandText="SELECT COUNT(MaSinhVien) FROM SinhVien"; int soSinhVien = (int)cmd.ExecuteScalar(); ExecuteXmlReade r Ch c cho data provider SQL Server. Tr v mt i tng XmlReader dng truy xut tp d liu. Tham kho thng tin v XmlReader trong MSDN

Bi tp thc hnh Chuyn Visual Studio .NET

82

ExecuteReader l phng thc quan trng nht trong cc phng thc k trn. Phng thc ny tr v mt i tng DataReader gip truy xut n cc dng d liu tr v bi query. Xem v d di y: dr = cmd.ExecuteReader(sql, ); y, l mt gi tr kiu CommandBehavior ch nh behavior (hnh vi) thc thi ca query. Mt s data providers s dng ti u qu trnh thc thi query. Danh sch cc gi tr v tc dng ca tham s c m t chi tit nh di y:

SingleRow. Ch nh rng query ch tr v 1 dng d liu. Behavior mc nh l tr v nhiu tp kt qu. SingleResult. Query tr v mt gi tr tuyn tnh n nht (single scalar value). KeyInfo. Tr v thng tin v column v primary key. Behavior ny c s dng vi phng thc GetSchema ca DataReader ly thng tin v cc column trong lc (schema). SchemaOnly. Dng ly v tn ca cc ct trong tp d liu tr v: V d dr = cmd.ExecuteReader(CommandBehavior.SchemaOnly); string col1 = dr.GetName(0); // tn ct u tin

SequentialAccess. Cho php d liu trong dng tr v c th c truy xut tun t theo column. Behavior ny c dng cho cc trng d liu BLOB hay TEXT. CloseConnection. ng connection khi DataReader c ng.

3.3.2.3 Thc thi Stored Procedure (th tc lu tr sn) vi i tng Command Mt stored procedure l mt on code SQL c lu sn trong CSDL v c th c thc thi nh l mt script. ADO.NET h tr vic thc thi cc stored procedure cho cc data provider OleDb , SqlClient, ODBC, v OracleClient. Cc bc thc thi mt stored procedure: Thit lp thuc tnh SqlCommand.CommandText thnh tn ca procedure; Thit lp thuc tnh CommandType l CommandType.StoredProcedure; Thit lp cc Parameter (nu c) cho procedure Thc thi phng thc ExecuteNonQuery.

Th tc di y cho php cc mu tin ly v t bng SinhVien c phn thnh tng nhm cc trang, mi trang 10 record. u vo ca ca procedure l @pTrang (s hiu

Bi tp thc hnh Chuyn Visual Studio .NET

83

trang cn ly); u ra ca procedure l s trang tng cng ca tp d liu. on code minh ha pha di thc hin vic thit lp ly v trang d liu u tin. SqlCommand cmd = new SqlCommand(); cmd.CommandText = "spListSinhVien"; // tn procedure cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(@pTrang", SqlDbType.Int); cmd.Parameters.Add(@pTongSoTrang", SqlDbType.Int); cmd.Parameters[0].Direction= ParameterDirection.Input; cmd.Parameters[0].Value= 1; // thit lp ly v trang u tin cmd.Parameters[1].Direction=ParameterDirection.Output; cmd.CommandTimeout=10; // Cho command ti a 10s thc thi SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { // x l tp d liu y } dr.Close(); // DataReader phi c ng trc khi c tham s u ra int tongSoTrang = cmd.Parameters[1].Value; V d ny s dng data provider SqlClient. C th chnh sa mt phn nh th n cng c th hot ng vi OleDb. im khc bit mu cht gia SqlClient v OleDb l cch qun l cc parameter. SqlClient yu cu tn parameter phi ng vi tn parameter ca stored procedure; trong khi OleDb li truyn cc parameter cho stored procedure da vo v tr, v vy tn parameter l khng quan trng. Nu procedure tr v gi tr kt qu, OleDb phi thit k parameter u tin trong danh sch lm nhim v ny. Vi SqlClient, chng ta ch cn thm mt parameter vi mt tn no v xc nh hng tr v (direction) ca parameter ny l Return Value. Phn code ca stored procedure l nh sau: CREATE PROCEDURE spListSinhVien @pTrang int, @pTongSoTrang int output

Bi tp thc hnh Chuyn Visual Studio .NET

84

AS /* Th tc tr v mt tp kt qu gm cc SinhVien xp theo HoTen. Tp kt qu c phn thnh cc trang, mi trang 10 SinhVien. */ SET NOCOUNT ON SELECT @pSoTrang = CEILING(COUNT(*)/10) FROM SinhVien if @pTrang = 1 or @pTrang <1 begin SELECT TOP MaSinhVien, HoTen FROM SinhVien ORDER BY HoTen set @pTrang = 1 return 0 end if @pTrang > @pTongSoTrang begin SET @pTrang = @pTongSoTrang declare @RowCount int set @RowCount = (@pTrang * 10)

exec ( 'SELECT * FROM ( SELECT TOP 10 a.* FROM ( SELECT TOP ' + @RowCount + ' * FROM SinhVien ORDER BY HoTen )a ORDER BY HoTen desc )b ORDER BY HoTen' ) return 0 end

Bi tp thc hnh Chuyn Visual Studio .NET

85

3.3.2.4 S dung Parameter trong cac Command khng phai la Stored Procedures Trong cac query c thnh lp trc tip (ch khng phi l stored procedure nh trn), chung ta cung co th s dng cc Parameter. V d di y minh ha cch thc b sung mt record vo bng SinhVien: string sql = "INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES (@pMaSinhVien, @pHoTen)"; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.commandText = sql; cmd.Parameters.AddWithValue("@pMaSinhVien", 12); cmd.Parameters.AddWithValue("@pHoTen", "tnv spider"); Mt cch khc thc hin vic b sung record nh trn l s dng php ni chui 4 nh th ny: int iMaSinhVien = 12; string stHoTen = "tnv spider"; sql = string.Format(INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES ({0}, {1}), iMaSinhVien, stHoTen); SqlCommand cmd = new SqlCommand(sql, conn); 3.3.3 i tng DataReader Nh thy trong cc v d trc, mt DataReader cho php ly cc dng v ct d liu ca d liu tr v khi thc thi mt query. Vic truy xut dng c nh ngha bi interface IDataRecord. Di y l cc member quan trng ca interface ny. 3.3.3.1 Truy xut cc dng d liu vi DataReader DataReader ly v tng dng n (single row) t mt tp d liu tr v mi khi phng thc Read ca n c thc thi. Nu khng c dng d liu no th phng thc ny tr v gi tr false. DataReader phi c ng sau khi cc thao tc x l cc dng c hon tt gii phng ti nguyn h thng. Bn c th s dng thuc tnh DataReader.IsClosed bit c DataReader c ng hay cha.

Trong thc t, gii php ni chui t khi c s dng v l do an ton d liu. Hy hnh dung trong on code ny, nu stHoTen c gn gi tr l tnv spider); DELETE * FROM SinhVien;--. Khi query c thc thi s l INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES ( 12, tnv spider); DELETE *

FROM SinhVien;--)
L hng kiu ny thng c gi vi tn SQL Injection.

Bi tp thc hnh Chuyn Visual Studio .NET

86

Mc d DataReader l ng vi mt Command n, nhng Command ny li c th cha nhiu query trong , do c th tr v nhiu tp d liu kt qu. on code di y minh ha cch x l cc dng d liu tr v bi 2 query trong mt Command. string q1 = "SELECT * FROM SinhVien WHERE YEAR(NgaySinh) < 1981"; string q2 = "SELECT * FROM SinhVien WHERE YEAR(NgaySinh) > 1990"; cmd.CommandText = q1 + ";" + q2; // hai query c ngn cch nhau bi du ; DbDataReader rdr = cmd.ExecuteReader(); bool readNext = true; while (readNext) { while (rdr.Read()) MessageBox.Show(rdr.GetString(1)); readNext = rdr.NextResult(); // kiem tra xem con tap du lieu nao nua khong } rdr.Close(); conn.Close(); DataReader khng c thuc tnh hay phng thc no cho bit s lng dng d liu tr v trong tp d liu ca n (do c tnh forward-only ca DataReader), tuy nhin, chng ta c th s dng thuc tnh HasRows (kiu Boolean) ca DataReader xc nh xem n c 1 hay nhiu dng c hay khng. 3.3.3.2 Truy xut gi tr ca column C nhiu cch truy xut d liu cha trong cc columns ca dng hin ti ca DataReader: Truy xut nh l mt array dng s th t column (bt u t 0) hoc dng tn column S dng phng thc GetValue bng cch truyn cho phng thc ny s th t ca column S dng mt trong cc phng thc nh kiu GetXXX, bao gm GetString, GetInt32, GetDateTime, GetDouble,

on code di y minh ha cc thc truy xut gi tr d liu ca cc column.

Bi tp thc hnh Chuyn Visual Studio .NET

87

cmd.CommandText = "SELECT MaSinhVien, Hoten, GioiTinh, NgaySinh FROM SinhVien + WHERE YEAR(NgaySinh) = 1981"; dr = cmd.ExecuteReader(); dr.Read(); // Cc cch ly d liu kiu string ct th 2 (HoTen) string stHoTen; stHoTen = dr.GetString(1); stHoTen = (string)dr.GetSqlString(1); // SqlClient provider stHoTen = (string)dr.GetValue(1); stHoTen = (string)dr["HoTen"]; stHoTen = (string)dr[1]; // Ly d liu kiu DateTime ct th 4 (NgaySinh) c kim tra gi tr NULL if (!dr.IsDbNull(3)) DateTime dtNgaySinh = dr.GetDateTime(3); Phng thc GetString c im thun li trong vic nh x ni dung d liu t CSDL sang kiu d liu ca .NET. Cc cch tip cn khc u tr v cc kiu i tng c yu cu php chuyn kiu. V l do ny, bn nn s dng cc phng thc GetXXX cho cc kiu d liu xc nh. Cng lu rng, phng thc GetString khng yu cu php chuyn kiu, nhng bn thn n khng thc hin bt c php chuyn i no; chnh v th, nu d liu l khng ng nh kiu d liu trng i s c Exception c tr ra. Nhiu ng dng ph thuc vo tng x l d liu cung cp DataReader. Vi nhng trng hp nh th, ng dng c th s dng metadata (siu d liu) xc nh tn column, kiu d liu ca column, v cc thng tin khc v column. on code sau y minh ha vic in ra danh sch cc tn v kiu d liu ca cc column m i tng DataReader ang qun l: // In ra danh sch cc tn column ca mt i tng DataReader c tn dr for (int i = 0; i < dr.FieldCount; i++) Console.WriteLine(Column {0} co kieu du lieu {1}, dr.GetName(i), dr.GetDataTypeName(i)); // Column name

Bi tp thc hnh Chuyn Visual Studio .NET

88

C mt cch khc ton din hn qun l ton b thng tin v lc (schema) ca tp d liu kt qu tr v, l s dng phng thc GetSchemaTable. Phng thc ny tr v mt i tng DataTable m mi dng trong DataTable ny s biu din mt column trong tp d liu kt qu. on code di y minh ha cch truy xut tt c cc thng tin v cc column ca mt tp d liu tr v. DataTable schemaTable = dr.GetSchemaTable(); int stt = 0; foreach (DataRow r in schemaTable.Rows) { foreach (DataColumn c in schemaTable.Columns) { Console.WriteLine(stt.ToString() + " " + c.ColumnName + ": " + r[c]); stt++; } } Kt qu hin th: 0 ColumnName: movie_ID 1 ColumnOrdinal: 0 //khng lit k 12 DataType: System.Int32 //khng lit k 3.3.4 V d Gi s ta c c s d liu quanlythuvien trong SQL Server c quan h nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

89

V d v i tng Connection, Command v DataReader Thit k Form to mi 1 ti khon nh sau (lm vic trn bng nhanvien):

ListView1

Frmtaomoitk s dng cc trng, phng thc v s kin sau:

Cc iu khin Tn iu khin Thuc tnh

Bi tp thc hnh Chuyn Visual Studio .NET

90

Form listView

groupBox Label TextBox Button Cc trng: Tn trng Cn cmdSelect cmdInsert cmdXoa I

Name: Frmtaomoitk Text:To mi mt ti khon s dng chng trnh Name:listView1 Columns: Add thm 4 ct: H tn, a ch, Tn ng nhp v Quyn hn View: Details GridLines:True Name:groupBox1 Text: Thng tin c bn To ra 5 label hin th: M nhn vin, H tn, a ch, Tn ng nhp v quyn hn. To ra 4 TextBox ln lt vi cc tn: txtmanv, txthoten, txtdiachi, txttendangnhap To 8 button ln lt vi cc tn butdau, butlui, buttien, butcuoi, buttaomoi, buttimkiem, butxoabo,butthoat ngha Dng kt ni n c s d liu quanlythuvien sqlCommand s dng cu lnh select hin th v tm kim sqlCommand s dng cu lnh Insert to thm 1 ti khon sqlCommand s dng cu lnh Delete xa 1 ti khon Ti khon th i

Cc phng thc + Hm dng Frmtaomoitk to giao din public Frmtaomoitk() { InitializeComponent(); } + Phng thc Moketnoi(): Kim tra ng kt ni, nu ang m th ng li, sau m li ng kt ni private void Moketnoi() { if (cn.State == ConnectionState.Open) cn.Close(); cn.Open(); } + Phng thc LoadListView: Ly d liu ca bng nhanvien np d liu ln listView1. Phng thc ny c gi khi thay i d liu trong bng nhn vin nh nhp thm hoc xa i 1 nhn vin. S dng 2 i tng SqlCommand, SqlDataReader private void LoadListView()

Bi tp thc hnh Chuyn Visual Studio .NET

91

{ Moketnoi(); cmdSelect = new SqlCommand("select * from nhanvien", cn); SqlDataReader r = cmdSelect.ExecuteReader(); listView1.Items.Clear(); // Xa tt c d liu trong listView1 while (r.Read()) { string[] st = new string[5]; st[0] = r[0].ToString(); st[1] = r[1].ToString(); st[2] = r[2].ToString();// Khng hin th mt khu, nn khng c r[3] st[3] = r[4].ToString(); st[4] = r[5].ToString(); ListViewItem lv = new ListViewItem(st); listView1.Items.Add(lv); } cmdSelect.Dispose(); } + Phng thc LoadItem: Ly d liu t dng th i ca listView1 a vo txtmanv, txthoten, txtdiachi, txttendangnhap v comboBox1. Phng thc ny c gi khi di chuyn qua li thng tin ca cc nhn vin. private void LoadItem(int i) { txtmanv.Text = listView1.Items[i].Text; txthoten.Text = listView1.Items[i].SubItems[1].Text; txtdiachi.Text = listView1.Items[i].SubItems[2].Text; txttendangnhap.Text = listView1.Items[i].SubItems[3].Text; comboBox1.Text = listView1.Items[i].SubItems[4].Text; } + Phng thc LoadCombox: a d liu vo cho comboBox1. Gi s ch c 3 quyn hn: admin, sinhvien v Thuthu. Phng thc ny c gi khi va np Form ln private void LoadCombox() { comboBox1.Items.Add("Admin"); comboBox1.Items.Add("Sinhvien"); comboBox1.Items.Add("ThuThu"); comboBox1.Text = "Admin"; }

Bi tp thc hnh Chuyn Visual Studio .NET

92

+ Phng thc XoaTextBox: Xa ht d liu trong cc textBox, phng thc ny c goi khi nhp thm 1 ti khon. private void XoaTextBox() { txtmanv.Clear(); txthoten.Clear(); txtdiachi.Clear(); txttendangnhap.Clear(); txtmanv.Focus(); } + Phng thc KiemTraMa: Kim tra xem c m nhn vin no bng vi ma hay khng. Phng thc ny c gi khi nhp thm 1 ti khon private int KiemTraMa(string ma) { Moketnoi(); cmdSelect = new SqlCommand("select count(*) from nhanvien where manhanvien='"+ma.Trim()+"'"); cmdSelect.Connection = cn; return (int)cmdSelect.ExecuteScalar(); } + S kin Frmtaomoitk_Load: To v m ra ng kt ni n c s d liu quanlythuvien, tn my ch nhha, s dng c ch xc thc kiu Windows, no d liu vo cho cc iu khin. private void Frmtaomoitk_Load(object sender, EventArgs e) { try { cn = new SqlConnection("Data Source=nhha;Initial Catalog=quanlythuvien; Trusted_Connection=yes"); cn.Open(); } catch (Exception loi) { MessageBox.Show("Khng th kt ni c"); } LoadListView(); //Np d liu vo cho listView1 i = 0; LoadItem(i);// Np d liu vo cho cc textBox v comboBox1 LoadCombox(); } + S kin butdau_Click: Np d liu ca dng u tin t listView1 vo cho cc textBox v comboBox private void butdau_Click(object sender, EventArgs e)

Bi tp thc hnh Chuyn Visual Studio .NET

93

{ i = 0; LoadItem(i); } + S kin buttien_Click: Np d liu ca dng tip theo t listView1 vo cho cc textBox v comboBox private void buttien_Click(object sender, EventArgs e) { i++; if (i == listView1.Items.Count) i = listView1.Items.Count - 1; LoadItem(i); } + S kin butlui_Click: private void butlui_Click(object sender, EventArgs e) { i--; if (i < 0) i = 0; LoadItem(i); } + S kin butcuoi_Click: private void butcuoi_Click(object sender, EventArgs e) { i = listView1.Items.Count - 1; LoadItem(i); } + S kin butTaomoi_Click: c s dng thm 1 ti khon (1 nhn vin), nt butTaomoi c 2 trng thi to mi v lu. Nu ngi s dng kch vo nt To mi s chuyn sang trng thi l lu v ngc li. private void butTaomoi_Click(object sender, EventArgs e) { if (butTaomoi.Text.Equals("To mi")) { XoaTextBox(); butTaomoi.Text = "Luu"; } else // Kim tra xem m nhn vin ny c hay cha ? if (KiemTraMa(txtmanv.Text)==1) { MessageBox.Show("M ny c");

Bi tp thc hnh Chuyn Visual Studio .NET

94

txtmanv.Clear(); txtmanv.Focus(); } else { string ma = txtmanv.Text; string hoten = txthoten.Text; string diachi = txtdiachi.Text; string tendangnhap = txttendangnhap.Text; string matkhau = "";// Khi to 1 ti khon th mt khu ban u l rng string quyenhan = comboBox1.Text; Moketnoi(); string sql="insert into nhanvien values("+"'"+ma+"','"+hoten+"','"+diachi +"','" +tendangnhap+"','"+matkhau+"','"+quyenhan +"')"; cmdInsert = new SqlCommand(sql,cn); cmdInsert.ExecuteNonQuery(); MessageBox.Show(" lu thnh cng"); LoadListView(); //Np li d liu mi vo listView1 butTaomoi.Text = "To mi"; cmdInsert.Dispose(); } } + S kin buttimkiem_Click: Khi ngi s dng g 1 m nhn vin vo txtmanv v kch vo nt buttimkiem, nu tm thy m nhn vin ny s hin th kt qu ln cc textBox v comboBox private void buttimkiem_Click(object sender, EventArgs e) { Moketnoi(); string sql = "select * from nhanvien where manhanvien='" + txtmanv.Text + "'"; cmdSelect = new SqlCommand(sql,cn); SqlDataReader dr = cmdSelect.ExecuteReader(); if (dr.Read())// tm thy { txtmanv.Text = dr[0].ToString(); txthoten.Text = dr[1].ToString(); txtdiachi.Text = dr[2].ToString(); txttendangnhap.Text = dr[4].ToString(); comboBox1.Text = dr[5].ToString(); } else MessageBox.Show("Khng tm thy");

Bi tp thc hnh Chuyn Visual Studio .NET

95

} + S kin butXoabo_Click: Xa nhn vin c m nhn vin txtmanv private void butXoabo_Click(object sender, EventArgs e) { DialogResult dr = MessageBox.Show("Chc chn xa hay khng ?", "Thng bo", MessageBoxButtons.YesNo); if (dr == DialogResult.Yes) // Nu ngi s dng chn nt yes { Moketnoi(); string Sql = "delete from nhanvien where manhanvien='" + txtmanv.Text + "'"; cmdXoa = new SqlCommand(Sql,cn); if (cmdXoa.ExecuteNonQuery() == 1) { MessageBox.Show("Xa thnh cng"); LoadListView(); LoadItem(0); } else MessageBox.Show("Khng tn ti m nhn vin " + txtmanv.Text); cmdXoa.Dispose(); } } 3.5 Lm vic vi m hnh Ngt kt ni: DataSet v DataTable M hnh Ngt Kt ni ca ADO.NET da trn c s s dng i tng DataSet nh l mt vng nh m. Mt i tng DataAdapter lm nhim v trung gian gia DataSet v data source (ngun d liu) np d liu vo vng nh m. Sau khi DataAdapter hon thnh nhim v np d liu, n s tr i tng Connection v pool, v th n ngt kt ni khi ngun d liu. 3.4.1 Lp DataSet DataSet ng vai tr ca mt CSDL in-memory (CSDL nm trong b nh). Thuc tnh Tables ca DataSet l mt tp hp cc DataTable cha d liu v lc d liu (data schema) m t d liu trong DataTable. Thuc tnh Relations cha tp hp cc i tng DataRelation xc nh cch thc lin kt cc i tng DataTable ca DataSet. Lp DataSet cng h tr vic sao chp, trn, v xa DataSet thng qua cc phng thc tng ng l Copy, Merge, v Clear. DataSet v DataTable l phn li ca ADO.NET v chng khng l c trng ca mt data provider no (ging nh cc lp Connection, DataReader, DataAdapter). Mt ng dng c th nh ngha v np d liu t ngun bt k (ch khng nht thit l t mt CSDL) vo DataSet.

Bi tp thc hnh Chuyn Visual Studio .NET

96

Bn cnh cc DataTable v cc DataRelation, mt DataSet cn c th cha cc thng tin ty bin khc c nh ngha bi ng dng. Hnh di y m t c lp chnh trong DataSet. Trong s cc thuc tnh ny, ch thuc tnh PropertyCollection; l cc thuc tnh c lu tr di dng mt hash table (bng bm), thng cha mt gi tr time stamp hay cc thng tin c t nh cc yu cu hp l ha (validation requirements) cho column trong cc DataTable trong DataSet.

3.4.1.1 DataTable Thuc tnh DataSet.Tables cha cc i tng DataTable. Mi i tng trong tp hp ny c th c truy xut bng ch s hoc bng tn. Cc DataTable trong tp hp DataSet.DataTables m phng cc Table trong CSDL quan h (cc row, column, ). Cc thuc tnh quan trng nht ca lp DataTable l Columns v Rows nh ngha cu trc v ni dung bng d liu. 3.4.1.2 DataColumn Thuc tnh DataTable.Columns cha mt tp cc i tng DataColumn biu din cc trng d liu trong DataTable. Bng di y tm tt cc thuc tnh quan trng ca lp DataColumn. Phng thc
ColumnName

M t Tn column

Bi tp thc hnh Chuyn Visual Studio .NET

97

Phng thc
DataType

M t Kiu ca d liu cha trong column ny V d: col1.DataType = System.Type.GetType("System.String") di ti a ca mt text column. -1 nu khng xc nh di ti a Cho bit gi tr ca column c c chnh sa hay khng Gi tr Boolean cho bit column ny c c cha gi tr NULL hay khng Gi tr Boolean cho bit column ny c c cha cc gi tr trng nhau hay khng Biu thc nh ngha cch tnh gi tr ca mt column V d: colTax.Expression = "colSales * .085"; Tiu hin th trong thnh phn iu khin giao din ha Tn ca i tng DataTable cha column ny

MaxLength

ReadOnly AllowDBNull

Unique

Expression

Caption DataTable

Cc column ca DataTable c to ra mt cch t ng khi table c np d liu t kt qu ca mt database query hoc t kt qu c c mt file XML. Tuy nhin, chng ta cng c th vit code to ng cc column. on code di y s to ra mt i tng DataTable, sau to thm cc i tng DataColumn, gn gi tr cho cc thuc tnh ca column, v b sung cc DataColumn ny vo DataTable. DataTable tb = new DataTable("DonHang"); DataColumn dCol = new DataColumn("MaSo", Type.GetType("System.Int16")); dCol.Unique = true; // D liu ca cc dng column ny khng c trng nhau dCol.AllowDBNull = false; tb.Columns.Add(dCol); dCol = new DataColumn("DonGia", Type.GetType("System.Decimal")); tb.Columns.Add(dCol); dCol = new DataColumn("SoLuong",Type.GetType("System.Int16")); tb.Columns.Add(dCol);

Bi tp thc hnh Chuyn Visual Studio .NET

98

dCol= new DataColumn("ThanhTien",Type.GetType("System.Decimal")); dCol.Expression= "SoLuong*DonGia"; tb.Columns.Add(dCol); // Lit k danh sch cc Column trong DataTable foreach (DataColumn dc in tb.Columns) { Console.WriteLine(dc.ColumnName); Console.WriteLine(dc.DataType.ToString()); } rng column MaSo c nh ngha cha cc gi tr duy nht. Rng buc ny gip cho column ny c th c dng nh l trng kha thit lp relationship kiu parent-child vi mt bng khc trong DataSet. m t, kha phi l duy nht nh trong trng hp ny hoc c nh ngha nh l mt primary key ca bng. V d di y m t cch xc nh primary key ca bng: DataColumn[] col = {tb.Columns["MaSo"]}; tb.PrimaryKey = col; Nu mt primary key cha nhiu hn 1 column chng hn nh HoDem v Ten bn c th to ra mt rng buc unique constraint trn cc nh v d di y: DataColumn[] cols = {tb.Columns["HoDem"], tb.Columns["Ten"]}; tb.Constraints.Add(new UniqueConstraint("keyHoVaTen", cols)); Chng ta s xem xt cch thc to relationship cho cc bng v trn d liu phn tip theo. 3.4.1.3 DataRows D liu c a vo table bng cch to mi mt i tng DataRow, gn gi tr cho cc column ca n, sau b sung i tng DataRow ny vo tp hp Rows gm cc DataRow ca table. DataRow row; row = tb.NewRow(); // To mi DataRow row["DonGia"] = 22.95; row["SoLuong"] = 2; row["MaSo"] = 12001; tb.Rows.Add(row); // B sung row vo tp Rows

Console.WriteLine(tb.Rows[0]["ThanhTien"].ToString()); // 45.90

Bi tp thc hnh Chuyn Visual Studio .NET

99

Mt DataTable c cc phng thc cho php n c th commit hay roll back cc thay i c to ra i vi table tng ng. thc hin c iu ny, n phi nm gi trng thi ca mi dng d liu bng thuc tnh DataRow.RowState. Thuc tnh ny c thit lp bng mt trong 5 gi tr kiu enumeration DataRowState sau: Added, Deleted, Detached, Modifed, hoc Unchanged. Xem xt v d sau: tb.Rows.Add(row); tb.AcceptChanges(); Console.Write(row.RowState); tb.Rows[0].Delete(); // Undo deletion tb.RejectChanges(); // Added // ...Commit changes // Unchanged // Deleted // ...Roll back

Console.Write(tb.Rows[0].RowState); // Unchanged DataRow myRow; MyRow = tb.NewRow(); // Detached

Hai phng thc AcceptChanges v RejectChanges ca DataTable l tng ng vi cc thao tc commit v rollback trong mt CSDL. Cc phng thc ny s cp nht mi thay i xy ra k t khi table c np, hoc t khi phng thc AcceptChanges c triu gi trc . v d trn, chng ta c th khi phc li dng b xa do thao tc xa l cha c commit trc khi phng thc RejectChanges c gi. iu ng lu nht l, nhng thay i c thc hin l trn table ch khng phi l data source. ADO.NET qun l 2 gi tr - ng vi 2 phin bn hin ti v nguyn gc - cho mi column trong mt dng d liu. Khi phng thc RejectChanges c gi, cc gi tr hin ti s c t khi phc li t gi tr nguyn gc. iu ngc li c thc hin khi gi phng thc AcceptChanges. Hai tp gi tr ny c th c truy xut ng thi thng qua cc gi tr lit k DataRowVersion l: Current v Original: DataRow r = tb.Rows[0]; r["DonGia"]= 14.95; r.AcceptChanges(); r["DonGia"]= 16.95;

Bi tp thc hnh Chuyn Visual Studio .NET

100

Console.WriteLine("Current: {0} Original: {1} ", r["Price", DataRowVersion.Current], r["Price", DataRowVersion.Original]); Kt qu in ra: Current: 16.95 Original: 14.95 3.4.1.4 DataView. DataView ng vai tr nh tng hin th d liu lu tr trong DataTable. N cho php ngi s dng sp xp, lc v tm kim d liu. //Gi s c 1 dataset c tn l ds cha d liu ca bng DonHang DataView dv = new DataView(ds.Tables["DonHang]; // Lc ra tt c cc hng c gi t 10 n 100 dv.RowFilter = "soluong>=10 and soluong<=100"; //Sp xp tng dn theo s lng nu s lng bng nhau th sp xp gim dn thm n gi dv.Sort = "soluong, dongia DESC";

3.4.2 Np d liu vo DataSet Chng ta bit cch thnh lp mt DataTable v x l d liu theo kiu tng dng mt. Phn ny s trnh by phng php d liu v lc d liu c np t ng t CSDL quan h vo cc table trong DataSet. 3.4.2.1 Dng DataReader np d liu vo DataSet i tng DataReader c th c s dng lin hp i tng DataSet hay trong vic np cc dng d liu kt qu (ca query trong DataReader). cmd.CommandText = "SELECT * FROM nhanvien"; DBDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); DataTable dt = new DataTable("nhanvien"); dt.Load(rdr); // Np d liu v lc vo table Console.WriteLine(rdr.IsClosed); // True

DataTable

Bi tp thc hnh Chuyn Visual Studio .NET

101

i tng DataReader c t ng ng sau khi tt c cc dng d liu c np vo table. Do s dng tham s CommandBehavior.CloseConnection trong phng thc ExecuteReader nn connection c ng sau khi DataReader c ng. Nu table c d liu, phng thc Load s trn d liu mi vi cc dng d liu ang c trong n. Vic trn ny xy ra ch khi cc dng d liu c chung primary key. Nu khng c primary key c nh ngha, cc dng d liu s c ni vo sau tp d liu hin ti. Chng ta c th s dng phng thc np chng khc ca phng thc Load quy nh cch thc lm vic. Phng thc Load vi tham s kiu enumeration LoadOption gm 1 trong 3 gi tr OverwriteRow, PreserveCurrentValues, hoc UpdateCurrentValues tng ng vi ty chn ghi nguyn dng, gi li cc gi tr hin ti, hoc cp nht cc gi tr hin ti. on code di y minh ha cch trn d liu vo cc dng hin ti theo kiu ghi cc gi tr hin ti: cmd.CommandText = "SELECT * FROM nhanvien WHERE diachi=a"; DBDataReader rdr = cmd.ExecuteReader(); DataTable dt = new DataTable("nhanvien"); dt.Load(rdr); Console.Write(dt.Rows[0]["HoTen"]); // gi s gi tr nhn c l tnv spider // Gn kha chnh DataColumn[] col = new DataColumn[1]; col[0] = dt.Columns["Manv"]; dt.PrimaryKey = col; DataRow r = dt.Rows[0]; // ly dng u tin r["HoTen"] = "ten moi"; // thay i gi tr ca ct HoTen // Do reader b ng sau khi np vo data table nn phi gi phi fill li rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); // Trn d liu vi cc dng hin ti. Ghi cc gi tr hin ti dt.Load(rdr, LoadOption.UpdateCurrentValues); // Gi tr cp nht b ghi !!! Console.Write(dt.Rows[0]["HoTen"]); // tnv spider 3.4.2.2 Np d liu vo DataSet bng DataAdapter i tng DataAdapter c th c dng np mt table hin c vo mt table khc, hoc to mi v np d liu cho table t kt qu ca mt query. Bc u tin l to ra
Bi tp thc hnh Chuyn Visual Studio .NET 102

mt i tng DataAdapter tng ng vi data provider c th. Di y l cc v d to ra i tng DataAdapter: (1) To t Connection string v cu truy vn SELECT: String sql = "SELECT * FROM nhanvien"; SqlDataAdapter da = new SqlDataAdapter(sql, connStr); (2) To t i tng Connection v cu truy vn SELECT: SqlConnection conn = new SqlConnection(connStr); SqlDataAdapter da = new SqlDataAdapter(sql, conn); (3) Gn i tng Command cho thuc tnh SelectCommand SqlDataAdapter da = new SqlDataAdapter(); SqlConnection conn = new SqlConnection(connStr); da.SelectCommand = new SqlCommand(sql, conn); Sau khi i tng DataAdapter c to ra, phng thc Fill ca n c thc thi np d liu vo table (ang tn ti hoc to mi). v d di y, mt table mi c to ra vi tn mc nh l Table: DataSet ds = new DataSet(); // To ra mt DataTable, np d liu vo DataTable, v a DataTable vo DataSet int nRecs = da.Fill(ds); // tr v s lng record c np vo DataTable // Nu mun t tn cho DataTable trong DataSet thay v ly tn mc nh // th s dng code nh th ny int nRecs = da.Fill(ds, "nhanvien ") Vi mt table ang tn ti, tc dng ca lnh Fill ty thuc vo table c primary hay khng. Nu c, nhng dng d liu c kha trng vi dng d liu mi s c thay th. Cc dng d liu mi khng trng vi d liu hin c s c ni vo sau DataTable. 3.4.3 V d V d v DataAdapter v DataSet V d ny s dng c s d liu quanlythuvien nh trong v d 3.3.4 Thit k form frmtimkiemsach tm theo tn sch hoc tn tc gi nh sau:

Bi tp thc hnh Chuyn Visual Studio .NET

103

frmtimkiemsach s dng cc trng, phng thc v s kin sau:

Cc iu khin Tn iu khin Thuc tnh Form Name: frmtimkiemsach Text:Tm kim theo nhan hoc tn tc gi Label Text: Nhp tn sch hoc tn tc gi cn tm TextBox Name: txttimkiem dataGridView Name: dataGridView1 statusStrip Name: thanhtrangthai Items: Add thm 2 statusLabel: vi tn ketquatim v tngoluong Cc trng: Tn trng Cn cmd da ngha Dng kt ni n c s d liu quanlythuvien sqlCommand s dng cu lnh select hin th v tm kim sch SqlDataAdapter cha cmd v cn

Bi tp thc hnh Chuyn Visual Studio .NET

104

ds

DataSet cha d liu ca bng sch hoc cha kt qu tm kim

Cc phng thc + Hm dng frmtimkiemsach to giao din public frmtimkiemsach() { InitializeComponent(); } + Phng thc Tongsoluong: c s dng tnh tng s lng sch ca cc sch lu trong Dataset ds. private int Tongsoluong() { int s=0; foreach (DataRow r in ds.Tables["sach"].Rows) { s += (int)r["soluong"]; } return s; } + Phng thc Tongsoluongtk tnh tng s lng sch trong DataView dv, dv cha thng tin cc sch tm kim c. private int Tongsoluongtk(DataView dv) { int s = 0; foreach (DataRow r in dv.ToTable("sach").Rows ) { s += (int)r["soluong"]; } return s; } + S kin frmtimkiemsach_Load:Np thng tin ca 4 quyn sch u tin theo th t gim dn ca ngaynhap vo DataSet ds vi tn bng trong DataSet l sach, sau hin th thng tin ca bng sach trong DataSet vo dataGridView1, a tng s sch v tng s lng sch trong DataSet vo thanh trng thi private void frmtimkiemsach_Load(object sender, EventArgs e) { cn.Open(); // M kt ni cmd.CommandText = "select top 4 * from sach order by ngaynhap desc" ; cmd.Connection = cn; da.SelectCommand = cmd; da.Fill(ds, "sach"); // Np d liu vo DataSet dataGridView1.DataSource = ds.Tables["sach"]; // Np d liu vo dataGridView1 // Np d liu vo thanh trng thi

Bi tp thc hnh Chuyn Visual Studio .NET

105

thanhtrangthai.Items[0].Text = "Tng s sch:" + ds.Tables["sach"].Rows.Count.ToString(); thanhtrangthai.Items[1].Text = "Tng s lng:" + Tongsoluong().ToString(); } + S kin txttimkiem_KeyPress: Khi ngi s dng nhn Enter trn txttimkiem th vic tm kim tng i bt u: To ra 1 DataView dv cha d liu ca bng sch trong DataSet ds, lc trong DataView dv ra thng tin ca cc quyn sch gn ging vi d liu nhp trn txttimkiem, sau a kt qu lc ra trn dataGridView1 v thanh trng thi. private void txttimkiem_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 13) { DataView dv = new DataView(ds.Tables["sach"]); //Np d liu vo DataView //bt u lc d liu dv.RowFilter = "nhande like '%" + txttimkiem.Text + "%' or tacgia like '%" + txttimkiem.Text + "%'"; dataGridView1.DataSource = dv; //Np kt qu lc trong dv vo dataGridView1
// a s quyn sch v tng s lng sch lc c vo thanh trang thi

thanhtrangthai.Items[0].Text = "S kt qu tm thy c: " + dv.Count.ToString() + "/" + ds.Tables["sach"].Rows.Count.ToString(); thanhtrangthai.Items[1].Text = "Tng s lng tm thy c:" + Tongsoluongtk(dv).ToString() + "/" + Tongsoluong().ToString(); } } 3.4.4 Cp nht CSDL bng DataAdapter Sau khi DataAdapter np d liu vo table, connection s c ng, v cc thay i sau i sau to ra cho d liu s ch c nh hng trong DataSet ch khng phi l d liu ngun! thc s cp nht cc thay i ny ln ngun d liu, DataAdapter phi c s dng khi phc connection v gi cc dng d liu c thay i ln CSDL. Ngoi SelectCommand, DataAdapter c thm 3 thuc tnh Command na, gm InsertCommand, DeleteCommand v UpdateCommand, lm nhim v thc hin cc thao tc tng ng vi tn thuc tnh ca chng (chn, xa, cp nht). Cc Command ny c thc thi khi phng thc Update ca DataAdapter c triu gi. Kh khn nm ch to ra cc query command phc tp ny (c php ca cu lnh SQL tng ng cng di dng v phc tp khi s lng column nhiu ln). Rt may l cc data provider u c ci t mt lp gi l CommandBuilder dng qun l vic to cc Command ni trn mt cch t ng.

Bi tp thc hnh Chuyn Visual Studio .NET

106

3.4.4.1 CommandBuilder Mt i tng CommandBuilder s sinh ra cc Command cn thit thc hin vic cp nht ngun d liu to ra bi DataSet. Cch to i tng CommandBuilder l truyn i tng DataAdapter cho phng thc khi dng ca n; sau , khi phng thc DataAdapter.Update c gi, cc lnh SQL s c sinh ra v thc thi. on code di y minh ha cch thc thay i d liu mt DataTable v cp nht ln CSDL tng ng bng DataAdapter: //Gi s c 1 DataSet ds cha d liu ca bng khoa DataTable dt= ds.Tables["khoa"]; // (1) Dng commandBuilder sinh ra cc Command cn thit update SqlCommandBuilder sb = new SqlCommandBuilder(da); // (2) Thc hin thay i d liu: thm 1 khoa mi DataRow drow = dt.NewRow(); drow["Makhoa"] = 12; drow["tenkhoa"] = "abc"; dt.Rows.Add(drow); // (3) Thc hin thay i d liu: xa 1 khoa dt.Rows[4].Delete(); // (4) Thc hin thay i d liu: thay i gi tr 1 dng d liu dt.Rows[5]["tenkhoa"] = "this must be changed"; // (5) Tin hnh cp nht ln CSDL int nUpdate = da.Update(ds, "khoa"); MessageBox.Show("S dng c thay i: " + nUpdate.ToString()); // 3 C mt s hn ch khi s dng CommandBuilder: Command Select ng vi DataAdapter ch c tham chiu n 1 table, v table ngun trong CSDL phi bao gm mt primary key hoc mt column cha cc gi tr duy nht. Column ny (hay t hp cc columns) phi c bao gm trong command Select ban u. 3.4.4.2 ng b ha d liu gia DataSet v CSDL Nh minh ha trong v d ny, vic s dng DataAdapter lm n gin ha v t ng ha qu trnh cp nht CSDL hoc bt k data source no. Tuy nhin, c mt vn y: multi-user (nhiu ngi s dng). M hnh Ngt kt ni c da trn c ch Optimistic Concurrency, mt cch tip cn m trong cc dng d liu data source khng b kha (lock) gia thi gian m chng c c v thi gian m cc cp nht c p dng cho data source. Trong khong thi gian ny, user khc c th cng

Bi tp thc hnh Chuyn Visual Studio .NET

107

cp nht data source. Nu c thay i xy ra k t ln c trc th phng thc Update s nhn bit c v khng cho p dng thay i i vi cc dng d liu . C hai phng n c bn gii quyt li concurrency (tng tranh) khi c nhiu cp nht c p dng: roll back tt c cc thay i nu nh xut hin xung t (violation), hoc p dng cc cp nht khng gy ra li v xc nh nhng cp nht c gy ra li c th x l li. 3.4.4.3 S dng Transactions Roll Back nhiu cp nht Khi thuc tnh DataAdapter.ContinueUpdateOnErrors c thit lp l false, mt ngoi l s c nm ra khi mt thay i dng d liu khng th thc hin c. iu ny s ngn cc cp nht tip theo c thc thi, nhng li khng nh hng n cc cp nht xut hin trc ngoi l . Do nhng cp nht c th c lin quan vi nhau, ng dng thng l cn chin lc hoc l tt c, hoc l khng (all-or-none). Cch d nht thc thi chin lc ny l to ra mt transaction trong tt c cc command update s c thc thi. thc hin iu ny, to ra mt i tng SqlTransaction v gn n vi SqlDataAdapter.SelectCommand bng cch truyn n cho hm khi dng ca n. Nu c ngoi l xy ra, phng thc Rollback s c thc thi undo mi thay i trc ; nu khng c ngoi l no xut hin, phng thc Commit c thc thi p dng tt c cc command update. Di y l mt v d: SqlDataAdapter da = new SqlDataAdapter(); SqlCommandBuilder sb = new SqlCommandBuilder(da); SqlTransaction tran; SqlConnection conn = new SqlConnection(connStr); conn.Open(); // Connection phi c dng vi Transaction

// (1) To ra mt transaction SqlTransaction tran = conn.BeginTransaction(); // (2) Gn SelectCommand vi transaction da.SelectCommand = new SqlCommand(sql, conn, tran); DataSet ds = new DataSet(); da.Fill(ds, "docgia"); // // Code phn ny thc hin cc cp nht ln cc dng d liu DataSet try

Bi tp thc hnh Chuyn Visual Studio .NET

108

{ int updates = da.Update(ds, "docgia"); MessageBox.Show("Cp nht: " + updates.ToString()); } // (3) Nu c ngoi l xut hin, roll back mi cp nht trong transaction catch (Exception ex) { MessageBox.Show(ex.Message); // Li khi cp nht if (tran != null) { tran.Rollback(); // Roll back mi cp nht tran = null; MessageBox.Show("Tt c cc cp nht b roll back."); } } finally { // (4) Nu khng c li, commit tt c cc cp nht if (tran != null) { tran.Commit(); MessageBox.Show("Tt c c cp nht thnh cng. "); tran = null; } } conn.Close();

3.4.4.4 Xc nh cc dng gy ra li cp nht Khi thuc tnh DataAdapter.ContinueUpdateOnErrors c thit lp l True, cc x l s khng ngng nu c mt dng d liu khng th cp nht c. Thay vo , DataAdapter s cp nht tt c cc dng d liu khng gy ra li. Sau , lp trnh vin c th xc nh cc dng d liu khng cp nht c v quyt nh cch x l chng. Cc dng d liu khng cp nht c c th d dng c xc nh qua thuc tnh DataRowState ca chng ( c trnh by trong phn m t DataRow). Cc dng d liu c cp nht thnh cng s c trng thi Unchanged; trong khi cc dng d liu khng cp nht thnh cng s mang trng thi Added, Deleted hoc

Bi tp thc hnh Chuyn Visual Studio .NET

109

Modified. on code di y minh ha cch lp qua cc dng d liu v xc nh cc dng cha c cp nht. // SqlDataAdapter da np d liu ca bng docgia da.ContinueUpdateOnError = true; DataSet ds = new DataSet(); try { da.Fill(ds, "docgia"); DataTable dt = ds.Tables["docgia"]; SqlCommandBuilder sb = new SqlCommandBuilder(da); // ... Cc thao tc cp nht dt.Rows[29].Delete(); // Delete

dt.Rows[30]["HoTen"] = "try to change"; // Update dt.Rows[30][Madocgia] = 1234; dt.Rows[31]["HoTen"] = "XYZ"; DataRow drow = dt.NewRow(); drow["HoTen"] = "tnv spider"; drow["Madocgia"] = 25; dt.Rows.Add(drow); // Update // Update

// insert

// Submit updates int updates = da.Update(ds, "docgia"); if (ds.HasChanges()) { // Load rows that failed into a DataSet DataSet failures = ds.GetChanges(); int rowsFailed = failures.Rows.Count; Console.WriteLine("S dng khng th cp nht: " + rowsFailed); foreach (DataRow r in failures.Tables[0].Rows ) { string state = r.RowState.ToString());

Bi tp thc hnh Chuyn Visual Studio .NET

110

// Phi hy b thay i hin th dng b xa if (r.RowState == DataRowState.Deleted) r.RejectChanges(); string iMadocgia= ((int)r["Madocgia"]).ToString(); string msg = state + " Madocgia: " + iMadocgia; Console.WriteLine(msg); } } Lu rng ngay c khi thao tc xa xut hin trc, n cng khng c tc dng i vi cc thao tc khc. Cu lnh SQL xa hay cp nht mt dng d liu c da theo gi tr ca primary key ch khng lin quan n v tr ca n. Ngoi ra cc cp nht trn cng mt dng c kt hp v m nh l 1 cp nht cho dng bi phng thc Update. v d trn, cc cp nht cho dng 30 c tnh nh l 1 cp nht. 3.4.5 nh ngha Relationships gia cc Table trong DataSet Mt DataRelation l mt mi quan h parent-child gia hai i tng DataTables. N c nh ngha da trn vic so khp cc columns trong 2 DataTable. C php hm khi dng l nh sau: public DataRelation( string relationName, DataColumn parentColumn, DataColumn childColumn) Mt DataSet c mt thuc tnh Relations gip qun l tp hp cc DataRelation c nh ngha trong DataSet. S dng phng thc Relations.Add thm cc DataRelation vo tp hp Relations. V d di y thit lp mi quan h gia hai bng khoa v docgia c th lit k danh sch cc docgia ca mi khoa.
string connStr="Data Source=tn my ch;Initial Catalog=quanlythuvien; Trusted_Connection=yes";

DataSet ds = new DataSet(); // (1) Fill bng docgia string sql = "SELECT * FROM docgia; SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(); SqlDataAdapter da = new SqlDataAdapter(sql, conn); da.Fill(ds, "docgia"); // (2) Fill bng khoa sql = "SELECT * FROM khoa;

Bi tp thc hnh Chuyn Visual Studio .NET

111

da.SelectCommand.CommandText = sql; da.Fill(ds, "khoa"); // (3) nh ngha relationship gia 2 bng khoa v docgia DataTable parent = ds.Tables["khoa"]; DataTable child = ds.Tables["docgia"]; DataRelation relation = new DataRelation("khoa_docgia", parent.Columns["makhoa"], child.Columns["makhoa"]); // (4) a relationship vo DataSet ds.Relations.Add(relation); // (5) Lit k danh sch cc c gi ca tng khoa foreach (DataRow r in parent.Rows) { Console.WriteLine(r["tenkhoa"]); // Tn khoa foreach (DataRow rc in r.GetChildRows("khoa_docgia")) { Console.WriteLine(" " + rc["HoTen"]); } } /* V d kt qu: Khoa Tin Nguyn Vn Trung Ng Anh Tun L Thanh Hoa Khoa Ton Nguyn Th Hoa Trn Vn Phc */ Khi mt relationship c nh ngha gia 2 tables, n cng s thm mt ForeignKeyConstraint vo tp hp Constraints ca DataTable con. Constraint ny quyt nh cch m DataTable con b nh hng khi cc dng d liu pha DataTable cha b thay i hay b xa. Trong thc t, iu ny c ngha l khi bn xa 1 dng trong DataTable cha, cc dng con c lin quan cng b xa hoc cng c th l cc key b t li gi tr thnh NULL. Tng t nh th, nu mt gi tr key b thay i trong DataTable cha, cc dng d liu c lin quan trong DataTable con cng c th b thay i theo hoc b i gi tr thnh NULL. Cc lut nh trn c xc nh bi cc thuc tnh DeleteRule v constraint. Cc lut ny c nhn cc gi tr lit k sau y:
UpdateRule

ca

Bi tp thc hnh Chuyn Visual Studio .NET

112

Cascade. Xa/Cp nht cc dng d liu c lin quan trong DataTable con. y l gi tr mc nh. None. Khng lm g. SetDefault. Thit lp cc gi tr kha trong cc dng d liu c lin quan ca DataTable con thnh gi tr mc nh ca column tng ng. SetNull. Thit lp cc gi tr kha trong cc dng d liu c lin quan ca DataTable con thnh null.

Xem xt v d di y: // (1) Thm mt dng vi kha mi vo DataTable con DataRow row = child.NewRow(); row["Makhoa"] = 999; // gi s trong bng khoa khng c record no c Makhoa = 999 child.Rows.Add(row); // Khng c do 999 khng tn ti trong DataTable cha // (2) Xa mt dng trong DataTable cha row = parent.Rows[0]; row.Delete(); // Xa cc dng trong DataTable con c kha ny // (3) Tm thi v hiu ha constraints v th thm dng mi ds.EnforceConstraints = false; row["Makhoa"] = 999; child.Rows.Add(row); // c chp nhn!!! ds.EnforceConstraints = true; // Kch hot constraint tr li
// (4) Thay i constraint t cc dng d liu thnh null nu DataTable thay i

((ForeignKeyConstraint)child.Constraints[0]).DeleteRule = Rule.SetNull; Lu rng thuc tnh EnforeceConstraint c t thnh false s lm v hiu ha tt c cc constraint iu ny trong thut ng CSDL gi l b qua tnh ton vn tham chiu. iu ny cho php mt khoa c b sung vo thm ch khi c column Makhoa khng tng ng vi dng no trong bng khoa. N cng cho php mt dng khoa c xa ngay c khi c nhiu dng tng ng vi n trong bng docgia. 3.5 S dng Data Binding 3.6 La chn gia m hnh Kt ni v m hnh Ngt kt ni DataReader v DataSet a ra hai cch tip cn khc nhau x l d liu. DataReader cho php truy xut kiu forward-only, read-only. Bng cch x l tng dng mt, cch

Bi tp thc hnh Chuyn Visual Studio .NET

113

tip cn ny gip tit kim b nh. DataSet, ngc li, cho php truy xut theo kiu read/write, nhng li yu cu phi c b nh qun l bn sao d liu np v t data source. Nh vy, bn c th suy ra mt s quy tc chung: Nu ng dng khng cn tnh nng cp nht d liu v hu nh ch hin th v chn lc d liu, DataReader l la chn thch hp; nu ng dng cn cp nht d liu, gii php s dng DataSet nn c xem xt. Tt nhin, cng c mt s tnh hung i ngc li vi cc quy tc chung ni trn. Chng hn, nu data source cha mt s lng ln cc record, khi DataSet phi yu cu qu nhiu ti nguyn b nh; hoc nu d liu ch yu cu mt vi thao tc cp nht, th s kt hp gia DataReader v Command thc thi cp nht s c th c ngha hn. Tm li, mt DataSet l mt la chn tt khi: D liu cn c serialize (tun t ha) v/hoc gi i bng HTTP. Cc iu khin read-only trn Form Win Form c kt buc (bind) vi data source. Mt iu khin Win Form nh GridView hay data source c kh nng cp nht c.
DataView

c kt buc vi mt

Mt ng dng desktop cn thm, xa, sa cc dng d liu.

Trong khi , DataReader l la chn cho nhng trng hp: Cn qun l mt s lng ln cc record, ln n mc m b nh v thi gian np d liu cho DataSet l phi thc t. D liu l read-only v c kt buc vi mt iu khin loi danh sch (list control) ca Win Form hoc Web Form. CSDL l khng n nh v thay i thng xuyn.

Bi tp thc hnh Chuyn Visual Studio .NET

114

3.6 To i tng DataSet Trong v d trc, to ra i tng SqlDataAdapter bng cch gn trc tip chui kt ni v chui truy vn vo n. i tng Connection v Command s c to v tch hp vo trong i tng DataAdapter ny. Vi cch ny, ta s b hn ch trong cc thao tc lin quan n c s d liu. SqlDataAdapter DataAdapter connectionString); = new SqlDataAdapter(commandString,

V d sau y s minh ha vic ly v i tng DataSet bng cch to ra cc i tng Connection v Command mt cch ring bit, khi ta cn dng li chng hay mun thc hin hon chnh mt thao tc th s thun li hn. u tin ta s khai bo bn bin thnh vin thuc lp, nh sau: private System.Data.SqlClient.SqlConnection myConnection; private System.Data.DataSet myDataSet; private System.Data.SqlClient.SqlCommand myCommand; private System.Data.SqlClient.SqlDataAdapter DataAdapter; i tng Connection s c to ring vi chui kt ni: string connectionString = "server=localhost; uid=sa; pwd=; database=northwind"; myConnection = new System.Data.Sql.SqlConnection(connectionString); Sau ta s m kt ni: myConnection.Open( ); Ta c th thc hin nhiu giao tc trn c s d liu khi kt ni c m v sau khi dng xong ta ch n gin ng kt ni li. Tip theo ta s to ra i tng DataSet: myDataSet = new System.Data.DataSet( ); V tip tc to i tng Command, gn cho n i tng Connection m v chui truy vn d liu: myCommand = new System.Data.SqlClient.SqlCommand( ) myCommand.Connection=myConnection; myCommand.CommandText = "Select * from Customers"; Cui cng ta cn to ra i tng SqlDataAdapter, gn i tng SqlCommand va to trn cho n, ng thi phi tin hnh nh x bng d liu n nhn c t cu truy vn ca i tng Command to s ng nht v tn cc ct khi y bng d liu ny vo DataSet. DataAdapter = new System.Data.SqlClient.SqlDataAdapter( );

Bi tp thc hnh Chuyn Visual Studio .NET

115

DataAdapter.SelectCommand= myCommand; DataAdapter.TableMappings.Add("Table","Customers"); DataAdapter.Fill(myDataSet); By gi ta ch vic gn DataSet vo thuc tnh DataSoucre ca iu khin li: dataGrid1.DataSource=myDataSet.Tables["Customers"].DefaultView; Di y l m hon chnh ca ng dng ny: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Data.SqlClient; namespace ProgrammingCSharpWindows.Form { public class ADOForm1: System.Windows.Forms.Form { private System.ComponentModel.Container components; private System.Windows.Forms.DataGrid dataGrid1; private System.Data.SqlClient.SqlConnection myConnection; private System.Data.DataSet myDataSet; private System.Data.SqlClient.SqlCommand myCommand; private System.Data.SqlClient.SqlDataAdapter DataAdapter; public ADOForm1( ) { InitializeComponent( ); // to i tng connection v m n string connectionString = "server=Neptune; uid=sa; pwd=oWenmEany;" + "database=northwind";

Bi tp thc hnh Chuyn Visual Studio .NET

116

myConnection = new SqlConnection(connectionString); myConnection.Open(); // to i tng DataSet mi myDataSet = new DataSet( ); // to i tng command mi v gn cho i tng // connectio v chui truy vn cho n myCommand = new System.Data.SqlClient.SqlCommand( ); myCommand.Connection=myConnection; myCommand.CommandText = "Select * from Customers"; // to i tng DataAdapter vi i tng Command va // to trn, ng thi thc hin nh x bng d liu DataAdapter = new SqlDataAdapter( ); DataAdapter.SelectCommand= myCommand; DataAdapter.TableMappings.Add("Table","Customers"); // y d liu vo DataSet DataAdapter.Fill(myDataSet); // gn d liu vo li dataGrid1.DataSource = myDataSet.Tables["Customers"].DefaultView; } public override void Dispose() { base.Dispose(); components.Dispose(); } private void InitializeComponent( ) { this.components = new System.ComponentModel.Container(); this.dataGrid1 = new System.Windows.Forms.DataGrid(); dataGrid1.BeginInit();

Bi tp thc hnh Chuyn Visual Studio .NET

117

dataGrid1.Location = new System.Drawing.Point(24, 32); dataGrid1.Size = new System.Drawing.Size(480, 408); dataGrid1.DataMember = ""; dataGrid1.TabIndex = 0; this.Text = "ADOFrm1"; this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(536, 501); this.Controls.Add(this.dataGrid1); dataGrid1.EndInit( ); } public static void Main(string[] args) { Application.Run(new ADOForm1()); } } } Giao din ca v d ny cng tng t nh cc v d trn. 3.7 Kt hp gia nhiu bng Cc v d trn ch n thun ly d liu t trong mt bng. v d ny ta s tm hiu v cch ly d liu trn hai bng. Trong c s d liu ca ta, mt khch hng c th c nhiu ha n khc nhau, v th ta s c quan h mt nhiu gia bng khch hng (Customers)v bng ha n (Orders). Bng Orders s cha thuc tnh CustomersId ca bng Customers, thuc tnh ny ng vai tr l kha chnh i bng Customers v kha ngoi i vi bng Orders. ng dng ca ta s hin th d liu ca hai bng Customers v Orders trn cng mt li v th hin quan h mt nhiu ca hai bng ngay trn li. lm c iu ny ta ch cn dng chung mt i tng Connetion, hai i tng tng SqlDataAdapter v hai i tng SqlCommand. Sau khi to i tng SqlDataAdapter cho bng Customers tng t nh v d trn, ta tin to tip i tng SqlDataAdapter cho bng Orders: myCommand2 = new System.Data.SqlClient.SqlCommand(); DataAdapter2 = new System.Data.SqlClient.SqlDataAdapter(); myCommand2.Connection = myConnection;

Bi tp thc hnh Chuyn Visual Studio .NET

118

myCommand2.CommandText = "SELECT * FROM Orders"; Lu l y i tng DataAdapter2 c th dng chung i tng Connection trn, nhng i tng Command th khc. Sau gn i tng Command2 cho DataAdapter2, nh x bng d liu v y d liu vo DataSet trn. DataAdapter2.SelectCommand = myCommand2; DataAdapter2.TableMappings.Add ("Table", "Orders"); DataAdapter2.Fill(myDataSet); Ti thi im ny, ta c mt i tng DataSet nhng cha hai bng d liu: Customers v Orders. Do ta cn th hin c quan h ca hai bng ngay trn iu khin li, cho nn ta cn phi nh ngha quan h ny cho i tng DataSet ca chng ta. Nu khng lm iu ny th i tng DataSet s b qua quan h gia 2 bng ny. Do ta cn khai bo thm i tng DataRelation: System.Data.DataRelation dataRelation; Do mi bng Customers v Orders u c cha mt thuc tnh CustomersId, nn ta cng cn khi bo thm hai i tng DataColumn tng ng vi hai thuc tnh ny. System.Data.DataColumn dataColumn1; System.Data.DataColumn dataColumn2; Mi mt DataColumn s gi gi tr ca mt ct trong bng ca i tng DataSet: dataColumn1 = myDataSet.Tables["Customers"].Columns["CustomerID"]; dataColumn2 = myDataSet.Tables["Orders"].Columns["CustomerID"]; Ta tin hnh to quan h cho hai bng bng cch gi hm khi to ca i tng DataRelation, truyn vo cho n tn quan h v hai ct cn to quan h: dataRelation = new System.Data.DataRelation("CustomersToOrders", dataColumn1, dataColumn2); Sau khi to c i tng DataRelation, ta thm vo DataSet ca ta. Sau ta cn to mt i tng qun l khung nhn DataViewManager cho DataSet, i tng khung nhn ny s c gn cho li iu khin hin th: myDataSet.Relations.Add(dataRelation); DataViewManager DataSetView = myDataSet.DefaultViewManager; dataGrid1.DataSource = DataSetView; Do iu khin li phi hin th quan h ca hai bng d liu, nn ta phi ch cho n bit l bng no s l bng cha. y bng cha l bng Customers: dataGrid1.DataMember= "Customers";

Bi tp thc hnh Chuyn Visual Studio .NET

119

Sau y l m hon chnh ca ton b ng dng: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Data.SqlClient; namespace ProgrammingCSharpWindows.Form { public class ADOForm1: System.Windows.Forms.Form { private System.ComponentModel.Container components; private System.Windows.Forms.DataGrid dataGrid1; private System.Data.SqlClient.SqlConnection myConnection; private System.Data.DataSet myDataSet; private System.Data.SqlClient.SqlCommand myCommand; private System.Data.SqlClient.SqlCommand myCommand2; private System.Data.SqlClient.SqlDataAdapter DataAdapter; private System.Data.SqlClient.SqlDataAdapter DataAdapter2; public ADOForm1( ) { InitializeComponent( ); // to kt ni string connectionString = "server=Neptune; uid=sa;" + " pwd=oWenmEany; database=northwind"; myConnection = new SqlConnection(connectionString); myConnection.Open( ); // to DataSet myDataSet = new System.Data.DataSet( );

Bi tp thc hnh Chuyn Visual Studio .NET

120

// to i tng Command v DataSet cho bng Customers myCommand = new System.Data.SqlClient.SqlCommand( ); myCommand.Connection=myConnection; myCommand.CommandText = "Select * from Customers"; DataAdapter =new System.Data.SqlClient.SqlDataAdapter(); DataAdapter.SelectCommand= myCommand; DataAdapter.TableMappings.Add("Table","Customers"); DataAdapter.Fill(myDataSet); // to i tng Command v DataSet cho bng Orders myCommand2 = new System.Data.SqlClient.SqlCommand( ); DataAdapter2=new System.Data.SqlClient.SqlDataAdapter(); myCommand2.Connection = myConnection; myCommand2.CommandText = "SELECT * FROM Orders"; DataAdapter2.SelectCommand = myCommand2; DataAdapter2.TableMappings.Add ("Table", "Orders"); DataAdapter2.Fill(myDataSet); // thit lp quan h gia 2 bng System.Data.DataRelation dataRelation; System.Data.DataColumn dataColumn1; System.Data.DataColumn dataColumn2; dataColumn1 = myDataSet.Tables["Customers"].Columns["CustomerID"]; dataColumn2 = myDataSet.Tables["Orders"].Columns["CustomerID"]; dataRelation = new System.Data.DataRelation( "CustomersToOrders", dataColumn1, dataColumn2); // thm quan h trn vo DataSet myDataSet.Relations.Add(dataRelation); // t khung nhn v bng hin th trc cho li DataViewManager DataSetView =

Bi tp thc hnh Chuyn Visual Studio .NET

121

myDataSet.DefaultViewManager; dataGrid1.DataSource = DataSetView; dataGrid1.DataMember= "Customers"; } public override void Dispose( ) { base.Dispose( ); components.Dispose( ); } private void InitializeComponent( ) { this.components = new System.ComponentModel.Container(); this.dataGrid1 = new System.Windows.Forms.DataGrid(); dataGrid1.BeginInit( ); dataGrid1.Location = new System.Drawing.Point(24, 32); dataGrid1.Size = new System.Drawing.Size(480, 408); dataGrid1.DataMember = ""; dataGrid1.TabIndex = 0; this.Text = "ADOFrm1"; this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size (536, 501); this.Controls.Add (this.dataGrid1); dataGrid1.EndInit ( ); } public static void Main(string[] args) { Application.Run(new ADOForm1( )); } } }

Bi tp thc hnh Chuyn Visual Studio .NET

122

3.8 Thay i cc bn ghi ca c s d liu Ti lc ny, chng ta hc cch ly d liu t c s d liu sau hin th chng ra mn hnh da vo cc iu khin c hay khng kt buc d liu. Phn ny chng ta s tm hiu cch cp nht vo c s d liu. Cc thao tc trn c s d liu nh: Thm, xa v sa mt dng trong cc bng d liu. Sau y l lung cng vic hon chnh khi ta c mt thao tc cp nht c s d liu: 1. y d liu ca bng vo DataSet bng cu truy vn SQL hay gi th tc t c s d liu 2. Hin th d liu trong cc bng c trong DataSet bng cch kt buc hay duyt qua cc dng d liu. 3. Hiu chnh d liu trong cc bng DataTable vi cc thao tc thm, xa hay sa trn dng DataRow. 4. Gi phng thc GetChanges() ly v mt DataSet khc cha tt c cc thay i trn d liu. 5. Kim tra li trn DataSet mi c to ny bng thuc tnh HasErrors. Nu c li th ta s tin hnh kim tra trn tng bng DataTable ca DataSet, khi gp mt bng c li th ta tip tc dng hm GetErrors() ly v cc dng DataRow c li, ng vi tng dng ta s dng thuc tnh RowError trn dng xc nh xem dng c li hay khng c th a ra x l thch hp. 6. Trn hai DataSet li thnh mt. 7. Gi phng thc Update() ca i tng DataAdapter vi i s truyn vo l DataSet va c trong thao tc trn trn cp nht cc thay i vo c s d liu. 8. Gi phng thc AcceptChanges() ca DataSet cp nht cc thay i vo DataSet ny hay phng thc RejectChanges() nu t chi cp nht thay i cho DataSet hin hnh. Vi lung cng vic trn, cho php ta c th kim sot tt c vic thay i trn c s d liu hay vic g li cng thun tin hn. Trong v d di y , ta s cho hin th d liu trong bng Customers ln mt ListBox, sau ta tin hnh cc thao tc thm, xa hay sa trn c s d liu. d hiu, ta gim bt mt s thao tc qun l ngoi l hay li, ch tp trung vo mc ch chnh ca ta. Giao din chnh ca ng dng sau khi hon chnh: Trong Form ny, ta c mt ListBox lbCustomers lit k cc khch hng, mt Button btnUpdate cho vic cp nht d liu, mt Button Xa, ng vi nt thm mi ta c tm hp thoi TextBox nhn d liu g vo t ngi dng. ng thi ta c thm mt lblMessage hin th cc thng bo ng vi cc thao tc trn.

Bi tp thc hnh Chuyn Visual Studio .NET

123

3.9 Truy cp v hin th d liu Ta s to ra ba bin thnh vin: DataAdapter, DataSet v Command: private SqlDataAdapter DataAdapter; private DataSet DataSet; private DataTable dataTable; Vic khai bo cc bin thnh vin nh vy s gip ta c th dng li cho cc phng thc khc nhau. Ta khai bo chui kt ni v truy vn: string connectionString = "server=localhost; uid=sa; pwd=; database=northwind"; string commandString = "Select * from Customers"; Cc chui c dng lm i s to i tng DataAdapter: DataAdapter=new SqlDataAdapter(commandString,ConnectionString); To ra i tng DataSet mi, sau y d liu t DataAdapter vo cho n: DataSet = new DataSet(); DataAdapter.Fill(DataSet,"Customers"); hin th d liu, ta s gi hm PopulateDB() y d liu vo ListBox: dataTable = DataSet.Tables[0]; lbCustomers.Items.Clear( ); foreach (DataRow dataRow in dataTable.Rows) { lbCustomers.Items.Add(dataRow["CompanyName"] dataRow["ContactName"] + ")" ); } 3.10 Cp nht mt dng d liu Khi ngi dng nhn Button Update (cp nht), ta s ly ch mc c chn trn ListBox, v ly ra dng d liu DataRow trong bng ng vi ch mc trn. Sau cp nht DataSet vi dng d liu mi ny nu sau khi kim tra thy chng khng c li no c. Chi tit v qu trnh thc hin cp nht: u tin ta s ly v dng d liu ngi dng mun thay i t i tng dataTable m ta khai bo lm bin thnh vin ngay t u: DataRow targetRow = dataTable.Rows[lbCustomers.SelectedIndex]; + " (" +

Bi tp thc hnh Chuyn Visual Studio .NET

124

Hin th chui thng bo cp nht dng d liu cho ngi dng bit. lm iu ny ta s gi phng thc tnh DoEvents() ca i tng Application, hm ny s gip sn mi li mn hnh vi thng ip hay cc thay i khc. lblMessage.Text = "Updating " + targetRow["CompanyName"]; Application.DoEvents(); Gi hm BeginEdit() ca i tng DataRow, chuyn dng d liu sang ch hiu chnh ( Edit ) v EndEdit() kt thc ch hiu chnh dng. targetRow.BeginEdit(); targetRow["CompanyName"] = txtCustomerName.Text; targetRow.EndEdit(); Ly v cc thay i trn i tng DataSet kim tra xem cc thay i c xy ra bt k li no khng. y ta s dng mt bin c c kiu true/false xc nh l c li l true, khng c li l false.Kim tra li bng cch dng hai vng lp tun t trn bng v dng ca DataSet mi ly v trn, ta dng thuc tnh HasErrors kim tra li trn bng, phng thc GetErrors() ly v cc dng c li trong bng. DataSet DataSetChanged; DataSetChanged = DataSet.GetChanges(DataRowState.Modified); bool okayFlag = true; if (DataSetChanged.HasErrors) { okayFlag = false; string msg = "Error in row with customer ID "; foreach (DataTable theTable in DataSetChanged.Tables) { if (theTable.HasErrors) { DataRow[] errorRows = theTable.GetErrors( ); foreach (DataRow theRow in errorRows) msg = msg + theRow["CustomerID"]; } }

Bi tp thc hnh Chuyn Visual Studio .NET

125

lblMessage.Text = msg; } Nu bin c okagFlag l true,th ta s trn DataSet ban u vi DataSet thay i thnh mt, sau cp nht DataSet sau khi trn ny vo c s d liu. if (okayFlag) { DataSet.Merge(DataSetChanged); DataAdapter.Update(DataSet,"Customers"); Tip theo hin th cu lnh truy vn cho ngi dng bit, v cp nht nhng thay i cho DataSet u tin, ri hin th d liu mi ln i tng ListBox. lblMessage.Text = DataAdapter.UpdateCommand.CommandText; Application.DoEvents( ); DataSet.AcceptChanges( ); PopulateLB( ); Nu c okayFlag l false, c ngha l c li trong qu trnh hiu chnh d liu, ta s t chi cc thay i trn DataSet. else DataSet.RejectChanges( ); 3.11 Xa mt dng d liu M thc thi ca s kin xa th n gin hn mt cht, ta nhn v dng cn xa: DataRow targetRow = dataTable.Rows[lbCustomers.SelectedIndex]; Gi li dng cn xa dng lm thng ip hin th cho ngi dng bit trc khi xa dng ny khi c s d liu. string msg = targetRow["CompanyName"] + " deleted. ";, Bt u thc hin xa trn bng d liu, cp nht thay i vo DataSet v cp nht lun vo c s d liu: dataTable.Rows[lbCustomers.SelectedIndex].Delete( ); DataSet.AcceptChanges( ); DataAdapter.Update(DataSet,"Customers"); Khi gi hm AccceptChanges() cp nht thay i cho DataSet th n s ln lt gi hm ny cho cc DataTable, sau cho cc DataRow cp nht chng. Ta cng cn

Bi tp thc hnh Chuyn Visual Studio .NET

126

ch khi gi hm xa trn bng Customers, dng d liu DataRow ca khch hng ny ch c xa nu n khng vi phm rng buc trn cc bng khc, y khch hng ch c xa nu nu khch hng khng c mt ha n no trn bng Orders. Nu c ta phi tin hnh xa trn bng ha n trc, sau mi xa trn bng Customers. 3.12 To mt dng d liu mi Sau khi ngi dng cung cp cc thng tin v khch hng cn to mi v nhn Button to mi ( New ), ta s vit m thc thi trong hm bt s kin nhn nt to mi ny. u tin ta s to ra mt dng mi trn i tng DataTable, sau gn d liu trn cc TextBox cho cc ct ca dng mi ny: DataRow newRow = dataTable.NewRow( ); newRow["CustomerID"] = txtCompanyID.Text; newRow["CompanyName"] = txtCompanyName.Text; newRow["ContactName"] = txtContactName.Text; newRow["ContactTitle"] = txtContactTitle.Text; newRow["Address"] = txtAddress.Text; newRow["City"] = txtCity.Text; newRow["PostalCode"] = txtZip.Text; newRow["Phone"] = txtPhone.Text; Thm dng mi vi d liu vo bng DataTable, cp nht vo c s d liu, hin th cu truy vn, cp nht DataSet, hin th d liu mi ln hp ListBox. Lm trng cc iu khin TextBox bng hm thnh vin ClearFields(). dataTable.Rows.Add(newRow); DataAdapter.Update(DataSet,"Customers"); lblMessage.Text = DataAdapter.UpdateCommand.CommandText; Application.DoEvents( ); DataSet.AcceptChanges( ); PopulateLB( ); ClearFields( ); hiu r hon chnh ng, ta s xem m hon chnh ca ton ng dng: using System; using System.Drawing;

Bi tp thc hnh Chuyn Visual Studio .NET

127

using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Data.SqlClient; namespace ProgrammingCSharpWindows.Form { public class ADOForm1: System.Windows.Forms.Form { private System.ComponentModel.Container components; private System.Windows.Forms.Label label9; private System.Windows.Forms.TextBox txtPhone; private System.Windows.Forms.Label label8; private System.Windows.Forms.TextBox txtContactTitle; private System.Windows.Forms.Label label7; private System.Windows.Forms.TextBox txtZip; private System.Windows.Forms.Label label6; private System.Windows.Forms.TextBox txtCity; private System.Windows.Forms.Label label5; private System.Windows.Forms.TextBox txtAddress; private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox txtContactName; private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox txtCompanyName; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox txtCompanyID; private System.Windows.Forms.Label label1; private System.Windows.Forms.Button btnNew; private System.Windows.Forms.TextBox txtCustomerName; private System.Windows.Forms.Button btnUpdate;

Bi tp thc hnh Chuyn Visual Studio .NET

128

private System.Windows.Forms.Label lblMessage; private System.Windows.Forms.Button btnDelete; private System.Windows.Forms.ListBox lbCustomers; private SqlDataAdapter DataAdapter; // bit thnh vin DataSet v dataTable cho php ta s // dng trn nhiu hm khc nhau private DataSet DataSet; private DataTable dataTable; public ADOForm1( ) { InitializeComponent( ); string connectionString = "server=Neptune; uid=sa;" + " pwd=oWenmEany; database=northwind"; string commandString = "Select * from Customers"; DataAdapter = new SqlDataAdapter(commandString, connectionString); DataSet = new DataSet( ); DataAdapter.Fill(DataSet,"Customers"); PopulateLB( ); } // y d liu vo iu khin ListBox private void PopulateLB( ) { dataTable = DataSet.Tables[0]; lbCustomers.Items.Clear( ); foreach (DataRow dataRow in dataTable.Rows) { lbCustomers.Items.Add( dataRow["CompanyName"] + " (" + dataRow["ContactName"] + ")" ); }

Bi tp thc hnh Chuyn Visual Studio .NET

129

} public override void Dispose( ) { base.Dispose( ); components.Dispose( ); } private void InitializeComponent( ) { this.components = new System.ComponentModel.Container(); this.txtCustomerName=new System.Windows.Forms.TextBox(); this.txtCity = new System.Windows.Forms.TextBox(); this.txtCompanyID = new System.Windows.Forms.TextBox(); this.lblMessage = new System.Windows.Forms.Label(); this.btnUpdate = new System.Windows.Forms.Button(); this.txtContactName= new System.Windows.Forms.TextBox(); this.txtZip = new System.Windows.Forms.TextBox(); this.btnDelete = new System.Windows.Forms.Button(); this.txtContactTitle=new System.Windows.Forms.TextBox(); this.txtAddress = new System.Windows.Forms.TextBox(); this.txtCompanyName=new System.Windows.Forms.TextBox( ); this.label5 = new System.Windows.Forms.Label( ); this.label6 = new System.Windows.Forms.Label( ); this.label7 = new System.Windows.Forms.Label( ); this.label8 = new System.Windows.Forms.Label( ); this.label9 = new System.Windows.Forms.Label( ); this.label4 = new System.Windows.Forms.Label( ); this.lbCustomers = new System.Windows.Forms.ListBox( ); this.txtPhone = new System.Windows.Forms.TextBox( ); this.btnNew = new System.Windows.Forms.Button( ); this.label1 = new System.Windows.Forms.Label( );

Bi tp thc hnh Chuyn Visual Studio .NET

130

this.label2 = new System.Windows.Forms.Label( ); this.label3 = new System.Windows.Forms.Label( ); txtCustomerName.Location = new System.Drawing.Point(256, 120); txtCustomerName.TabIndex = 4; txtCustomerName.Size = new System.Drawing.Size(160, 20); txtCity.Location = new System.Drawing.Point(384, 245); txtCity.TabIndex = 15; txtCity.Size = new System.Drawing.Size (160, 20); txtCompanyID.Location = new System.Drawing.Point (136, 216); txtCompanyID.TabIndex = 7; txtCompanyID.Size = new System.Drawing.Size (160, 20); lblMessage.Location = new System.Drawing.Point(32, 368); lblMessage.Text = "Press New, Update or Delete"; lblMessage.Size = new System.Drawing.Size (416, 48); lblMessage.TabIndex = 1; btnUpdate.Location = new System.Drawing.Point (32, 120); btnUpdate.Size = new System.Drawing.Size (75, 23); btnUpdate.TabIndex = 0; btnUpdate.Text = "Update"; btnUpdate.Click += new System.EventHandler (this.btnUpdate_Click); txtContactName.Location = new System.Drawing.Point(136, 274); txtContactName.TabIndex = 11; txtContactName.Size = new System.Drawing.Size (160, 20); txtZip.Location = new System.Drawing.Point (384, 274); txtZip.TabIndex = 17; txtZip.Size = new System.Drawing.Size (160, 20);

Bi tp thc hnh Chuyn Visual Studio .NET

131

btnDelete.Location = new System.Drawing.Point(472, 120); btnDelete.Size = new System.Drawing.Size(75, 23); btnDelete.TabIndex = 2; btnDelete.Text = "Delete"; btnDelete.Click += new System.EventHandler (this.btnDelete_Click); txtContactTitle.Location = new System.Drawing.Point(136, 303); txtContactTitle.TabIndex = 19; txtContactTitle.Size = new System.Drawing.Size(160, 20); txtAddress.Location = new System.Drawing.Point(384, 216); txtAddress.TabIndex = 13; txtAddress.Size = new System.Drawing.Size (160, 20); txtCompanyName.Location= new System.Drawing.Point (136, 245); txtCompanyName.TabIndex = 9; txtCompanyName.Size = new System.Drawing.Size (160, 20); label5.Location = new System.Drawing.Point (320, 252); label5.Text = "City"; label5.Size = new System.Drawing.Size (48, 16); label5.TabIndex = 14; label6.Location = new System.Drawing.Point (320, 284); label6.Text = "Zip"; label6.Size = new System.Drawing.Size (40, 16); label6.TabIndex = 16; label7.Location = new System.Drawing.Point (40, 312); label7.Text = "Contact Title"; label7.Size = new System.Drawing.Size (88, 16); label7.TabIndex = 18; label8.Location = new System.Drawing.Point (320, 312); label8.Text = "Phone";

Bi tp thc hnh Chuyn Visual Studio .NET

132

label8.Size = new System.Drawing.Size (56, 16); label8.TabIndex = 20; label9.Location = new System.Drawing.Point (120, 120); label9.Text = "New Customer Name:"; label9.Size = new System.Drawing.Size (120, 24); label9.TabIndex = 22; label4.Location = new System.Drawing.Point (320, 224); label4.Text = "Address"; label4.Size = new System.Drawing.Size (56, 16); label4.TabIndex = 12; lbCustomers.Location = new System.Drawing.Point(32, 16); lbCustomers.Size = new System.Drawing.Size (512, 95); lbCustomers.TabIndex = 3; txtPhone.Location = new System.Drawing.Point (384, 303); txtPhone.TabIndex = 21; txtPhone.Size = new System.Drawing.Size (160, 20); btnNew.Location = new System.Drawing.Point (472, 336); btnNew.Size = new System.Drawing.Size (75, 23); btnNew.TabIndex = 5; btnNew.Text = "New"; btnNew.Click += new System.EventHandler(this.btnNew_Click); label1.Location = new System.Drawing.Point (40, 224); label1.Text = "Company ID"; label1.Size = new System.Drawing.Size (88, 16); label1.TabIndex = 6; label2.Location = new System.Drawing.Point (40, 252); label2.Text = "Company Name"; label2.Size = new System.Drawing.Size (88, 16); label2.TabIndex = 8; label3.Location = new System.Drawing.Point (40, 284);

Bi tp thc hnh Chuyn Visual Studio .NET

133

label3.Text = "Contact Name"; label3.Size = new System.Drawing.Size (88, 16); label3.TabIndex = 10; this.Text = "Customers Update Form"; this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size (584, 421); this.Controls.Add (this.label9); this.Controls.Add (this.txtPhone); this.Controls.Add (this.label8); this.Controls.Add (this.txtContactTitle); this.Controls.Add (this.label7); this.Controls.Add (this.txtZip); this.Controls.Add (this.label6); this.Controls.Add (this.txtCity); this.Controls.Add (this.label5); this.Controls.Add (this.txtAddress); this.Controls.Add (this.label4); this.Controls.Add (this.txtContactName); this.Controls.Add (this.label3); this.Controls.Add (this.txtCompanyName); this.Controls.Add (this.label2); this.Controls.Add (this.txtCompanyID); this.Controls.Add (this.label1); this.Controls.Add (this.btnNew); this.Controls.Add (this.txtCustomerName); this.Controls.Add (this.btnUpdate); this.Controls.Add (this.lblMessage); this.Controls.Add (this.btnDelete); this.Controls.Add (this.lbCustomers); }

Bi tp thc hnh Chuyn Visual Studio .NET

134

// Qun l s kin nhn nt to mi (New) protected void btnNew_Click( object sender, System.EventArgs e) { // to mt dng mi DataRow newRow = dataTable.NewRow( ); newRow["CustomerID"] = txtCompanyID.Text; newRow["CompanyName"] = txtCompanyName.Text; newRow["ContactName"] = txtContactName.Text; newRow["ContactTitle"] = txtContactTitle.Text; newRow["Address"] = txtAddress.Text; newRow["City"] = txtCity.Text; newRow["PostalCode"] = txtZip.Text; newRow["Phone"] = txtPhone.Text; // thm mt dng mi vo bng dataTable.Rows.Add(newRow); // cp nht vo c s d liu DataAdapter.Update(DataSet,"Customers"); // thng bo cho ngi dng bit cu truy vn thay i lblMessage.Text = DataAdapter.UpdateCommand.CommandText; Application.DoEvents( ); DataSet.AcceptChanges( ); // hin th li d liu cho iu khin ListBox PopulateLB( ); // Xo trng cc TextBox ClearFields( ); } // Xa trng cc TextBox private void ClearFields( ) { txtCompanyID.Text = "";

Bi tp thc hnh Chuyn Visual Studio .NET

135

txtCompanyName.Text = ""; txtContactName.Text = ""; txtContactTitle.Text = ""; txtAddress.Text = ""; txtCity.Text = ""; txtZip.Text = ""; txtPhone.Text = ""; } // qun l s kin nht nt chn cp nht (Update) protected void btnUpdate_Click( object sender, EventArgs e) { // ly v dng c chn trn ListBox DataRow targetRow = dataTable.Rows[lbCustomers.SelectedIndex]; // thng bo cho ngi bit dng cp nht lblMessage.Text = "Updating " + targetRow["CompanyName"]; Application.DoEvents( ); // hiu chnh dng targetRow.BeginEdit( ); targetRow["CompanyName"] = txtCustomerName.Text; targetRow.EndEdit( ); // ly v___ cc dng thay i DataSet DataSetChanged = DataSet.GetChanges(DataRowState.Modified); // m bo khng c dng no c li bool okayFlag = true; if (DataSetChanged.HasErrors) { okayFlag = false; string msg = "Error in row with customer ID ";

Bi tp thc hnh Chuyn Visual Studio .NET

136

// kim tra li trn tng bng foreach (DataTable theTable in DataSetChanged.Tables) { // nu bng c li th tm li trn dng c th if (theTable.HasErrors) { // ly cc dng c li DataRow[] errorRows = theTable.GetErrors( ); // duyt qua tng dng c li thng bo. foreach (DataRow theRow in errorRows) { msg = msg + theRow["CustomerID"]; } } } lblMessage.Text = msg; } // nu khng c li if (okayFlag) { // trn cc thay i trong 2 DataSet thnh mt DataSet.Merge(DataSetChanged); // cp nht c s d liu DataAdapter.Update(DataSet,"Customers"); // thng bo cu truy vn cho ngi dng lblMessage.Text = DataAdapter.UpdateCommand.CommandText; Application.DoEvents( ); // cp nht DataSet v // hin th d liu mi cho ListBox DataSet.AcceptChanges( );

Bi tp thc hnh Chuyn Visual Studio .NET

137

PopulateLB( ); } else // nu c li DataSet.RejectChanges( ); } // qun l s kin xa protected void btnDelete_Click( object sender, EventArgs e) { // ly v___ dng c chn trn ListBox DataRow targetRow = dataTable.Rows[lbCustomers.SelectedIndex]; // chun b thng bo cho ngi dng string msg = targetRow["CompanyName"] + " deleted. "; // xa dng c chn dataTable.Rows[lbCustomers.SelectedIndex].Delete( ); // cp nht thay i cho DataSet DataSet.AcceptChanges( ); // cp nht c s d liu DataAdapter.Update(DataSet,"Customers"); // hin th li ListBox vi d liu thay i PopulateLB( ); // thng bo cho ngi dng bit lblMessage.Text = msg; Application.DoEvents( ); } public static void Main(string[] args) { Application.Run(new ADOForm1( )); } }

Bi tp thc hnh Chuyn Visual Studio .NET

138

} PHN 4 XY DNG NG NG NG DUNG NG WEB VI WEBFORMS Cng ngh .NET c dng xy dng cc ng dng Web l ASP.NET, n cung cp hai vng tn kh mnh v y phc v cho vic to cc ng dng Web l System.Web v System.Web.UI. Trong phn ny chng ta s tp trung ch yu vo vic dng ngn ng C# lp trnh vi ASP.NET. B cng c Web Form cng c thit k h tr m hnh pht trin nhanh (RAD). Vi Web Form, ta c th ko th cc iu khin trn Form thit k cng nh c th vit m trc tip trong tp tin . aspx hay .aspx.cs. ng dng Web s c trin khai trn my ch, cn ngi dng s tng tc vi ng dng thng qua trnh duyt. .NET cn h tr ta b cung c to ra cc ng dng tun theo m hnh n - lp (tng - n tier), gip ta c th qun l c ng dng c d dng hn v nh th nng cao hiu sut pht trin phn mm. 4.1 Tm hiu v Web Forms Web Form l b cng c cho php thc thi cc ng dng m cc trang Web do n to ng ra c phn phi n trnh duyt thng qua mng Internet. Vi Web Forms, ta to ra cc trang HTML vi ni dung tnh v dng m C# chy trn Server x l d liu tnh ny ri to ra trang Web ng, gi trang ny v trnh duyt di m HTML chun. Web Forms c thit chy trn bt k trnh duyt no, trang HTML gi v s c gt gia sao cho thch hp vi phin bn ca trnh duyt. Ngoi dng C#, ta cng c th dng ngn ng VB.NET to ra cc ng dng Web tng t. Web Forms chia giao din ngi dng thnh hai phn: phn thy trc quan ( hay UI ) v phn trang m pha sau ca UI. Quan im ny th tng t vi Windows Form, nhng vi Web Forms, hai phn ny nm trn hai tp tin ring bit. Phn giao din UI c lu tr trong tp tin c phn m rng l .aspx, cn m c lu tr trong tp tin c phn m rng l .aspx.cs. Vi mi trng lm vic c cung cp bi b Visual Studio .NET, to cc ng dng Web n gin ch l m Form mi, ko th v vit m qun l s kin thch hp. Web Forms c tch hp thm mt lot cc iu khin thc thi trn Server, c th t kim tra s hp l ca d liu ngay trn my khch m ta khng phi vit m m t g c. 4.2 Cc s kin ca Web Forms Mt s kin (Events) c to ra khi ngi dng nhn chn mt Button, chn mt mc trong ListBox hay thc hin mt thao tc no trn UI. Cc s kin cng c th c pht sinh h thng bt u hay kt thc. Phng thc p ng s kin gi l trnh qun l s kin, cc trnh qun l s kin ny c vit bng m C# trong trang m (code-behind) v kt hp vi cc thuc tnh ca cc iu khin thuc trang.

Bi tp thc hnh Chuyn Visual Studio .NET

139

Trnh qun l s kin l mt Delegate, phng thc ny s tr v kiu void, v c hai i s. i s u tin l th hin ca i tng pht sinh ra s kin, i s th hai l i tng EventArg hay mt i tng khc c dn xut t i tng EventArgs. Cc s kin ny c qun l trn Server. 4.2.1 S kin PostBack v Non-PostBack PostBack l s kin s khin Form c gi v Server ngay lp tc, chng hn s kin trnh mt Form vi phng thc Post. i lp vi PostBack l Non- PostBack, s kin ny khng gi Form nn Server m n lu s kin trn vng nh Cache cho ti khi c mt s kin PostBack na xy ra. Khi mt iu khin c thuc tnh AutoPostBack l true th s kin PostBack s c tc dng trn iu khin :mc nhin thuc tnh AutoPostBach ca iu khin DropDownList l false,ta phi t li l true th s kin chn mt mc khc trong DropDownList ny mi c tc dng. 4.2.2 Trng thi ca ng dng Web (State) Trng thi ca ng dng Web l gi tr hin hnh ca cc iu khin v mi bin trong phin lm vic hin hnh ca ngi dng. Web l mi trng khng trng thi, ngha l mi s kin Post ln Server u lm mt i mi thng tin v phin lm vic trc . Tuy nhin ASP.NET cung cp c ch h tr vic duy tr trng thi v phin ca ngi dng. Bt k trang no khi c gi ln my ch Server u c my ch tng hp thng tin v ti to li sau mi gi xung trnh duyt cho my khch. ASP.NET cung cp mt c ch gip duy tr trng thi ca cc iu khin pha my ch (Server Control ) mt cch t ng. V th nu ta cung cp cho ngi dng mt danh sch d liu ListBox, v ngi dng thc hin vic chn la trn ListBox ny, s kin chn la ny s vn c duy tr sau khi trang c gi ln my ch v gi v cho trnh duyt cho my khch. 4.2.3 Chu trnh sng ca mt Web-Form Khi c yu cu mt trang Web trn my ch Web s to ra mt chui cc s kin my ch , t lc bt u cho n lc kt thc mt yu cu s hnh thnh mt chu trnh sng ( Life-Cycle ) cho trang Web v cc thnh phn thuc n. Khi mt trang Web c yu cu, my ch s tin hnh m ( Load ) n v khi hon tt yu cu my ch s ng trang ny li, kt xut ca yu cu ny l mt trang HTML tng ng s c gi v cho trnh duyt. Di y s lit k mt s s kin, ta c th bt cc s kin x l thch hp hay b qua ASP.NET x l mc nh. Khi to (Initialize) L s kin u tin trong chu trnh sng ca trang, ta c th khi bt k cc thng s cho trang hay cc iu khin thuc trang. M trng thi vng quan st (Load View State) c gi khi thuc tnh ViewState ca iu khin c cng b hay g. Cc gi tr trong ViewState s c lu tr trong mt bin n ( Hidden Field ), ta c th ly gi tr ny thng qua hm

Bi tp thc hnh Chuyn Visual Studio .NET

140

LoadViewState() hay ly trc tip. Kt thc (Dispose) Ta c th dng s kin ny gii phng bt k ti nguyn nguyn no: b nh hay hy b cc kt ni n c s d liu. V d: Hin th chui ln trang u tin ta cn chy Visual Studio .NET, sau to mt d n mi kiu WebApplication, ngn ng chn l C# v ng dng s c tn l ProgrammingCSharpWeb.Url mc nhin ca ng dng s c tn l http://localhost/ ProgrammingCSharpWeb. Visual Studio .NET s t hu ht cc tp tin n to ra cho ng dng trong th mcWeb mc nh trn my ngi dng, v d: D:\Inetpub\wwwroot\ProgrammingCSharpWeb. Trong .NET, mt gii php (Solution) c mt hay hiu d n (Project), mi d n s to ra mt th vin lin kt ng (DLL) hay tp tin thc thi (EXE). c th chy c ng dng Web Form, ta cn phi ci t IIS v FrontPage Server Extension trn my tnh. Khi ng dng Web Form c to, .NET to sn mt s tp tin v mt trang Web c tn mc nh l WebForm1.aspx ch cha m HTML v WebForm1.cs cha m qun l trang. Trang m .cs khng nm trong ca s Solution Explorer, hin th n ta chn Project\Show All Files, ta ch cn nhn p chut tri trn trang Web l ca s son tho m (Editor) s hin nn, cho php ta vit m qun l trang. chuyn t ca s thit k ko th sang ca s m HTML ca trang, ta chn hai Tab gc bn tri pha di mn hnh. t tn li cho trang Web bng cch nhn chut phi ln trang v chn mc Rename i tn trang thnh HelloWeb.aspx, .NET cng s t ng i tn trang m ca trang thnh HelloWeb.cs. NET cng to ra mt s m HTML cho trang: .NET pht sinh ra mt s m ASP.NET: <%@ Page language="c#" Codebehind="HelloWeb.cs" AutoEventWireup="false" Inherits="ProgrammingCSharpWeb.WebForm1" %> Thuc tnh language ch ra ngn ng lp trnh c dng trong trang m qun l trang, y l C#. Codebehide xc nh trang m qun l c tn HelloWeb.cs v thuc tnh Inherits ch trang Web c tha k t lp WebForm1 c vit trong HelloWeb.cs: public class WebForm1: System.Web.UI.Page Ta thy trang ny c tha k t lp System.Web.UI.Page, lp ny do ASP.NET cung cp, xc nh cc thuc tnh, phng thc v cc s kin chung cho cc trang pha my ch. M HTML pht sinh nh dng thuc tnh ca Form:

Bi tp thc hnh Chuyn Visual Studio .NET

141

<form id="Form1" method="post" runat="server"> Thuc tnh id lm nh danh cho Form, thuc tnh method c gi tr l POST ngha l Form s c gi ln my ch ngay lp tc khi nhn mt s kin do ngi dng pht ra ( nh s kin nhn nt ) v c IsPostBack trn my ch khi s c gi tr l true. Bin c ny c gi tr l false nu Form c trnh vi phng thc GET hay ln u tin trang c gi. Bt k iu khin no hay Form c thuc tnh runat=server th iu khin hay Form ny s c x l bi ASP.NET Framework trn my ch. Thuc tnh MS_POSITIONING =GridLayout trong th <Body>, cho bit cch b tr cc iu khin trn Form theodng li, ngoi ra ta cn c th b tr cc iu khin tri li trn trang, bng cchgn thuc tnh MS_POSITIONING thnh FlowLayout. Hin gi Form ca ta l trng, hin th mt chui g ln mn hnh, ta g dng m sau trong th <body>: Hello World! It is now <% = DateTime.Now.ToString( ) %> Ging vi ASP, phn nm trong du <% %> c xem nh l m qun l cho trang, y l m C#. Du = ch ra mt gi tr nhn c t mt bin hay mt i tng no , ta cng c th vit m trn li nh sau vi cng chc nng: Hello World! It is now <% Response.Write(DateTime.Now.ToString( )); %> Thc thi trang ny ( Ctrl-F5 ), kt qu s hin trn trnh duyt nh sau: thm cc iu khin cho trang, hoc l ta c th vit m trong ca s HTML hoc l ko th cc iu khin trn b cng ca Web Form vo ca s thit k trang. ASP.NET s t ng pht sinh ra kt qu t m HTML thnh cc iu khin cng nh t cc iu khin trn trang thit thnh m HTML tng ng. V d, ko hai RadioButton vo trang v gn cng mt gi tr no cho thuc tnh GroupName ca c hai iu khin, thuc tnh ny s lm cho cc nt chn loi tr ln nhau. M HTML ca trang trong th <Form> do ASP.NET pht sinh s nh sau: Cc iu khin ca ASP.NET, c thm ch asp: pha trc tn ca iu khin , c thit k mang tnh hng i tng nhiu hn. <asp:RadioButton> <asp:CheckBox> <asp:Button> <asp:TextBox rows="1"> <asp:TextBox rows="5">

Bi tp thc hnh Chuyn Visual Studio .NET

142

Ngoi cc iu khin ca ASP.NET, cc iu khin HTML chun cng c ASP.NET h tr. Tuy nhin cc iu khin khng to s d c trong m ngun do tnh i tng trn chng khng r rng, cc iu khin HTML chun ng vi nm iu khin trn l: <input type = "radio"> <input type="checkbox"> <input type="button"> <input type="text"> <textarea> 4.3 iu khin xc nhn hp ASP.NET cung cp mt tp cc iu khin xc nhn hp l d liu nhp pha mych cng nh di trnh duyt ca my khch. Tuy nhin vic xc nhn hp l di my khch ch l mt chn la, ta c th tt n i, nhng vic xc nhn hp l trn my ch thng qua cc iu khin ny l bt buc, nhm phng nga mt s trng hp d liu nhp l gi mo. Vic kim tra hp l ca m trn my ch l phng cc trng hp. Mt s loi xc nhn hp l: d liu khng c rng, tha mt nh dng d liu no Cc iu khin xc nhn hp l phi c gn lin vi mt iu khin nhn d liuHTML no , cc iu khin nhp c lit trong bng sau: ng vi mt iu khin nhp HTML, ta c th gn nhiu iu khin xc nhn hpl cho n, bng di y s lit k cc iu khin nhp hin c: CompareValidator So snh cc gi tr ca hai iu khin xem c bng nhau hay khng CustomValidator Gi mt hm do ngi dng nh ngha thi hnh vic kim tra RangeValidator Kim tra xem mt mc c nm trong mt min cho hay khng RegularExpressionvalidator Kim tra ngi dng c sa i mt mc ( m gi tr ca n khc vi mt gi tr ch nh ban u, ngm nh gi tr ban u l mt chui trng ) hay khng ValidationSummary Thng bo s hp l trn cc iu khin 4.4 Mt s v d mu minh ha Mt cch thun tin nht hc mt cng ngh mi chnh l da vo cc v d, vvy trong phn ny chng ta s kho st mt vi v d minh ha cho phn l thuyt ca chng ta. Nh ta bit, ta c th vit m qun l theo hai cch: hoc l vit trong tp

Bi tp thc hnh Chuyn Visual Studio .NET

143

tin .cs hoc l vit trc tip trong trang cha m HTML. y d tp trung vo cc v d ca chng ta, ta s vit m qun l trc tip trn trang HTML. Kt buc d liu Khng thng qua thuc tnh DataSource ng dng ca chng ta n gin ch hin ln trang tn khch hng v s ha n bng cch dng hm DataBind(). Hm ny s kt buc d liu ca mi thuc tnh hay ca bt k i tng. <html> <head> // m qun l C# s___ c vit trong th <script> ny <script language="C#" runat="server"> // trang s___ gi hm ny u tin, ta s___ thc hin kt buc // trc tip trong hm ny void Page_Load(Object sender, EventArgs e) { Page.DataBind(); } // ly gi tr ca thuc tnh thng qua thuc tnh // get string custID{ get { return "ALFKI"; } } int orderCount{ get { return 11; } } </script> </head> <body> <h3><font face="Verdana"> Ket buoc khong dung DataSource

Bi tp thc hnh Chuyn Visual Studio .NET

144

</font></h3> <form runat=server> Khach hang: <b><%# custID %></b><br> So hoa don: <b><%# orderCount %></b> </form> </body> </html> iu khin DataList vi DataSource Trong v d ny, ta s dng thuc tnh DataSource ca iu khin <asp:DataList> kt buc d liu, ta s cung cp cho thuc tnh DataSource ny mt bng d liu gi, sau dng hm DataBinder.Eval() kt buc d liu trong DataSource theo mt nh dng ( Format ) thch hp mong mun. D liu s c hin th ln mn hnh di dng mt bng cc ha n sau khi ta gi hm DataBind(). //Khng gian tn cha cc i tng ca ADO.NET <%@ Import namespace="System.Data" %> <html> <head> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { // nu trang c gi ln u tin if (!Page.IsPostBack) { // to ra mt bng d liu mi gm 4 ct , sau thm d // liu gi cho bng DataTable dt = new DataTable(); DataRow dr; // thm 4 ct DataColumn vo bng, mi ct c cc // kiu d liu ring dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32))); dt.Columns.Add(new DataColumn("StringValue", typeof(string))); dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime))); dt.Columns.Add(new DataColumn("BoolValue", typeof(bool)));

Bi tp thc hnh Chuyn Visual Studio .NET

145

// thm 9 dng d liu cho bng bng cch to ra // mt dng mi dng phng thc NewRow() ca i // tng DataTable, sau gn d liu gi cho // dng ny v thm dng d liu ny vo bng for (int i = 0; i < 9; i++) { dr = dt.NewRow(); dr[0] = i; dr[1] = "Item " + i.ToString(); dr[2] = DateTime.Now; dr[3] = (i % 2 != 0) ? true: false; dt.Rows.Add(dr); } // gn bng d liu cho thuc tnh DataSource ca iu // khin DataList, sau thc hin kt buc bng hm // DataBind() dataList1.DataSource = new DataView(dt); dataList1.DataBind(); } } </script> </head> <body> <h3><font face="Verdana">Ket buoc du lieu dung DataSource thong qua ham DataBind.Eval() </font></h3> <form runat=server> // iu khin danh sch cho php ta kt buc d liu kh // linh ng, ta ch cn cung cp cho n mt DataSource // thch hp, sau gi hm DataBind() hin th d liu // ln trang <asp:DataList id="dataList1" runat="server"

Bi tp thc hnh Chuyn Visual Studio .NET

146

RepeatColumns="3" Width="80%" BorderColor="black" BorderWidth="1" GridLines="Both" CellPadding="4" CellSpacing="0"> // y l mt thuc tnh ca li, khi gi hm // DabaBind(), d liu trong DataSource s___ c trch ra // (nu l danh cc i tng th mi ln trch s___ ly ra // mt phn t kiu i tng , sau dng hm // DataBinder.Eval() gn gi tr, cn nu l mt bng // d liu th mi ln kt buc s___ ly ra mt dng d // liu, hm DataBind.Eval() s___ ly d liu ca tng // trng) kt buc ln trang. N s___ lp li thao tc // ny cho ti khi d liu c kt buc ht. <ItemTemplate> //ly d liu trn ct u tin kt buc Ngay hoa don: <%# DataBinder.Eval(Container.DataItem, "DateTimeValue", "{0:d}") %> //ly d liu trn ct th 2 So luong: <%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:N2}") %> //ct th 3 Muc: <%# DataBinder.Eval(Container.DataItem, "StringValue") %> //ct th 4 Ngay hoa don: <asp:CheckBox id=chk1 Checked='<%# (bool)DataBinder.Eval(Container.DataItem, "BoolValue") %>' runat=server/><p> </ItemTemplate>

Bi tp thc hnh Chuyn Visual Studio .NET

147

</asp:Datalist> </form> </body> </html> Kt buc vi iu khin DataGrid Trong v trc, ta tm hiu s qua v cch y d liu vo thuc tnh DataSource ca iu khin DataList thng qua hm kt buc DataBind().V d ny chng ta s kho st thm v cch kt buc trn iu khin li DataGrid v cch dng iu khin xc nhn hp l trn d liu. Khi ng dng chy s hin th mt bng d liu ln trang, ngi dng c th hiu chnh bt k mt dng no trn bng d liu bng cch nhn vo chui lnh hiu chnh ( Edit ) trn li, g vo cc d liu cn hiu chnh, khi mun hy b thao tc hiu chnh ta nhn chn chui b qua (Cancel). tp trung vo mc ch ca v d, chng ta s dng bng d liu gi, cch lm s tng t trn bng d liu ly ra t c s d liu. Sau y l m ca v d: //khng gian tn cn thit truy cp n cc i tng ADO.NET <%@ Import Namespace="System.Data" %> <html> <script language="C#" runat="server"> //khai bo i tng bng v khung nhn DataTable Cart; DataView CartView; // ly d liu trong Session, nu khng c th ta s___ to ra mt // bng d liu khc void Page_Load(Object sender, EventArgs e) { if (Session["DG6_ShoppingCart"] == null) { Cart = new DataTable(); //bng s___ c 3 ct u c kiu l chui Cart.Columns.Add(new DataColumn("Qty", typeof(string))); Cart.Columns.Add(new DataColumn("Item", typeof(string))); Cart.Columns.Add(new DataColumn("Price", typeof(string))); //y nh danh ca bng vo phin lm vic hin thi Session["DG6_ShoppingCart"] = Cart;

Bi tp thc hnh Chuyn Visual Studio .NET

148

// to d liu mu cho bng for (int i=1; i<5; i++) { DataRow dr = Cart.NewRow(); dr[0] = ((int)(i%2)+1).ToString(); dr[1] = "Item " + i.ToString(); dr[2] = ((double)(1.23 * (i+1))).ToString(); Cart.Rows.Add(dr); } } else { //nu bng c sn trong Session, ta s___ ly ra dng Cart = (DataTable)Session["DG6_ShoppingCart"]; } // to ra khung nhn cho bng, sau sp xp khung nhn theo // ct Item CartView = new DataView(Cart); CartView.Sort = "Item"; // nu trang c gi ln u tin th kt buc d liu thng // qua hm BindGrid()ca ta if (!IsPostBack) { BindGrid(); } } // s kin nhn chui hiu chnh (Edit) trn li, ta s___ ly ch // mc ca dng cn hiu chnh thng qua i tng // DataGridCommandEventArgs, sau truyn ch mc ny cho iu // khin li ca ta v gi hm kt buc ca ta y d liu // ln li public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs e) {

Bi tp thc hnh Chuyn Visual Studio .NET

149

MyDataGrid.EditItemIndex = (int)e.Item.ItemIndex; BindGrid(); } //s kin nhn b qua trn li (Cancel) public void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs e) { MyDataGrid.EditItemIndex = -1; BindGrid(); } //sau khi hiu chnh d liu, ngi dng tin hnh cp nht public void MyDataGrid_Update(Object sender, DataGridCommandEventArgs e) { // ly d liu trn TextBox string item = e.Item.Cells[1].Text; string qty = ((TextBox)e.Item.Cells[2].Controls[0]).Text; string price = ((TextBox)e.Item.Cells[3].Controls[0]).Text; // y, do chng ta dng d liu gi lu trn b nh chnh, // nu dng c s d liu th chng ta s___ tin hnh hiu chnh // trc tip trong c s d liu bng cc cu truy vn: // UPDATE, SELECT, DELETE //xa dng c CartView.RowFilter = "Item='"+item+"'"; if (CartView.Count > 0) { CartView.Delete(0); } CartView.RowFilter = ""; //to dng mi v thm vo bng DataRow dr = Cart.NewRow(); dr[0] = qty; dr[1] = item; dr[2] = price;

Bi tp thc hnh Chuyn Visual Studio .NET

150

Cart.Rows.Add(dr); MyDataGrid.EditItemIndex = -1; BindGrid(); } //kt buc d liu thng qua thuc tnh DataSource ca li public void BindGrid() { MyDataGrid.DataSource = CartView; MyDataGrid.DataBind(); } </script> <body style="font: 10pt verdana"> <form runat="server"> <h3><font face="Verdana">Using an Edit Command Column in DataGrid</font></h3> //Khai bo cc thng s cho li, cc s kin trn li: OnEditCommand: khi ngi dng nhn chui hiu chnh (Edit) OnCancelCommand: nhn chui b qua hiu chnh (Cancel) OnUpdateCommand: nhn chui cp nht hiu chnh (Update) <asp:DataGrid id="MyDataGrid" runat="server" BorderColor="black" BorderWidth="1" CellPadding="3" Font-Name="Verdana" Font-Size="8pt" HeaderStyle-BackColor="#aaaadd" OnEditCommand="MyDataGrid_Edit" OnCancelCommand="MyDataGrid_Cancel" OnUpdateCommand="MyDataGrid_Update" AutoGenerateColumns="false" >

Bi tp thc hnh Chuyn Visual Studio .NET

151

// cc thng s hiu chnh trn ct, y ta ch cho ngi // dng hiu chnh trn ct s lng v gi ha n <Columns> <asp:EditCommandColumn EditText="Edit" CancelText="Cancel" UpdateText="Update" ItemStyle-Wrap="false" HeaderText="Edit Command Column" HeaderStyle-Wrap="false" /> <asp:BoundColumn HeaderText="Item" ReadOnly="true" DataField="Item"/> <asp:BoundColumn HeaderText="Quantity" DataField="Qty"/> <asp:BoundColumn HeaderText="Price" DataField="Price"/> </Columns> </asp:DataGrid> </form> </body> </html> iu khin xc nhn hp l Vic xc nhn hp l l cn thit vi cc ng dng cn yu cu nhp liu, vic a ra cc iu khin c kh nng xc nhn hp l trc tip di my khch ln trn my ch, y c th l mt tnh nng mi ca ASP.NET, ta khng cn phi vit m kim tra g c, m kim tra di trnh duyt ( chng hn nh Java Script ) s c ASP.NET t ng pht sinh. gn mt iu khin bt li vo mt iu khin cn bt li ta ch cn gn thuc tnh ControlToValidate ca iu khin bt li bng gi tr nh danh id ca iu khin cn bt li, v d: bt li iu khin TextBox khng c trng, ta vit m nh sau: //iu khin cn bt li <ASP:TextBox id=TextBox1 runat=server /> //iu khin bt li hp nhp liu TextBox1

Bi tp thc hnh Chuyn Visual Studio .NET

152

<asp:RequiredFieldValidator id="RequiredFieldValidator2" ControlToValidate="TextBox1" ErrorMessage="Card Number. " Display="Static" Width="100%" runat=server> * </asp:RequiredFieldValidator> V d ca chng ta s cho hin th 2 hp thoi DropDownList, 2 nt chn RadioButton v mt hp thoi nhp TextBox, nu tn ti mc nhp no trng khi nhn nt xc nhn Validate, th cc iu khin xc nhn hp l s hin th li tng ng. Thng ip li c th c hin th theo ba cch khc nhau: lit k theo danh sch (List), lit k trn cng mt dng ( Single Paragraph ), lit k danh sch vi du chm trn u ( Bullet List ). M hon chnh ca v d c lit k nh sau: // khng cho php iu khin xc nhn hp l di my khch bng // cch gn thuc tnh clienttarget = downlevel <%@ Page clienttarget=downlevel %> <html> <head> <script language="C#" runat=server> // thay i ch___ hin th li bng cch chn 1 trong 3 mc // trong hp thoi ListBox void ListFormat_SelectedIndexChanged(Object Sender, EventArgs E ) { valSum.DisplayMode = (ValidationSummaryDisplayMode) ListFormat.SelectedIndex; } </script> </head> <body> <h3><font face="Verdana">V d v___ xc nhn iu khin hp l ValidationSummary</font></h3> <p>

Bi tp thc hnh Chuyn Visual Studio .NET

153

<form runat="server"> <table cellpadding=10><tr> <td> <table bgcolor="#eeeeee" cellpadding=10><tr><td colspan=3> <font face=Verdana size=2><b>Credit Card Information</b></font></td></tr> <tr> <td align=right> <font face=Verdana size=2>Card Type:</font></td> <td> // danh sch cc nt chn c bt li bi iu //khin xc nhn hp l RequireFieldValidator1 <ASP:RadioButtonList id=RadioButtonList1 RepeatLayout="Flow" runat=server> <asp:ListItem>MasterCard</asp:ListItem> <asp:ListItem>Visa</asp:ListItem> </ASP:RadioButtonList> </td> //iu khin xc nhn hp l cho cc nt chn //RadioButtonList1 <td align=middle rowspan=1> <asp:RequiredFieldValidator id="RequiredFieldValidator1" ControlToValidate="RadioButtonList1" ErrorMessage="Card Type. " Display="Static" InitialValue="" Width="100%" runat=server> * </asp:RequiredFieldValidator> </td></tr> <tr> <td align=right> <font face=Verdana size=2>Card Number:</font>

Bi tp thc hnh Chuyn Visual Studio .NET

154

</td> <td> <ASP:TextBox id=TextBox1 runat=server /> </td> <td> //iu khin xc nhn hp l trn hp thoi //nhp liu TextBox, nu chui l trng khi //nhn nt Validate th s___ b bt li. <asp:RequiredFieldValidator id="RequiredFieldValidator2" ControlToValidate="TextBox1" ErrorMessage="Card Number. " Display="Static" Width="100%" runat=server> * </asp:RequiredFieldValidator> </td> </tr> <tr> <td align=right> <font face=Verdana size=2>Expiration Date:</font> </td> <td> //hp thoi DropDownList dng hin th //danh sch cc ngy, nu ngi dng chn //mc trng trong DropDownList ny th s___ b //iu khin xc nhn hp l //RequireFieldValidator3 bt li <ASP:DropDownList id=DropDownList1 runat=server> <asp:ListItem></asp:ListItem> <asp:ListItem >06/00</asp:ListItem> <asp:ListItem >07/00</asp:ListItem> <asp:ListItem >08/00</asp:ListItem> <asp:ListItem >09/00</asp:ListItem>

Bi tp thc hnh Chuyn Visual Studio .NET

155

<asp:ListItem >10/00</asp:ListItem> <asp:ListItem >11/00</asp:ListItem> <asp:ListItem >01/01</asp:ListItem> <asp:ListItem >02/01</asp:ListItem> <asp:ListItem >03/01</asp:ListItem> <asp:ListItem >04/01</asp:ListItem> <asp:ListItem >05/01</asp:ListItem> <asp:ListItem >06/01</asp:ListItem> <asp:ListItem >07/01</asp:ListItem> <asp:ListItem >08/01</asp:ListItem> <asp:ListItem >09/01</asp:ListItem> <asp:ListItem >10/01</asp:ListItem> <asp:ListItem >11/01</asp:ListItem> <asp:ListItem >12/01</asp:ListItem> </ASP:DropDownList> </td> <td> //iu khin xc nhn hp l trn //DropDownList1 hin th ngy ht hn, nu //ngi dng chn mt mc trng trn //DropDownList th iu khin ny s___ pht //sinh ra li <asp:RequiredFieldValidator id="RequiredFieldValidator3" ControlToValidate="DropDownList1" ErrorMessage="Expiration Date. " Display="Static" InitialValue="" Width="100%" runat=server> * </asp:RequiredFieldValidator></td> </tr>

Bi tp thc hnh Chuyn Visual Studio .NET

156

<tr> <td> //nt nhn xc nh hp l <ASP:Button id=Button1 text="Validate" runat=server /></td></tr> </table> </td> <td valign=top> <table cellpadding=20><tr><td> //iu khin dng hin th cc li ln trang, //n s___ bt bt k li no c pht sinh bi cc //iu khin DropDownList hin th <asp:ValidationSummary ID="valSum" runat="server" HeaderText="You must enter a value in the following fields:" Font-Name="verdana" Font-Size="12" /> </td></tr></table> </td> </tr> </table> <font face="verdana" size="-1">Select the type of validation summary display you wish: </font> //Danh sch lit k 3 cch hin th li <asp:DropDownList id="ListFormat" AutoPostBack=true OnSelectedIndexChanged="ListFormat_SelectedIndexChanged" runat=server > <asp:ListItem>List</asp:ListItem> <asp:ListItem selected>Bulleted List</asp:ListItem> <asp:ListItem>Single Paragraph</asp:ListItem> </asp:DropDownList> </form>

Bi tp thc hnh Chuyn Visual Studio .NET

157

</body> </html>

4.5 Cc dch v Web Hin nay, vn cn mt s hn ch ln trong cc ng dng Web. Ngi dng b gii hn ch thc hin c nhng ni dung c cu trc cho mt trang c th v xem d liu thng qua mt s giao din c th no c thit k trn my ch. Do ngi dng mun ly c thng tin c linh ng v hiu qu hn. Hn na, thay v ta hin th thng tin thng qua trnh duyt Web, ta mun chy mt phn mm trc tip trn my khch m c th trao i d liu trn my ch tu . Cng ngh .NET cho php xy dng cch dch v Web ( Web Services ) p ng c cc yu cu trn. tng chnh l: thay v lit k cc thng tin theo dng HTML, trang to sn mt lot cc lnh gi hm. Cc lnh gi hm ny c th trao i thng tin qua li gia cc h c s d liu trn my ch. Cc hm ny c th chp nhn cc tham s v c th tr v mt gi tr ty . Cc dch v Web vn da trn giao thc HTTP truyn d liu, ng thi n cn phi s dng thm mt loi giao thc phc v cho vic gi hm. Hin nay c hai giao thc c dng ch yu l: SOAP ( Simple Object Access Protocol ) v SDL ( Service Description Language, y l giao thc ring ca Microsoft ). C hai giao thc ny u c xy dng da trn XML, mc ch chung ca chng l gip nh ngha cc lnh gi hm, tham s v gi tr. Ngoi ra, Microsoft cng a ra thm mt tng mi v tp tin Discovery File, c phn m rng l .disco. Tp tin dng ny dng cung cp cc thng tin cho cc trnh duyt cc trnh duyt ny c th xc nh c cc trang trn cc my ch m c cha cc dch v Web. Sau y, ta s tm hiu mt v d nhm minh ha vic to ra mt dch v Web, ng vai tr l mt th vin cha mt tp cc hm tin ch. Trang Web ca chng ta s s dng cc hm ca dch v ny. Dch v Web ca chng s c tn MathService, n gin l nh ngha bn phng thc cng, tr, nhn, chia trn hai s thc bt k. Mi phng thc u nhn vo hai i s kiu s thc v tr v kt qu cng c kiu s thc. u tin ta cn to mt d n kiu Web Service bng cch chn: New Project\Visual C# Project\ASP.NET Web Service v t tn cho d n l MathService v i tn dch v thnh MathService.asmx. NET c to sn cho chng ta mt s tp tin nh: Service1.asmx: c trnh duyt yu cu, tng t vi tp tin .aspx. WebService1.cs: trang cha m C# qun l. DiscoFile1.disco: tp tin khm ph.

Bi tp thc hnh Chuyn Visual Studio .NET

158

Trong v d ny, chng ta s to ra mt Web Form mi v thit giao din nh sau: Web Form s gi thc thi cc hm ca dch v Web. D n ca ta s tha k namespace l System.Web.Services.WebService,ni cha cc thuc tnh v phng thc cn thit to dch v Web. public class MathService: System.Web.Services.WebService Trn mi phng thc ta cn khai bo thuc tnh [WebMethod], ch ra y l phng thc s c s dng cho dch v Web. M ca tp tin dch v s nh sau: using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; namespace MathService { public class MathService:System.Web.Services.WebService { public MathService() { InitializeComponent(); } #region Component Designer generated code private IContainer components = null; private void InitializeComponent() { } protected override void Dispose( bool disposing ) { if(disposing && components != null) {

Bi tp thc hnh Chuyn Visual Studio .NET

159

components.Dispose(); } base.Dispose(disposing); } #endregion //4 hm ton hc ca dch v Web, trn mi phng thc //ta cn khai bo thuc tnh [WebMethod] ch y l //phng thc dnh cho dch v Web. [WebMethod] public float Add(float a, float b) { return a + b; } [WebMethod] public float Subtract(float a, float b) { return a - b; } [WebMethod] public float Multiply(float a, float b) { return a * b; } [WebMethod] public float Divide(float a, float b) { if (b==0) return -1; return a / b; } }

Bi tp thc hnh Chuyn Visual Studio .NET

160

} By gi chng ta s vit m thc thi cho trang Web. Trang Web ca chng ta s gi cc hm ca dch v tng ng vi cc php cng, tr, nhn, chia . Sau y l m ca trang Web: <%@ Import Namespace="MathService" %> <html> <script language="C#" runat="server"> float operand1 = 0; float operand2 = 0; public void Submit_Click(Object sender, EventArgs E) { try { operand1 = float.Parse(Operand1.Text); operand2 = float.Parse(Operand2.Text); } catch (Exception) { /* b qua li nu c */ } Cc dch v Web Gvhd: Nguyn Tn Trn Minh Khang 195 //to ra mt i tng dch v MathService c th truy cp n //cc hm thnh vin ca chng. MathService service = new MathService(); switch (((Control)sender).ID) { case "Add": Result.Text = "<b>Result</b> = " + service.Add(operand1, operand2).ToString(); break; case "Subtract": Result.Text = "<b>Result</b> = " + service.Subtract(operand1, operand2).ToString(); break; case "Multiply": Result.Text = "<b>Result</b> = " + service.Multiply(operand1, operand2).ToString(); break; case "Divide": Result.Text = "<b>Result</b> = " +

Bi tp thc hnh Chuyn Visual Studio .NET

161

service.Divide(operand1, operand2).ToString(); break; } } </script> <body style="font: 10pt verdana"> <h4>Using a Simple Math Service </h4> <form runat="server"> <div style="padding:15,15,15,15;backgroundcolor: beige;width:300;border-color:black;borderwidth: 1;border-style:solid"> Operand 1:<br> <asp:TextBox id="Operand1" Text="15" runat="server" /><br> Operand 2:<br> <asp:TextBox id="Operand2" Text="5" runat="server" /><p> <input type="submit" id="Add" value="Add" OnServerClick="Submit_Click" runat="server"> <input type="submit" id="Subtract" value="Subtract" OnServerClick="Submit_Click" runat="server"> <input type="submit" id="Multiply" value="Multiply" OnServerClick="Submit_Click" runat="server"> <input type="submit" id="Divide" value="Divide" OnServerClick="Submit_Click" runat="server"> <p> <asp:Label id="Result" runat="server" /> </div> </form> </body>

Bi tp thc hnh Chuyn Visual Studio .NET

162

</html>

PHN PHU LUC Ph lc A Chui kt ni cho cc loi ngun d liu

Ph lc B Bng tng quan/chuyn i kiu d liu .NET Framework vi cc Data Provider .NET Framework System.Data.DbType SqlDbType OleDbType OdbcType type bool byte byte[] Boolean Byte Binary Bit TinyInt Boolean UnsignedTinyInt Bit TinyInt Binary

VarBinary. Vic VarBinary chuyn i ngm nh ny l khng ng nu mng byte l ln hn kch thc ti a ca mt VarBinary (8000 bytes). Khng h tr. Char DBTimeStamp Decimal Double Single SmallInt Int BigInt Variant DateTime Decimal Float Real SmallInt Int BigInt Variant

char DateTime Decimal double float Guid Int16 Int32 Int64 object string DateTime Decimal Double Single Guid Int16 Int32 Int64 Object String

Char DateTime Numeric Double Real SmallInt Int BigInt Khng h tr. NVarChar

UniqueIdentifier Guid

UniqueIdentifi

NVarChar. VarWChar Chuyn i ngm nh ny l khng ng nu string ln hn kch

Bi tp thc hnh Chuyn Visual Studio .NET

163

.NET Framework System.Data.DbType type

SqlDbType thc ti a ca mt NVarChar (4000 k t).

OleDbType

OdbcType

TimeSpan UInt16 UInt32 UInt64

Time UInt16 UInt32 UInt64 AnsiString Currency Date SByte StringFixedLength Time VarNumeric

Khng h tr. Khng h tr. Khng h tr. Khng h tr. VarChar Money Khng h tr. Khng h tr. NChar Khng h tr. Khng h tr.

DBTime UnsignedInt UnsignedBigInt VarChar Char Currency DBDate TinyInt WChar DBTime VarNumeric

Time BigInt Numeric VarChar Char Khng h tr. Date Khng h tr. NChar Time Khng h tr.

UnsignedSmallInt Int

AnsiStringFixedLength Char

Bi tp thc hnh Chuyn Visual Studio .NET

164

PHN TAI LIU THAM KHAO (1) Stephen C. Perry, Core C# and .NET, Prentice Hall PTR, 2005 (2) Microsoft Corporation, MSDN 2005

Bi tp thc hnh Chuyn Visual Studio .NET

165

You might also like