You are on page 1of 133

HNG DN LP TRNH

VISUAL BASIC .NET


Tc gi www.vivosoft.com

Bi 1 Microsoft .NET Framework


Xin co li: rt tic l server chng ti khng cho php cha cc files MP3 nn chng ti s tm cch khc cho c gi download sau. Nu cc bn c kin hay v cch cho download cc MP3 files ny th xin lin lc vi webmaster. Thu m bi ging (MP3) Week 1.1 Week 1.2 Week 1.3 Week 1.4 Week 1.5 Week 1.6 Week 1.7 Week 1.8 Ci t Visual Studio.NET Beta 2 Visual Studio.NET nm trong 3 CDs, gm c 4 files: EN_VS_NET_BETA2_WINCUP.exe EN_VS_NET_BETA2_CD1.exe EN_VS_NET_BETA2_CD2.exe EN_VS_NET_BETA2_CD3.exe download size 1.2 mb 1.2 mb 0.6 mb 1.2 mb 1.2 mb 1.2 mb 1.4 mb 1.4 mb

Chy EN_VS_NET_BETA2_WINCUP.exe Unzip n vo mt folder trong mt harddisk (eg: E:\CD\WINCUP) . Ln lt chy EN_VS_NET_BETA2_CD1.exe, EN_VS_NET_BETA2_CD2.exe v EN_VS_NET_BETA2_CD3.exe Unzip chng vo chung mt folder trong mt harddisk (eg: E:\CD ). Vic Unzip files c th rt lu, bn phi kin nhn ch cho n khi n kt thc. Nu khng, khi ci t c th b than phin l thiu files. K , trc ht chy Setup.exe ca Windows Component Update nh di y, click No khi Warning dialog hin ra:

Tip theo, chy Setup.exe ca Visual Studio.NET:

Bn nn c CPU Pentium III, 500MHz tr ln, vi 256 MB RAM v t nht 10GB Harddisk. V OS bn nn dng Windows 2000 (Professional hay Server) hay Windows XP. L do chnh l cc versions Windows ny h tr Unicode v c Internet Information Server (IIS) h tr ASPX ta dng cho ASP.NET. M cc Samples ca QuickStart Trc khi expand Samples ca Quickstart bn cn phi ci t IIS. Nu cha lm vic y bn b CD ca Windows2000 hay WindowsXP vo install IIS component. QuickStart Samples ca .NET Framework cha cc gii thch cn bn v nhiu th d. expand cc Samples doubleclick Webpage Starthere.htm nh trong hnh di y:

Khi trang Web ca QuickStart hin ra, click QuickStart, tutorials and samples ri sau theo ch dn tng bc.

Trang Framework SDK QuickStart Tutorials cho ta cc bi tp ca ASP.NET, Windows Forms v How Do I...

Nh nguyn cc folders ca Unzipped files (E:\CD, E:\CD\WINCUP), ng delete chng, v .NET s cn dng chng. Ngoi ra, nu sau ny .NET b corrupted v conflict vi cc application software khc, bn c th ci t .NET li. Gii hn ca Software Tools hin gi Architect ca application software hin gi c ni chung ba tng (three tiers): tng giao din (Presentation Tier), tng gia (Middle Tier) v tng d kin (Data Tier): Presentation Tier: Trong desktop Client ta dng VB6 v ni vi middle tier qua DCOM. Trong browser based Client ta dng Javascript hay Java applet. T browser based Client ta dng http ni vi middle tier qua IIS/ASP (c th dng COM y). Middle Tier: Cha cc rules validate data trn client v cc business rules khc. Ta dng VB6 y, nhng cch trin khai COM vi nhng Object Oriented Programming concepts rc ri hn bnh thng. Ta phi thit k sao cho cc components scale well (dng cho mi c). C khi dng Microsoft Transaction Server trn Windows NT hay COM+ Services trn Windows 2000. Lp rp cc versions ca components l mt thch thc ln. Nhiu khi middle tier cn ni chuyn vi cc database qua HTTP, ADO v CDO (Collaborative Data Objects), .v.v.. Data Tier: Thng l relational database nh Microsoft SQL Server hay Oracle. Ngoi ra cn c Exchange hay cc database xa ca mainframe. Do ta thy: Desktop tools khng thch hp cho Distributed System hay Internet Phi dng nhiu th codes nh VB6 Code, VBScript, JavaScript, Dynamic HTML, Cascading Style Sheet, VC++, Stored Procedures (Transact-SQL trong SQLServer hay PL-SQL trong Oracle). Ty thuc qu nhiu vo central database: Ngay c ADO d l tin dng cng i hi Client lun lun connect vi Server. iu ny khng thch hp cho Internet applications, v bn cht ca Internet l stateless (khng gi trng thi), mi ln cn lm vic mi connect li mt cht thi. DLL "Hell": Cc ActiveX cn phi c registered vi Windows Registry, ch c mt version c chp nhn. Nu version mi nht ca mt DLL khng compatible vi cc versions trc m applications trn my ang cn th c rc ri. Gii hn ca VB6

Thiu kh nng inheritance (tha k) v mt s Object Oriented features khc. Kh nng Error handling gii hn: On Error Goto ..., On Error Resume Next Nhiu khi cn phi gi Windows API lm nhng vic VB6 khng h tr: vic ny khng t nhin v i khi nguy him. Khng c multi-threading: khng th on trc response ca code chy trong cc windows ca cng mt VB6 application. Ngay c gii quyt vn multitasking bng Timers cng khng ng tin cy. Khng d dng chung vi cc ngn ng khc nh VC++. Khng tin cho Web development: WebClass khng thnh cng lm. t ai chu cho ta ci ActiveX trn my ca h.

.NET Framework .NET c developed t u nm 1998, lc u c tn l Next Generation Windows Services (NGWS). N c thit k hon ton t con s khng dng cho Internet. Vin tng ca Microsoft l xy dng mt globally distributed system, dng XML (cha nhng databases t hon) lm cht keo kt hp chc nng ca nhng computers khc nhau trong cng mt t chc hay trn khp th gii. Nhng computers ny c th l Servers, Desktop, Notebook hay Pocket Computers, u c th chy cng mt software da trn mt platform duy nht, c lp vi hardware v ngn ng lp trnh. l .NET Framework. N s tr thnh mt phn ca MS Windows v s c port qua cc platform khc, c th ngay c Unix. Mc du hy cn l Beta, .NET Framework rt stable v Visual Studio.NET rt t bugs, c th dng cho software development ngay t by gi. Hin nay c mt s sch v lp trnh .NET do Wrox v Oreilly xut bn.

Cc phn chnh ca Microsoft.NET Framework:

.NET application c chia ra lm hai loi: cho Internet gi l ASP.NET, gm c Web Forms v Web Services v cho desktop gi l Windows Forms. Windows Forms ging nh Forms ca VB6. N h tr Unicode hon ton, rt tin cho ch Vit v tht s Object Oriented. Web Forms c nhng Server Controls lm vic ging nh cc Controls trong Windows Forms, nht l c th dng codes x l Events y ht nh ca Windows Forms. im khc bit chnh gia ASP (Active Server Pages) v ASP.NET l trong ASP.NET, phn i din visual components v code nm ring nhau, khng ln xn nh trong ASP. Ngoi ra ASP.NET code hon ton Object Oriented. Web Services ging nh nhng Functions m ta c th gi dng t cc URL trn Internet, th d nh Credit Card authorisation. ADO.NET l mt loi cache database nho nh (gi l disconnected database) thay th ADO. Thay v application connects vnh vin vi database m qua ADO, application trong .NET lm vic vi portable

database ch cha mt hai tables, l copy t database m. Khi no cn, portable database ny (ADO.NET) s c reconciled vi database m update cc thay i. Hai tables trong ADO.NET c th c related nhau trong Master/Details relationship. V ADO.NET c cha original data ln data mi nht nn Rollback trong ADO.NET rt d dng v nh k. XML c ym tr ti a. Nm pha sau ADO.NET l XML. XML c th l Table of records trong ADO.NET hay Tree of nodes trong DOM (Document Object Model). IO c h tr bng ton b Stream k c Memory Stream v StreamReader/StreamWriter. Thm vo l DataFormatting cho Serialisation cha Object xung binary file hay text file. TCP/IP v http l hai protocols thng dng nht trong .NET, nhng chng lm vic pha sau sn khu gip ta gi mt remote procedure (nm trn computer khc) d dng nh mt local procedure. K thut y gi l Remoting. Security h tr Cryptography, Permissions v Policy. Diagnostics cho ta Debug v Trace. Threading rt tin v n gin implement Lightweight Process. Vn Timing trong .NET program rt linh ng, hiu qu v chnh xc. Vic thit k Common Language Runtime nhm vo cc mc tiu chnh sau y: Vic trin khai n gin v nhanh hn: developers s dnh th gi quyt nh rp nhng software components no li vi nhau nhiu hn l lp trnh tht s. Cc cng tc thit yu ("plumbing") nh memory management, process communication .v.v. c lo liu t ng. Cc cng c h tr rt y (no more API): .NET Framework Base classes rt phong ph cho file, network, serialisation, m ha, XML, database, v.v.. Ci t n gin v an ton (no more DLL "hell"): ch cn xcopy files, ging nh thi vng son ca DOS. L do l .NET application chy trn .NET framework, mt khi ta ci .NET framework vo my ri th c y mi .DLL cn thit. C l trong tng lai Microsoft ci .NET framework chung vi Windows. Dng cho t WindowsCE n Desktop, n Web (scalability).

Metadata Metadata l cc d kin ct ngha cho ta bit v d kin. Th d XML Schema ca mt XML file l metadata ct ngha v data structure ca data trong XML file. Chnh ci XML Schema cng l mt XML file. Cc .NET application components, gi l Assembly, cha rt nhiu metadata ct ngha v chnh n (self describing). Tm bit v mt .NET application c th lm vic vi n th gi l Reflection. H tr v phi hp mi ngn ng lp trnh Common Language Runtime (CLR) l trung tm im ca .NET Famework, n l hm my chy cc nng tnh ca .NET. Trong .NET, mi ngn ng lp trnh u c compiled ra Microsoft Intermediate Language (IL) ging ging nh byte code ca Java. Nh bt buc mi ngn ng u phi dng cng cc loi data types

(gi l Common Type System) nn Common Language Runtime c th kim sot mi interface, gi gia cc components v cho php cc ngn ng c th hp tc nhau mt cch thng sut. Tc l trong .NET, VB.NET program c th inherit C# program v ngc li mt cch hon ton t nhin. iu ny chng nhng gip cc VC++ hay Java programmers bt u dng C# mt cch d dng m cn lm cng mt d n vi VB.NET programmers na. Nu VC++ linh ng v hiu nng hn VB6, th C# chng khc g VB.NET. Bn c th port C# code qua VB.NET code rt d dng. V source code VC++ v Java gn gi C# hn VB6 vi VB.NET nn ngoi i c nhiu C# code hn VB.NET. Do , mc du hai ngn ng VB.NET v C# u ngang c nhau, nu dng C# bn c li im c nhiu source code sn v nht l lu nay ngi ta vn mang n tng rng VC++ hay Java programmers mi tht s l cc cao th lp trnh, v c khuynh hng tr lng cc guru VC++/Java cao hn VB programmers. Khi chy .NET application, n s c compiled bng mt JIT (Just-In-Time) compiler rt hiu nng ra machine code chy. im ny gip .NET application chy nhanh hn Java interpreted code trong Java Virtual Machine. Just-In-Time cng c ngha l ch phn code no cn x l trong lc y mi c compiled. IL code chy trong CLR uc ni l managed code. .NET code c th chy chung vi ActiveX, nhng code trong ActiveX c gi l unmanaged code, tc l CLR khng chu trch nhim. Ngoi vic allocation v management of memory, CLR cn gi cc refrerence n objects v rc (handle garbage collection), tc l thu li cc mnh vn memory khi chng khng cn dng na. Trc y, mi khi mt DLL uc loaded vo memory, system s ghi nhn c bao nhiu task dng n khi task cui cng chm dt th system unload DLL v tr li phn memory n dng trc y system dng cho chuyn khc. Ch nu allocate memory dng m khng nh dispose n th s b memory leak (r ), ln ln ta dng ht memory, b bt buc phi reboot OS. Nhng by gi .NET dng mt process c lp lm vic garbage collection. Ci phn ng ph ca vic ny l khi ta Dispose mt Object ri, ta vn khng bit chc chn chng no n mi tht s bin mt. V garbage collector l mt low priority process lm vic trong background, ch khi no system memory gn cn n mi nng cao priority ln. D nhin, nu mun, ta c th i hi system Dispose mt Object ngay lp tc. Assembly

.NET application xy dng t cc assemblies. Mi assembly phi c mt manifest. C th n nm ring trong mt file hay nm bn trong mt module. Manifest cha nhng metadata sau y:

10

Tn v Version number ca assembly Nhng assembly khc (k c version number ca assembly) m assembly ny ty thuc vo chy Types (classes v members) m assembly ny cho xut khu Assembly ny i hi iu kin an ninh no (security permissions)

Manifest cho php ta dng hn mt version ca assembly (tng ng vi DLL trc y) cng mt lc. T y khng cn register DLL na. Thay vo , ta ch cn copy cc assembly vo mt subfolder /bin ca chng trnh chnh. Quyt nh ca bn Sau khi bit qua v .NET, cu hi bn s t ra l bn c nn hc lp trnh trn .NET hay khng. Ni chung, v lp trnh c nhiu tn gio nh VC++/Java, VB6, Delphi ..v.v.. Bn c th chn gia C# v VB.NET. i vi VB6 programmers, hc lp trnh VB.NET s mt mt thi gian, nhng khng kh. Nn nh rng .NET khng phi ch cho ta cc ngn ng lp trnh, m c mt h thng trin khai phn mm ch trng vo mc tiu hn l cch thc. Cc li ch .NET cng hin cho bn cch thc tin l: K thut .NET s honh hnh trn giang h trong t 5 n 10 nm ti. Tnh trung bnh, lp trnh trong .NET s tit kim th gi cho bn t 25% n 50% so vi trc y. L do l trong .NET bn s nghin cu dng component no nhiu hn l tht s vit code. Hn na, hu nh code no bn cn phi vit, bn s dng n li trong tng lai. V bo tr .NET code th li cng khe hn trc y, v chnh bn c vit bao nhiu code (c th b bugs) u m bo tr.

Do , c l trong tng lai .NET programmers chng ta s ng n 10 gi sng mi thc, mt ngy ch cn lm vic vi ting, rnh rang lm vn, cu c. Trong bi ti ta s hc v Visual Studio.NET interface v bt u vit th mt program Demo

Bi 2 Visual Studio.NET
Visual Studio.NET chy VisualStudio.NET bn cn phi Set Time ca Windows li trc cui thng 7,2001, eg: 1-July-2001. Visual Studio.NET Beta 2 hin nay c Service Pak 2, n cho php ta dng Visual Studio.NET Beta 2 sau ngy 31-July-2001, tc l khng c time-bomb. Nu VS.NET version ca bn b gii hn v thi gian ni trn, t trong VS.NET bn c th download Service Pak 2 ci t bng cch dng IDE Menu Command Help | Check for Updates. C hai cch bt u mt project mi trong VS.NET. Hoc Click New Project trong trang Web StartPage nh di y:

Hoc dng Menu command File | New | Project ging nh trong VB6 IDE:

11

Khi Add New Project, Name s l subfolder name ca New Project. Bn c th chn VB.NET, C# hay VC++.NET project. Trong tng lai chng ta s ch nhm vo VB.NET v C# thi. Ngoi ra SetUp and Deployment by gi l mt loi project nm trong IDE ca Visual Studio.NET, ta khng cn phi chy ring chng trnh Package and Deployment bn ngoi VB6 IDE nh trc y. Solution trong VS.NET c th cha hn mt Project v bao gm tt c nhng files bn lit ra l cn thit cho Solution. Nu mt trong nhng files y b thay i bn ngoi VS.NET, khi VS.NET khm ph ra n s load vo trong VS.NET cho bn nu bn ng .

m mt Solution/Project c sn, bn c th click link ca tn project trn trang StartPage, hay dng Menu command File | Open | Project , hay Menu Command File | Recent Projects. Visual Studio.NET IDE

12

Giao din ca VS.NET c nhng c im ging nh Delphi v Visual InterDev ch code c generated t ng, Windows nm chung thnh Tab set hay float khp ni, v h tr Solution rt thch hp cho vic trin khai ca c i. Toolbox bn tri cha Controls cho Windows Forms, Web Forms, General Components, Data Components, HTML tags, XML Schema tools v.v... Khi mt Form ang hin th, click ln mt button trong Toolbox chn Tool Set bn cn. Toolbox trng thi Fixed displayed (nh trong hnh trn) khi cy ghim pha trn m xung. Bn c th click cy ghim cho n nm ngang v vertical Toolbox tab hin ra bn tri. Lc y, Toolbox trong trng thi Auto Hide (hin ra/rt vo) nh di y:

Bn c th gi hu ht cc Windows hin th bng cch dng Menu commands View, View | Other Windows v Debug | Windows:

13

Cc Windows bn phi c th float, nm chng ln nhau thnh nhng Tabs trong mt Window set hay nm cnh nhau vertically tiled. Nm Tittle bar di nguyn mt Window set i. Nm Window Tab ca mt Window set ko ch mt Window ra. Bn c th chng hai Windows li vi nhau bng cch nm Tittle bar ca mt Window chng ln mt Window khc. Th nhch i, nhch li, trc khi bung Window ra lm quen vi kt qu. Pha di c Task List Window bn gi s sch v din tin ca d n v qun l c i. Khi bn dng menu command Build | Build compile program, nu c errors chng s c hin th trong Task List Window. Double click ln mt hng error mang cursor n ch gy ra error y trong code window. Trong hnh di y, ta c comment out hng Dim sw As StreamWriter:

Ngoi ra, Debug by gi bn c Output Window in ra cc messages m trong VB6 bn dng Immediate Window. Th d trong VB6 bn vit:

14

Debug.Print "Count=" & CStr(Count) in ra trong Immediate Window, th trong VB.NET bn c th vit: Console.WriteLine("Count= {0}", Count) in ra trong Output Window. D nhin bn vn c th tip tc dng Immediate Window trong cng tc Debug nh trc y trong VB6. Cha ht, VS.NET cn cho bn Command Window ta c th enter nhng VS.NET commands manipulate IDE, x l macros, .v.v hin th Window ny bn dng menu command View | Other Windows | Command Window. tin hn, bn drag title bar ca n chng ln tab bar ca Task List v Output windows.

Nu ta enter mt command nh: File.AddNewProject IDE s hin th Add New Project dialog. VS.NET h tr Macro bn c th record v playback mt chui cng tc. Phng tin Integrated Debugging cho ta Debug Menu, Call Stack Window, Breakpoints Window v Watch and Value Display Windows. Thng thng bn s Add Reference cc .NET components. Nhng bn cng c th dng ActiveX (c sn trong VB6) trong .NET application bng cch Add Reference COM (click Tab COM trn Add Reference Dialog). .NET s gi ActiveX thnh mt NET component (click Yes tr li cu hi "Would you like to have a wrapper generated for you?"). Ngoi ra dng Add Reference Projects refer n DLL ca cc User developed DLL.

15

Demo Program Trong chng trnh biu din ny, ta dng giao din hu nh hon ton bng ch Vit. Ta c th nh ch Vit (Unicode) cho Title Bar, Menu, TextBox, ListBox .v.v.. Nu bn cn mt key input software cho ch Vit h tr Unicode th download VPS, Vietkey hay Unikey. Cc documents nh Form, XML .v.v. trong .NET project u c Saved vi UTF-8 encoding. Bn c th Download source code ca program demo ny ti y. Trong program S th Saigon ny ta c hai Listboxes. Khi chy, bn c th drag tn cc loi th t Listbox1 (bn tri) drop vo Listbox2 (bn phi). Pha di l mt Label dng hin th ngy gi. C mt button Lu tr danh sch ta save data trong Listbox2 vo file animal.txt trong subFolder bin. Ngoi ra bn cng c th dng Main menu Item c danh sch Load data t file animal.txt vo Listbox2.

16

Nhng components khng cn phi hin ra lc runtime nh Timer, Menu, Tooltip .v.v. nm trong mt Component Tray (mm) ring. Mun Edit MainMenu, click ln MainMenu1 icon ri nh trc tip vo MainMenu. Thm cc menuitems mi bng cch nh thng vo cc ch c ch Type Here. Lu cc Tabs bn trn Editing Area khi bn m nhiu forms.

Edit MainMenu, insert mt Separator

Ch danh sch cc References c lit k trong Solution Explorer.

17

Edit Shortcut cho mt menu item.

Button by gi chng nhng c th cha hnh m cn cho bn chn v tr ca hnh trong button bng ImageAlign na.

Bn c th Anchor mt Button n dnh vo mt gc ca form khi form resizes th Button chy theo gc y ca form. y ta click hai thanh Di v Phi cho chng tr nn mu en chn Anchor Bottom v Right.

18

Trong lc thit k ta c th edit cc List items ca mt Listbox bng cch m property Items Collection ra v Edit vo mt trang.

Walk Through Code Trong .NET, cc classes c chia ra thnh nhiu nhm nh System.IO, System.XML, System.Data, System.Drawing ..v.v.. Ngoi ra trong mi nhm li cn chia thnh nhng nhm con, chu nh System.Windows.Forms, System.Windows.Collections, System.Windows.Diagnostics, .v.v.. Mc du mt khi Project | Add Reference cc .NET components y ta c th dng chng trong program nhng vn phi bin mt tn di nh System.IO.StreamReader trnh ln ln. c th vit tn class gn hn ta dng Imports nh Imports System.IO, sau ta ch cn vit StreamReader l . Cng vic Imports ny c gi l importing Namespace (ca System.IO). Tng t nh th, c th tip tc dng cc Functions Left, Right, Mid ca VB6 trong .NET ta c th thm cu Imports VB6 = Microsoft.VisualBasic u chng trnh. Sau ta c th vit: AppPath = VB6.Left(AppPath, Pos) Nguyn program chng ta ti y l Public Class Form1. Form1 tha k standard form class ca .NET Framework nn ta declare:

19

Inherits System.Windows.Forms.Form Imports System.IO Imports VB6 = Microsoft.VisualBasic Public Class Form1 Inherits System.Windows.Forms.Form Dim AppPath As String Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click End ' Terminate the program End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Obtain the folder where this program EXE resides and initialise tooltip Dim AppPath As String Dim Pos As Integer ' Fetch full pathname of the EXE file AppPath = System.Reflection.Assembly.GetExecutingAssembly.Location ' Locate the last slash in the pathname string Pos = InStrRev(AppPath, "/") ' Extract the part up to the backslash AppPath = VB6.Left(AppPath, Pos) ' Initialise the tooltip for Listbox1 ToolTip1.SetToolTip(ListBox1, "Xin nm ko tn mt con th qua Listbox bn phi") End Sub Hy xem cch vit mt Event Handler nh: Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click Khc vi VB6, n c thm cc ch Handles MenuItem4.Click pha cui ni handling event Click ca MenuItem4. Mi Event Handler u c passed cho hai parameters: ByVal sender As System.Object v ByVal e As System.EventArgs. Parameter th nht, sender, l Object ch ng chuyn RaiseEvent, cn e l Event c cha nhiu d kin khc nhau ty theo tnh hung. Khi edit code bn c th nh Intellisense ca IDE gip cho bit parameter e cha nhng d kin g. Trong .NET, vn handling event khng phi l mt iu b him nh trong VB6. Khi mt control c th RaiseEvent th chng nhng mt, m nhiu controls khc u c th ng k (Register) c Thng bo (Notified) khi Event y xy ra. Control RaiseEvent c gi l Publisher (Nh Xut Bn), cc controls mun handle event c gi l Subcribers (nhng Ngi t Mua di hn) . D nhin cch handle event ca mi control u khc nhau, du rng c passed cho cng hai parameters. Cc EventHandlers ny c gi l Delegates (nhng Nh i Din lnh trch nhim gii quyt mt s c). Do , ta c th dng vn vn mt EventHandler handle nhiu Event khc nhau, xut pht t nhiu Objects. Ni cho n gin ra, sau khi ta ng k mt hay nhiu Delegates (tc l EventHandler Subs), th khi Event xy ra, cc EventHandler Subs y s c x l. Nu bn vn cn thy kh hiu th hy c th d ny. Tng tng bn lm bing nu n nn t nh hng giao cm mi ngy n tn nh. C hai cch bn nhn "g-mn" cm:

1.

2.

Ngi giao cm s "g-mn" cm trc nh, cnh bn hp th. Khi i lm v, bn s mang n v nh. Trong trng hp ny bn x l cng vic khi no tin, tc l lc v n nh. Cch ny c im bt li l hm no bn i lm v tr th cm c th b thiu v tri nng. Bn a cha kha nh cho ngi giao cm gi. Khi giao cm, ngi y s t ng m ca v nh "g-mn" thng vo trong t lnh. Trong cch ny Event GiaoCm c handled bng EventHandler Sub OpenDoorPutIntoFridge, do ngi giao cm x l, ch khng phi chnh bn. Nh th, l Subscriber (ngi n cm thng giao tn nh) bn register EventHandler "Sub OpenDoorPutIntoFridge" vi ngi giao cm qua vic a cha kha. Khi Event "GiaoCm" xy ra, ngi giao cm t ng executes Sub OpenDoorPutIntoFridge. K

20

thut giao AddressOf Sub cho mt Object khc n execute khi cn cn c tn l CallBack.

Do , ngay c trong lc runtime (khng phi khi design), Register EventHandler Sub MenuItem4_Click vi system handle Event Click ca MenuItem4 ta c th execute code: AddHandler MenuItem4.Click, AddressOf MenuItem4_Click Lu cch ta dng control ToolTip1 register Tooltip Text vi Listbox1. Ta c th dng ch mt control ToopTip1 register nhiu Tooltip Texts vi nhng controls khc nhau nh TextBox, ComboBox .v.v.. Bn c th thay th hng: AppPath = VB6.Left(AppPath, Pos) bng AppPath = AppPath.SubString(0,Pos) Trong VB6, Visual components ca mt form c cha di dng Text din t cc controls rt d c ngay u form file, nhng n khng phi l VB6 code. Trong .NET, Visual components ca mt form c cha di dng code tht s. Tc l, nu khng c VS.NET ta c th dng Notepad vit code nh th v sau khi compile, n vn chy y ht nh trong trng hp ta dng VS.NET. im ny ging nh trong Java, ta c th vit code bng Notepad v dng Command line compile v link code file vi cc components khc. Th d nh khi ta vit mt VB.NET program n gin chy trn trong DOS Console, ta c th compile n nh sau: vbc /t:exe /r:system.dll mysource.vb vbc l VisualBasic Compiler, /t: c ngha target tc l EXE chy trong DOS console. /r: c ngha reference n DLL. Nu mun chy trong Windows, ta dng: vbc /t:winexe /r:system.dll /r:system.windows.forms.dll mysource.vb Bnh thng generated code c du trong Region khi chon ch, hay khu gi chng ta sa i. Click du + bn l tri m mt Region hay Sub/Function. Click du - ng li. i khi ta cng c th Edit generated code, nhng bn nh backup code trc, ri form khng th hin th v b error, ch cho ta mt trang giy trng, th ta cn c ng restore.

21

Mi class u c t nht mt Sub New, gi l Constructor (ging nh Class_Initialize ca VB6 class) v Sub Dispose, gi l Destructor. l hai Sub dng to ra v ph hy Object. V Form1 tha k t Standard Form nn trong Sub New trc ht phi gi constructor MyBase.New() ca cha n, v trong Sub Dispose sau ht phi gi destructor MyBase.Dispose ca cha n. M Class View Window

Bn c th Navigate trong Code qua Class View. DoubleClick ln tn ca Object hay Sub/Function trong Class View mang cursor n code ca n trong trang Edit.

22

Biu din DragDrop

Code ca DragDrop, lu ta phi vit thm Sub ListBox2_DragEnter handle Event DragEnter. Private Sub ListBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown ' Start the DragDrop process Dim ItemIndex As Integer ' Identify the Listbox item that has mousedown using mouse coordinates ItemIndex = ListBox1.IndexFromPoint(New System.Drawing.Point(e.X, e.Y)) ' Start the DragDrop process passing along the ListboxItem as ListBox1.Items(ItemIndex) ListBox1.DoDragDrop(ListBox1.Items(ItemIndex), DragDropEffects.Copy Or DragDropEffects.Move) End Sub Private Sub ListBox2_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragEnter ' Apply the copy effect ' AND remember to set the property Allow Drop of Listbox2 to TRUE If (e.Data.GetDataPresent(DataFormats.Text)) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub Private Sub ListBox2_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragDrop Dim LItem As String ' Obtain the Source ListItem String LItem = e.Data.GetData(DataFormats.Text).ToString ' Add it to Listbox2

23

ListBox2.Items.Add(LItem) ' Remove the Item from Listbox1 ListBox1.Items.RemoveAt(ListBox1.FindString(LItem)) End Sub Khi Load data vo Listbox ta dng StreamReader Open mt File as Input. Khi Save data ca Listbox vo mt Text file ta dng StreamWriter Open mt File as Output (hay Append nu ta cho thm Option Append=True): Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click ' Read the list of animals from a text file into Listbox2 Dim sr As StreamReader Dim Pos As Integer Dim TStr As String ListBox2.Items.Clear() ' Clear Listbox2 ' Use a StreamReader to open the UTF-8 file to read. sr = New StreamReader(AppPath & "animals.txt") ' Read each line in the file. ' When the end of the file is reached, return the value "-1". Dim x As String While sr.Peek <> -1 x = sr.ReadLine() ' Read a line ListBox2.Items.Add(x) ' Add it to Listbox2 End While sr.Close() ' Close the file End Sub Private Sub SaveAnimalList() ' Save the content of Listbox2 into a UTF-8 Text file Dim i As Integer Dim sw As StreamWriter ' Open the file to write in UTF-8 mode, using a StreamWriter. sw = New StreamWriter(AppPath & "Animals.txt") ' Write each line in the Listbox. For i = 0 To ListBox2.Items.Count - 1 sw.WriteLine(ListBox2.Items(i)) Next sw.Close() ' Close the file End Sub Ta hin th ngy v gi bng cch dng Timer1 v Shared Function DateTime.Now formated bng hai Functions c sn ToLongDateString v ToLongTimeString. Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick ' Display Date and Time every half a second Label3.Text = DateTime.Now.ToLongDateString & " " & DateTime.Now.ToLongTimeString End Sub Bn cng c th hin th ngy gi trong format khc bng cch vit: Label3.Text = DateTime.Now.ToString("ddd dd/MM/yyyy hh:mm:ss") c: WED 18/07/2001 09:16:42 trong Format string ta dng MM cho Month v mm cho Minute

Bi 3
24

Xin co li: rt tic l server chng ti khng cho php cha cc files MP3 nn chng ti s tm cch khc cho c gi download sau. Nu cc bn c kin hay v cch cho download cc MP3 files ny th xin lin lc vi webmaster. Thu m bi gi ng (MP3) Week 3.1 Week 3.2 Week 3.3 Week 3.4 Week 3.5 Week 3.6 Week 3.7 Week 3.8 Week 3.9 Week 3.10 download size 1.2 mb 1.2 mb 1.2 mb 1.2 mb 1.2 mb 1.2 mb 1.2 mb 1.2 mb 1.0 mb 0.8 mb

Nhng khc bit gia VB.NET vi VB6


V B.NET, cn gi l VB7, chng qua l C# vit theo li Visual Basic. Nay VB7 hon ton l Object Oriented, tc l cho ta dng li (reuse) classes/forms theo cch tha k tht thoi mi, nn n khc VB6 nhiu lm. Du vy, i vi VB6 programmers hc VB.NET khng kh. L do l VB.NET khng cho thm nhiu t mi (reserved words). Ni chung cc nim mi trong VB.NET u d lnh hi, nht l khi em ra p dng cch thc t. l nh Microsoft vn gi nguyn tc du v lm sn (ca VB6) nhng g rc ri pha sau sn khu, ta c th tp trung vo vic tm kim mt gii php, thay v qu bn tm vo cch thc lm mt vic g. Chnh nguyn tc y gip Microsoft chiu m c 3 triu VB6 programmers trn khp th gii. VB.NET cng hin cho VB programmers mt cng c rt hu hiu dng cho mi hon cnh, t database, desktop, distributed, internet cho n real-time hay mobile (pocket PC). Nhng u im (features) ca VB.NET n t chc nng ca .NET Framework. N mang n phng tin lp trnh cho mng cch Object Oriented nh XML, Remoting, Streaming, Serialisation, Threading .v.v... Nhng th ny tuy l nhng khng kh hc, ngc li s tit kim rt nhiu th gi. Mc du VB6 l mt ngn ng lp trnh trng thnh v hiu nng, chc chn hy cn tn ti trong nhiu nm na, nhng hc thm VB.NET l mt u t tng i t tn km v m bo hu li gp bao nhiu ln trong hng thp nin ti. Trong bi ny ta s bn v nhng im khc nhau gia VB6 v VB.NET t quan im ngn ng lp trnh. Trong mt bi khc ta s bn v nhng chc nng i tng (Object Oriented) ca VB.NET. Namespaces Namespaces l mt cch t tn gip sp t cc Classes ta dng trong program mt cch th t hu d tm kim chng. Tt c code trong .NET, vit bng VB.NET, C# hay ngn ng no khc, u c cha trong mt namespace. im ny cng p dng cho code trong .NET system class libraries. Chng hn, cc classes ca WinForms u nm trong System.Windows.Forms namespace. V cc classes dng cho collections nh Queue, Stack, Hashtable .v.v.. u nm trong System.Collections namespace. Tt c code ta vit trong program ca mnh cng u nm trong cc namespaces. Trc y trong VB6, mi khi nhc n mt Class trong mt COM tn CompName ta vit CompName.classname (cn gi l PROGID) , tc l cng dng mt dng namespace. Tuy nhin phng php ny c mt vi gii hn: a ch ca class b buc cng vo component ang cha n. Nhng classes khng nm trong mt COM component th khng c "namespace".

25

Cch gi tn PROGID ch c mt bc thi, khng c bc con, bc chu. Tn ca Component lun lun c hiu lc trn khp c computer.

Namespaces trong .NET khc phc c mi gii hn ni trn trong VB6. Nhiu assemblies c th nm trong cng mt namespace, ngha l classes tuyn b trong cc components khc nhau c th c chung mt namespace. iu ny cng p dng xuyn qua cc ngn ng, gip cho mt class vit trong VB.NET c th nm trong cng mt namespace vi mt class vit trong C#, chng hn. Hn na, trong mt assembly c th c nhiu namespaces, d rng thng thng ta ch dng mt namespace duy nht cho tt c cc classes trong y. Nh l mt assembly trong .NET th i khi tng ng vi mt COM component. Tt c code trong .NET u nm trong nhng assemblies. By default, tn ca project c dng lm namespace. Nu bn right click ln project name NETListbox trong Solution Explorer ca program Demo, ri chn Properties trong popup menu, IDE s hin th Property Pages dialog nh di y:

Bn thy Root namespace ca project l NETListbox. Bn c th thay i tn namespace y nu bn mun. Namespaces c th c phn chia th bc ging nh Folders trong mt File Directory. N s gip user sp t cc classes theo ng nhm cho trong sng v d c. Th d bn ang vit mt program cho mt hng sn xut, bn s dng namespace NhSnXut root level. Bn trong namespace y bn s to thm cc nhnh ca chng trnh nh: NhSnXut.TnKho NhSnXut.SnPhm NhSnXut.KTon.ChiPh NhSnXut.KTon.ThuNhp

Nh th ta nh ngha mt base namespace tn NhSnXut, vi nhng namespaces con, chu bn trong, mi namespace c cha classes, modules, enums, structures v cc

26

namespaces khc. Mi namespace cha nhng phn ca code thch hp cho n trong program ni chung. Trong File Directory, ta c th c hai files d mang cng tn nhng nm trong hai folders khc nhau. Ging nh vy, trong .NET ta c th c hai classes c cng mt tn nhng nm trong hai namespaces khc nhau. l v khi ta vit tn ca mt class vi c namespace ca n th c th phn bit vi mt class khc vi cng tn. Local v Global Namespaces Khc vi COM components vi "namespace" ca chng p dng cho khp c computer, namespaces ca .NET thng thng l Local, ch c application program ca n thy m thi. .NET cng h tr Global namespace, nhng phi c k tn (digitally signed) v ng k vi .NET runtime cha n trong global assembly cache. Cng vic lm mt namespace Global rc ri nh th gim thiu trng hp ta tr v tnh trng DLL hell trc y. Dng Namespaces Ta c th dng namespaces bng cch ni thng ra (explicitly) vi nguyn tn (Direct Addressing) hay hm (implicitly) vi Import keyword. Nhng iu tin quyt l ta phi reference ci assembly cha namespace m ta mun dng. Ta thc hin vic y vi Menu command Project | Add References. Khi Add References dialog hin ra, chn Tab .NET cho standard .NET components hay Tab Projects cho DLL ca mt .NET project khc , highlight DLL bn mun ri click Select button, on click OK.

Chng hn ta mun read v write t stdio (ci console input/output stream). Ci namespace ta cn s l System.Console. Trong cch Direct Addressing ta s code nh sau vit hng ch "Cho th gii": System.Console.WriteLine ("Hello world!") Nu ta dng Import keyword bng cch nht vo cu Imports System.Console u code module, ta c th code gn hn:

27

WriteLine ("Hello world!") Di y l mt s namespaces thng dng: Namespace System.IO System.Drawing System.Data System.Collection System.Math System.Diagnostics System.XML System.Security Chc nng c/Vit files v cc data streams khc ha Qun l data To v qun l cc loi collections Tnh ton Debug Lm vic vi XML, Document Object Model Cho php kim sot an ninh Classes in hnh FileStream, Path, StreamReader, StreamWriter Bitmap, Brush, Pen Color, Font, Graphics DataSet, DataTable, DataRow, SQLConnection, ADOConnection ArrayList, BitArray, Queue, Stack, HashTable Sqrt, Cos, Log, Min Debug, Trace XMLDocument, XMLElement, XMLReader, XMLWriter Cryptography, Permission, Policy

Aliasing Namespaces (dng b danh) Khi hai namespaces trng tn, ta phi dng nguyn tn (k c gc tch) phn bit chng. in hnh l khi ta dng nhng namespaces lin h n VB6 nh Microsoft.Visualbasic. Thay v code: Microsoft.Visualbasic.Left ( InputString,6) ta tuyn b: Imports VB6= Microsoft.Visualbasic Sau ta c th code: VB6.Left ( InputString,6) Dng Namespaces keyword Trong th d v program c Root Namespace l NhSnXut nh ni trn, nu ta mun t ra mt namespace con l TnKho, ta phi dng NameSpace keyword trong code nh sau: ' Root Namespace l NhSnXut Namespace TnKho Class PhngLnh ' Code cho Phng Lnh End Class End Namespace By gi mun ni n class PhngLnh bn trong namespace TnKho ta s code nh sau: NhSnXut.TnKho.PhngLnh

28

Thay i trong Data Types Tt c u l Object Mt thay i ln cho Data Type ca VB.NET, l nhng variables dng Data Type a phng nh Integer, Single, Boolean,.v.v.. u l nhng Objects. Chng u c derived (xut pht) t Class cn bn nht tn Object trong VB.NET. Nu bn th dng Intellisense xem c bao nhiu Functions/Properties mt Object loi Integer c, bn s thy nh di y:

Trong .NET, Integer c bn loi: Byte (8 bits, khng c du, tc l t 0 n 255), Short (16 bits, c du cng tr, tc l t -32768 n 32767), Integer (32 bits, c du) v Long (64 bits, c du). Nh vy Integer by gi tng ng vi Long trong VB6, v Long by gi ln gp i trong VB6. Floating-Point Division (Chia s ni) Vic chia s ni (Single, Double) trong VB.NET c lm theo ng tiu chun ca IEEE. Do nu ta vit code nh sau: Dim dValueA As Double Dim dValueB As Double dValueA = 1 dValueB = 0 Console.WriteLine(dValueA / dValueB) Trong VB6 ta bit mnh s gp Division by Zero error, nhng y program s vit trong Output Window ch Infinity (v cc). Tng t nh vy, nu ta vit code: Dim dValueA As Double Dim dValueB As Double dValueA = 0 dValueB = 0 Console.WriteLine(dValueA / dValueB) Kt qu s l ch NaN (Not a Number) hin th trong Output Window. Thay th Currency bng Decimal VB.NET dng Decimal data type vi 128 bits thay th Currency data type trong VB6. N c th biu din mt s ti 28 digits nm bn phi du chm cho tht chnh xc. H cng nhiu digits nm bn phi du chm th tm tr s ca Decimal cng nh hn. Char Type VB.NET c c Byte ln Char data type. Byte c dng cho mt s nh 0-255, c th cha mt ASCII character trong dng con s.

29

Char c dng cha mt Unicode (16 bit) character. Char l mt character ca String. String Type Nhn lt qua, String trong VB.NET khng c v khc VB6 bao nhiu. Nhng tr khi ta mun tip tc dng cc Functions nh InStr, Left, Mid and Right trong VB6, ta nn xem String l mt object v dng nhng Properties/Functions ca n trong VB.NET cho tin hn. Sau ny ta s hc thm v String ca VB.NET trong mt bi ring. nim fixed-length (c chiu di nht nh) String trong VB6 khng cn dng na. Do ta khng th declare: Dim myString As String * 25 Object thay th Variant Mt trong nhng data types linh ng, hiu nng v nguy him trong VB6 l Variant. Mt variable thuc data type Variant c th cha gn nh th g cng c (tr fixed-length string), n t ng thch nghi bn trong cha tr s mi. Ci gi phi tr cho s linh ng y l program chy chm v d c bugs to ra bi s bin i t data loi ny qua loi khc khng theo d tnh ca ta. VB.NET thay th Variant bng Object. V trn phng din k thut tt c data types trong .NET u l Object nn, ging nh Variant, Object c th cha th. Ni chung, du Object ging nh Variant, nhng trong .NET ta phi ni r ra (explicitly) mnh mun lm g. Ta th xem mt th d code trong VB6 nh sau: Private Sub Button1_Click() Dim X1 As Variant Dim X2 As Variant X1 = "24.7" X2 = 5 Debug.Print X1 + X2 ' Cng hai s vi operator + Debug.Print X1 & X2 ' Ghp hai strings li vi operator & End Sub Kt qu hin th trong Immediate Window l : 29.7 24.75 Trong VB.NET, ta phi code cho r rng hn nh sau c cng kt qu nh trn hin th trong Output Window: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X1 As Object Dim X2 As Object X1 = "24.7" X2 = 5 Console.WriteLine(CSng(X1) + CInt(X2)) Console.WriteLine(CStr(X1) & CStr(X2)) End Sub CType Statement Trong VB.NET c Option Strict by default. N bt ta phi thn trng trong cch dng data types. V Object c th cha bt c th g, khi ta mun dng n nh mt loi data type hay class no, ta phi i Object ra th y bng CType, th d:

30

Class Product Public Description As String End Class Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X As Object X = New Product() ' Treat X like an actual product CType(X, Product).Description = "Soft Drink" Console.WriteLine(CType(X, Product).Description) End Sub Mc d X c instantiated nh mt Product, n vn c xem nh mt Object variable. Do mi khi mun dng n nh mt Product ta phi nh n CType. T chuyn mn trong programming gi l Type Casting. Thay i trong cch tuyn b Variables Tuyn b nhiu Variables Trong VB6 ta c th Declare nhiu variables trn cng mt hng nh: Dim i, j, k As Integer Kt qu l ch c k l Integer, cn i v j l Variant (c th l iu bn khng ng). Trong VB.NET th c ba i,j v k u l Integer, v nh th hp l hn. Tuyn b tr s khi u Trong VB6, sau khi declare variable ta thng cho n mt tr s khi u nh: Dim X As Integer X = 12 By gi trong VB.NET ta c th gp chung hai statements trn li nh sau: Dim X As Integer = 12 Tuyn b Constants Khi tuyn b Constants trong VB.NET ta phi khai r Data type ca n l String, Integer, Boolean ..v.v.: Public Const myConstantString As String = "happy" Public Const maxStudent As Integer = 30 Dim As New Trong VB6 ta c khuyn khng nn code: Dim X As New Customer v VB6 khng instantiate mt Object Customer cho n khi X c dng n - chuyn ny rt nguy him v c th to ra bug m ta khng ng. Trong VB.NET ta c th yn tm code:

31

Dim X As New Customer() v statement ni trn lp tc to ra mt Object Customer. Tuyn b Variable trong Scope ca Block Trong th d di y, variable X c declared trong mt IF ..THEN...END IF block. Khi execution ra khi IF block y, X s b hy dit. Do , VB.NET s than phin l X undefined v n khng thy X bn ngoi IF block. Lut ny cng p dng cho nhng Blocks khc nh DO...LOOP, WHILE...END WHILE, FOR...NEXT, .v.v.. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim A As Integer = 5 Dim B As Integer = 5 If A = B Then Dim X As Integer ' X is declared in this IF block X = 12 End If A = X ' X has been destroyed, so it is undefined here End Sub C l bn hi Declare Variable trong FOR...LOOP c li g, ti sao ta khng Declare mt ln duy nht u? Th nht l Block gii hn scope (phm vi hot ng) ca mt variable n khng ng chm ai d gy nn bug, th hai l trng hp in hnh ta s cn feature ny l trong mt FOR...LOOP, c mi iteration ta mun instantiate mt Object mi. Khi y ta cn Declare mt Object variable, instantiate Object , ri cha n vo mt collection chng hn. Truy cp Variable/Class/Structure Trong VB.NET ta c th quyt nh gii hn vic truy cp mt Variable, Class, Structure .v.v. bng cch dng cc keywords sau: Loi truy cp Public

Th d Public Class ClassForEverybody Protected Class ClassForMyHeirs Friend StringForThisProject As String Private NumberForMeOnly As Integer

Ch thch Cho php u cng dng n c. Ta ch c th dng Public mc Module, Namespace hay File. Tc l ta khng th dng Public trong mt Sub/Function. Cho php cc classes con, chu c dng. Ta ch c th dng Protected mc Class. Cho php code trong cng mt Project c dng. Cho php code trong cng module, class, hay structure c dng. Lu l Dim coi nh tng ng vi Private, do ta nn dng Private cho d c.

Protected

Friend

Private

Ngoi ra, nh l nu container (Object cha) ca mt Variable/Class/Structure l Private th d ta c tuyn b mt Variable/Class/Structure nm bn trong container l Public ta cng khng thy n t bn ngoi. Thay i trong Array Array index t 0

32

Trong VB.NET khng c Option Base v mi Array u c index bt u t 0. Khi bn tuyn b mt array nh: Dim myArray(10) As Integer Kt qu l mt array c 11 elements v index t 0 n 10. UBound ca array ny l 10 v LBound ca tt c arrays trong VB.NET u l 0. Tuyn b Array vi nhng tr s khi u Bn c th tuyn b Array vi nhng tr s khi u nh sau: Dim myArray() As Integer = { 1, 5, 8, 16 } ' Note the curly brackets Statement lm hai chuyn: quyt nh size ca array v cho cc elements tr s khi u. dng feature ny, bn khng c ni r size ca array, m cho program t tnh. ReDim Preserve Trong VB.NET bn cng c th tip tc dng Preserve keyword gi nguyn tr s ca cc elements trong mt array khi bn ReDim n. Tuy nhin c mt gii hn cho array vi hn mt dimension - bn ch c th resize dimention cui (bn phi) , nn nhng hng code sau y hp l: Dim myArray(,) As String ReDim myArray(5, 5) ReDim Preserve myArray(5, 8) Thay i trong User-Defined Type nim User-Defined Type (UDT) rt tin cho ta gom cc mnh data lin h li thnh mt data type c cu trc. Trong VB6 ta dng n nh sau: Public Type UStudent FullName As String Age As Integer End Type VB.NET cng gi y c tnh ca UDT nhng thay i ch Type thnh Structure: Public Structure UStudent Public FullName As String Public Age As Integer End Structure Lu cc Structure Members (nh FullName , Age ) cn phi c Declared vi keyword Dim, Public, Private hay Friend, nhng khng th dng Protected v Structure khng th Inherit t mt Structure khc. S d, c dng Private l v bn trong Structure c th c Property, Sub/Function .v.v.. Thay i trong Collections VB6 h tr Collection v sau ny Windows Scripting Host Library cho ta collection kiu Dictionary. VB.NET cho ta mt thnh phn collection rt hng hu trong Namespace System.Collections. V Collection l mt trong nhng cng c rt thng dng v hiu nng trong VB.NET nn ta s c mt bi dnh ring cho collection sau ny. Di y l danh sch cc collections ta s dng thng xuyn:

33

Collection ArrayList BitArray HashTable Queue Stack SortedList Arithmetic Operators mi

Chc nng Dynamic Array t ng ln ln khi elements c b vo. Array cha tr s Boolean (True/False). Collection cha nhng cp key-value data, cho ta dng lm t in. Cha mt FIFO (First In, First Out) structure. Element c th l bt c Object loi no. Cha mt LIFO (Last In, First Out) structure. Cha mt danh sch nhng cp key-value data c sp theo th t.

VB.NET cho ta thm cch vit Arithmetic Operator mi m C programmers rt thch t lu nay. X += 4 tng ng vi X = X + 4 Mess &= " text" tng ng vi Mess = Mess & " text" Arithmetic Operation Cng Tr Nhn Chia Chia Integer Ly tha Ghp Strings Trong VB6 X = X +5 X = X - 10 X=X*7 X = X / 19 X = X \ 13 X=X^3 X = X & "more text" Cch vit tc mi X += 5 X -= 10 X *= 7 X /= 19 X \= 13 X ^= 3 X &= "more text"

Ta vn c th tip tc dng cch vit trong VB6, nhng by gi c thm mt cch vit gn hn. Short Circuit trong IF..THEN Statement Trong VB6, nu ta vit: Dim myInt As Integer myInt = 0 If (myInt <> 0) And (17 \ myInt < 5 ) Then Th s b Division by Zero error, v mc du phn (myInt <>0) l False, nhng VB6 vn tip tc tnh phn (17 \ myInt < 5 ), v to ra error v 17 chia cho mt s 0. Trong vi ngn ng lp trnh khc, khi (myInt <>0) l False th n khng tnh thm na, tc l n ni rng khi mt phn ca AND l False th nht nh kt qu ca Logical Statement trong IF phi l False. c tnh ny gi l Short-Circuit (i tc). Nu ta dng code ni trn trong VB.NET, n vn cho Division by Zero error ging nh VB6. Tuy nhin, nu ta mun dng c tnh Short-Circuit th ta ch cn thay th ch And bng AndAlso nh sau: Dim myInt As Integer myInt = 0 If (myInt <> 0) AndAlso (17 \ myInt < 5 ) Then

34

Short-Circuit cng p dng cho Logical OR khi ta thay th ch Or bng OrElse ni rng khi phn u ca OR l True th nht nh kt qu ca Logical Statement trong IF phi l True. Khng cn Set statement cho Object Trong VB6 ta c th vit: Set x = New Product Set w = x Trong VB.NET s c vit li nh sau: x = New Product() w=x By gi ta khng cn phi nh dng ch Set khi ni n Object. Thay i trong cch vit Property routines Dng mt Property duy nht Nu trong VB6 ta vit: Private mdescription as String Public Property Let Description (Value As String) mdescription = Value End Property Public Property Get Description() As String Description = mdescription End Property

Trong VB.NET Let v Get uc hp li trong mt Property routine duy nht v ta li dng ch Set thay cho ch Let (mc du ch Set khng cn dng cho Object nh mi ni trn) nh sau: Private mdescription As String Public Property Description() As String Set (ByVal Value As String) mdescription = Value End Set Get Description = mdescription End Get End Property ReadOnly v WriteOnly property By gi nu Property l ReadOnly ta s vit: Public ReadOnly Property Age() As Integer Get Age = 3 End Get End Property hay WriteOnly ta s vit:

35

Private _data As Integer Public WriteOnly Property Data() As Integer Set (ByVal Value As Integer) _data = Value End Set End Property Default Properties Ta dng Default keyword to ra Default Property nh sau: Default Public Property Item(ByVal Index As Integer) As String VB.NET bt buc ta phi t nht mt parameter cho Default Property. Dng Reserved Word lm Procedure Name Trong VB.NET ta c th dng Reserved Word lm Procedure Name bng cch n gia ngoc vung. Gi t ta mun dng ch Compare lm tn mt Function, ta s vit nh sau: Public Function [Compare] (ByVal v1 As Integer, ByVal v2 As Integer) As Boolean Structured Error Handling TRY...CATCH...FINALLY VB.NET cho ta Structure TRY...CATCH...FINALLY...END TRY x l error. Th d nh trong bi ton chia di y, nu b Division by 0 error th ta s cho kt qu bng 0. D c error hay khng, program vn hin th kt qu trong Output Window qua statement Console.WriteLine( result) trong phn Finally: Try result = a / b ' if this section has error jump to Catch section Catch ' only get here if an error occurs between Try and Catch result = 0 Finally ' This section is optional, but is always executed whether there is an error or not Console.WriteLine( result) End Try Nu ta khng code g phn Catch th c ngha l chng ta c Handle Error nhng li khng lm g ht, do Program s khng t. Ngc li, nu ta khng dng Try..Catch, th program s t. Nu mun nhy ra khi Try Structure bt c lc no ta c th dng Exit Try, Nhng cch CATCH error Ta c th dng Catch ging nh Select Case c mt cch x l cho mi error: Try ' Main code goes here Catch When Err.Number=5 ' handle Error 5 Catch ' handle other errors End Try Ta c th Catch Error Exception data trong mt variable dng n nh sau:

36

Catch e as Exception MessageBox.Show (e.ToString) Hai cch code trn c th c gp li thnh: Catch e As Exception When Err.Number = 5 Thay i trong cch vit Sub/Function Dng du ngoc khi gi Procedure Trong VB6, nu khng dng keyword Call ta khng dng du ngoc khi gi Sub. Trong VB.NET ta lun lun dng cp du ngoc, ngay c khi khng c parameter. Th d: ProcessData() x = New Customer() ByVal l Default cho mi Parameters Trong VB6, ByRef l default cho cc parameters passed v Sub/Function. Tc l, Sub/Function c th v tnh lm thay thi tr s nguyn thy ca parameter variables. Trong VB.NET, ByVal l default cho cc parameters passed v Sub/Function. Do , n s trnh li lm ni trn. Optional Parameter cn c tr s Default Trong VB6 ta c th dng IsMissing bit xem Optional parameter c hin din khng. VB.NET b IsMissing v bt buc ta phi cung cp tr s Default cho Optional parameter trong phn procedure declaration ging nh sau y : Public Sub VerifyInput (Optional ByVal InputData As String="") trong th d ny ta cho Default value ca Optional parameter InputData l Empty string. Return Statement Hy xem mt th d dng Function return mt Customer Object trong VB6: Public Function GetCustomer (ByVal CustID As Long) As Customer Dim objCust As Customer Set objCust = New Customer objCust.Load CustID Set GetCustomer = objCust End Function Trong VB.NET ta c th dng Return Statement Return kt qu ca mt Function thay v dng chnh tn ca Function. Public Function GetCustomer (ByVal CustID As Long) As Customer Dim objCust As New Customer(CustID) Return objCust End Function Delegate Delegate l mt cch gip ta pass mt procedure nh mt parameter vo trong mt method. nim ny c gi l Function Pointer hay Callback. Mt trng hp c in ta dng Delegate l cung cp mt dataArray sort vi mt Function so snh mi hai items trong array.

37

Trong VB.NET ta dng AddressOf operator pass mt procedure. Ta declare mt Delegate bng cch ni n l mt procedure di dng no, c bao nhiu parameters, mi parameter thuc loi data type no. Th d: Delegate Function IsGreater (ByVal v1 As Integer, ByVal v2 As Integer) as Boolean Khi vit code ta c yn tm s c cung cp mt Function c dng y v i khi code nh sau: Public Sub DoSort (ByRef DataArray() As Integer, Greater As IsGreater) Dim outer As Integer Dim inner As Integer Dim temp As Integer For outer = 0 To UBound(DataArray) For inner = outer + 1 To UBound(DataArray) If GreaterThan.Invoke( DataArray(outer), DataArray(inner)) Then temp = DataArray(outer) DataArray(outer) = DataArray(inner) DataArray(inner) = temp End If Next Next End Sub cch dng Method Invoke gi mt Delegate. By gi ta ch cn cung cp Delegate routine m ta ha: Public Function myIsGreater (ByVal v1 As Integer, ByVal v2 As Integer) as Boolean Return ( v1 > v2) End Function Tip theo y l cch ta dng Delegate ni trn: Dim myData() As Integer = { 2, 5, 8, 13, 26} DoSort (myData, AddressOf myIsGreater) Khi mt Subscriber registers vi mt Publisher mt routine Handle mt loi Event, ta cng dng delegate nh sau: AddHandler Button4.Click, AddressOf Button4_Click Khi mt Event Click xy ra Button4, system s execute Sub Button4_Click.

Bi 4 Nhng chc nng i Tng mi ca VB.NET (phn I)


V B.NET khc phc nhng gii hn v i Tng (Object-Oriented) ca VB6 v mang n cho ta mt ngn ng lp trnh hon ton Object-Oriented (OO). Gn nh mi th trong VB.NET u lin h vi Object. Nu bn cn mi vi lp trnh theo hng i tng (Object Oriented Programming) th phn gii thch sau y s gip bn lm quen vi n. Classes v Objects, nguyn tc Abstraction

38

Theo phng php i tng, program c thit k mt phn code i din cho mt vt tng ng ngoi i. N c gi l Class. Khi lp trnh VB6 ta dng nhng controls t Toolbox nh Textbox, Label, Listbox ..v.v.. Textbox l Class ca cc Objects Text1, Text2. Cng nh Label1, Label2 l nhng Objects to ra t Class Label. Ta hay dng hai t Class v Object ln ln nhau. iu khng quan trng, min l ta bit rng Class l mt nim Tru tng (Abstraction), cn Object l mt vt thc hu. Ging nh Class CaS l mt nim tru tng, cn Object KhnhH ca Class CaS l mt ngi bng da, bng tht vi ting ht c nhiu ngi ngng m.

Ta ni Object l mt Instance ca Class, v ta instantiate Class c mt Object. Thng thng khi ta phn tch mt vn thit k chng trnh th cc Danh t (Nouns) l nhng Classes. Gi d ta phn tch hot ng ca mt Nh Kho (warehouse). Ta c phng cha, ngn t, bi nhn hng, xe nng hng, nhn vin ..v.v., mi th u c th l mt Object nn ta s thit k mt Class cho n. Fields, Properties, Methods v Events, nguyn tc Encapsulation Class CaS din t CaS l ngi nh th no. Nh SBiHt l mt Public Variable ca Class, c gi l Field c th c c/vit trc tip. Cn Kiu tc (di, ngn, mu en, c sc nu ...), Ging ht (cao, trm, ..). l nhng Properties. Chng cng ging nh Field nhng c implemented (thi hnh) bng cch dng procedures Property Get v Property Set. Property Set c th c coded kim sot nu "Kiu tc" khng thch hp th s b loi b. Ngc li, nu "Kiu tc" thch hp v c p dng th ta s thy kt qu ngay l CaS li p thm ra. Thng thng Fields v Properties l cc Danh t (Nouns). Mt CaS c kh nng nCa, KTnLuNim, TrnhDin. Ta gi l nhng Methods m ta implemented bng Subs v Functions (th d nh Function KTnLuNim s return mt ch k). Thng thng Methods l nhng ng t (Verbs) i vi code bn trong Class th Property ging nh mt Method cn i vi Client (tc l program ang dng Class) th Property ging nh Field. i khi, nu trnh din lu, CaS cn mt ly nc. CaS s Raise Event KhtNc nhn vin trong hu trng phc v. Ta gi chung Fields, Properties, Methods v Events l nhng Class Members (Cc Thnh vin ca Class) C mt ngoi l v s khc bit gi Class v Member, l khi ta dng cc Shared Class Members ca mt Class th ta khng nht thit phi instantiate mt Object. Ta c th dng thng tn ca Class nh mt Object.

39

Ci li im ca Object Oriented Programming l ta c th gi tt c nhng c im, kh nng ca mt Class vo trong mt Unit of Code (n v m) t tc. Khi chng ta lch s yu cu th CaS nCa. Ta bit CaS ca th thu ht lng ngi, nhng ta khng cn bit lm sao CaS t n trnh nh vy. khng phi l chuyn chng ta quan tm. i vi ta Class CaS l mt Black Box, ta khng bit v khng cn bit chuyn g xy ra bn trong. Nu sau ny CaS thay i k thut n ca ht d v hay hn, iu khng nh hng g n chng ta. c tnh OO y gi l Encapsulation (Gi kn).

Cch ta lp trnh vi Class ch khc cch ta lp trnh trc y mt cht thi. Nu trc y ta phi t lm, th by gi ta instantiate mt Object ca Class chuyn tr nhng chuyn ta mun lm, ri bo n lm cho ta. So vi ngoi i, th d bn c m mt tim photocopy. Sau mt nm bn t trng coi, cng chuyn lm n n nh v c kt qu tt. Bn mun m thm mt tim photocopy na ch khc. Trc khi i lo ch khc bn hun luyn ngh photocopy cho mt ngi lm cng trung thnh, ri giao cho ngi y lm qun l thay th bn. Ngi l mt Object ca Class QunLTimPhotoCopy. Tr li cch lp trnh, nhng cng vic bn lm hng ngy trong tim photocopy l nhng Methods. Tt c c, s sch ca tim l nhng Properties. Bn sp t mi tun phi gi ngi li qut dn tim, mi thng phi bo tr cc my photocopiers, l nhng Events. By gi bn gi tt c nhng th y li thnh Class QunLTimPhotoCopy. Ln u bn instantiate Class QunLTimPhotoCopy lm thnh ChTThng, ngi s thay th bn lm qun l tim photocopy u tin. Khi bn mun m thm tim th ba, bn s instantiate Class QunLTimPhotoCopy mt ln na lm thnh DSuHng , ngi s thay th bn lm qun l tim photocopy th nh. Khi phn chia trch nhim cc phn code thnh nhng Class, bn c th tp trung t tng vo tng Class mt, khng cn phi c nh mi th trong u khi gii quyt chuyn g. V code ca Class no ch lm vic v nh hng trong phm vi hot ng ca n, khng ng chm n ai khc. Nu c g trc trc, thng thng ta c th xc nh l li ca Class no

40

tng i d dng. C mt cu hi a rng theo phng php OO th: "Thay mt bng n cn bao nhiu programmers?". p: "Khng cn programmer no ht, bn bo n t thay bng ca n." (Li p khc: "Khng cn programmer no ht, Microsoft i tiu chun ra bng m.") Do , nu trc kia bn lp trnh t mnh lo liu cng chuyn th by gi hy giao cho cc Objects t lo cho chng. Tc l trc y, nu bn l ch in mi nm bn phi i gp la rung, th by gi bn bo cc t in phi t em np la vo trong kho cho bn. Sng khng? Ch trong th gii lp trnh OO, ta mi c th m mng nh vy. Inheritance (Tha K) Nguyn tc Encapsulation ni trn cho php ta dng nhiu Objects ca mt hay nhiu Classes mt cch an ton, tc l khng s Methods ca cc Objects gim chn ln nhau. Gi s ta mun dng li mt Class lm mt Class mi, c bit hn, th d nh ta mun lm nn mt Class CaS t Class NghS. Cch lm y gi l Inheritance (Tha k). Cng vic tha k ny c thc hin qua mt qu trnh gi l Subclassing. y ta dng li Class NghS m hon ton khng ng n Source Code (Ngun M) ca Class NghS. Nguyn tc y gi l Reusability (Dng li). Lu l nu ta dng li Source code m c sa i mt cht trong Source Code th khng th gi l Reuse c v c th vic sa i Source Code s gy ra bugs mi. Ta phi ch cn Inherit t Object Code ca mt Class cng c th mi tht s l Reuse. Ta dng Inheritance cho thm cc Class Members, tc l thm c tnh v chc nng. Th d NghS th c Property TmHn (NhyCm (Sentitive) , ThMng (Romantic),...), v Methods KTnLuNim, TrnhDin. Class CaS s gi y cc c tnh v chc nng y v thm Sub nCa, Function HtNhcYuCu, .v.v.. Tng t nh vy, ta cng c th tha k t Class NghS to ra Class HaS. Class HaS s gi y cc c tnh v chc nng ca Class NghS nhng thm Function VChnDung, Sub TrangTr. Trong th d ni trn, ngi ta gi Class NghS l Parent Class, Super Class hay Base Class. Cn Class CaS v Class HaS c gi l Child Class hay SubClass.

41

Nu ta li Inherit Class CaS to ra Class CaSTnNhc v Class CaSCNhc th trong trng hp ny CaS l Parent Class v CaSTnNhc vi CaSCNhc l Child Classes. Mi Cas l mt NghS nn ta c mi lin h "IS (L)" gia hai classes ny. N khc vi mi lin h "HAS (C)". Th d nu trong Class CaS c mt Object thuc Class uBp, th mt CaS c th cho ta mt ba n ngon nhng khng hn cho chnh CaS nu. N ging nh ngoi i CaS KhnhH mn mt u bp i khch. Ta s ni Class CaS c mi lin h HAS (C) vi Class uBp trong trng hp ny, ch khng phi Class CaS IS (L) mt Class uBp. Trong .NET ta ch c Single (n) Inheritance, tc l mt Class khng th Inherit t hai hay ba Classes khc. Ging nh ni Con tha k t Cha v Cha tha k t ngNi, khng c nhc g n M hay BNi. Mt Child Class ch c mt Parent Class, ngc li, mt Parent Class c th c nhiu Child Classes. Polymorphism (a dng) Polymorphism l kh nng dng Class Members trng tn ca Objects thuc v cc Classes khc nhau. Th d Objects KhchHng v NhnVin u c Property Name. Nu ta c th lp trnh dng Name m khng cn ni r n thuc v Object KhchHng hay NhnVin th l Polymorphism. Polymorphism th hin di nhiu hnh thc:

42

1. Late Binding (Hiu lc tr): C ngha l i n gi cht, khi execution, th code mi bit
n ang lm vic vi loi Object no. Ch binding ni n "hiu lc", late binding l c hiu lc tr. iu ny c thc hin bng cch ha hn mt Object thuc Parent Class trong lc runtime ta c th giao cho code mt Object thuc Child Class. Th d ta ha vi khn gi s c mt CaS trnh din, lc m mn ta c th cung cp mt CaSTnNhc hay mt CaSCNhc.

2. Overloading (Qu ti, c ri m cn cho thm) : Overloading cho php ta vit trong

cng mt Class nhiu versions khc nhau ca Property hay Method. Chng c phn bit nh dng parameters khc data type hay con s parameters khc nhau. Th d mt version ca Sub c passed cho mt Integer Parameter, mt version khc c passed cho mt String Parameter, mt version khc li c passed cho hai parameters. Khi ta gi mt Method ca Class, n s da vo data type ca parameters ta pass v s parameters ta pass execute ng version ca Method.

Mt th d v Overloading ngoi i l khi ta yu cu CaS n ca ta c php ngh CaS ht theo Karaoke, hay c Ban Nhc Sng ph ha, hay thm c mt nhm ca s khc ph ha .v.v.. 3. Overriding (Ln quyn) : Overriding p dng cho Child Class i vi Parent Class. Trong Child Class ta cung cp mt Method cng tn, cng s parameters v cng parameter data type vi mt Method trong Parent Class ( y khng nht thit phi l Cha, c th l ngNi hay nhiu i trc) dng n thay th cho Parent Class Method. Ta ni Child Class thay i behaviour (tnh tnh, cch x s) ca Parent Class. i khi ging nh c LLin trc y Ht nhc hi hc, by gi c KhnhH tha k t c nhng override Method Ht ca c v c implement mt Method Ht mi dng cho nhc tr tnh. Lc runtime, nu mt Object khng c implementation ca mt Method th CLR (Common Language Runtime) s dng Method ca Parent Class ca n. Trong th d trn v c KhnhH c mt implementation cho method Ht nn system s dng method , thay v dng method Ht ca c LLin. Dng OO trong VB.NET To mt Class mi Bn to mt Class mi trong VB.NET IDE bng cch dng Menu Command Project | Add Class. Dialog Add New Item s hin ra, chn Class trong s hnh cc Icons nm trong khung bn phi ca Dialog.

43

Source code ca Class mi ny s c cha trong mt VB source file vi extension vb. Trong VB.NET tt c mi VB source files u c extension .vb. System s nhn din ra loi VB file (form, class, module,.v.v..) nh c content ca file, ch khng da vo file extension. Nu bn mun t tn cho Class mi ny l TheClass chng hn, th bn c th sa tn n trong Dialog. Khi bn click button Open mt file mi s c cho thm vo trong Project v n cha hai hng code sau: Public Class TheClass End Class

Bi 6
Nhng chc nng i Tng mi ca VB.NET (phn III)
Dng OO trong VB.NET Ngn cn Tha k Bnh thng (By default) class no cng c th c dng lm base class t ta tha k. Nhng i khi ta khng mun cho ai tha k t mt Class no , lm vic y ta dng keyword NotInheritable khi declare class: Public NotInheritable Class KhngCon End Class Khi ta dng keyword NotInheritable ri th khng class no c th dng keyword Inherits to mt subclass t class y. Tha k v Phm vi hot ng

44

Khi ta dng c tnh tha k to mt SubClass th class mi ny c mi methods, propertes v variables vi Access Modifier Public hay Friend ca SuperClass. Bt c th g declared l Private trong SuperClass th SubClass khng thy hay dng c. C mt ngoi l l New method. Cc Constructor methods cn phi c implemented (nh ngha) li trong mi SubClass. Mt chc na ta s bn vo chi tit v im ny. lm sng t vn SubClass c th dng Class Members no ca SuperClass, ta th code li Function Amount trong LineItem class bng cch khin n gi mt Private Function tn CalculateAmount tnh ra Amount thay v n tnh trc tip nh trc y: Public Function Amount() As Single Return CalculateAmount End Function Private Function CalculateAmount() As Single Return mintQuantity * msngPrice End Function Khi ta SubClass LineItem to ra ServiceLine class, bt c Object ServiceLine no cng tha k Function Amount v Function y c declared Public trong BaseClass LineItem. Ngc li, v Function CalculateAmount l Private nn c ServiceLine class ln bt c client code no dng mt LineItem Object u khng truy cp n c. Nh th, mc du ta gi Function Amount c, nhng n phin n gi Private Function CalculateAmount th c b tr ngi khng? Khng sao c. V Function Amount nm trong cng Class vi Private Function CalculateAmount nn n c th gi c, d rng ta gi Function Amount t ServiceLine hay client code. Th d trong client code ta c nhng hng code nh sau: Protected Sub BtnShowAmount_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnShowAmount.Click Dim Service As ServiceLine Service = New ServiceLine() Service.Item = "Delivery" Service.Price = 50 Service.DateProvided = Now MessageBox.Show (Service.Amount.ToString, "Amount", MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub Kt qu s c hin th trong message box, cho thy Function CalculateAmount c Function Amount gi dm cho client code d rng c client code ln ServiceLine code u khng th gi trc tip c. im ny nhc ti nh li khi cn b, c ln b con trong vn em ra ch cho ba m ti c thng xoi thm rt ngon. Bn ti li xm thy vy biu ti ln ly hai tri xoi n vn. V khng phi l ngi nh nn bn ti khng th ly uc xoi, bi Access Modifier ca thn xoi l Private trong nh ti. Nhng v ti l Public, nn bn ti c th nh ti ly dm. Protected Methods i khi Public hay Private thi cha . Nu ta declare th g Private th n hon ton gii hn trong class, ngc li nu ta declare n Public (hay Friend) th n c th c dng trong subclasses hay client code. Tuy nhin, c lc ta mun mt class member ch c th c dng trong subclasses thi, ch khng cho client code dng. Trong trng hp y ta dng keyword Protected. Th d: Public Class FatherClass

45

Protected DiSn As Single End Class Public Class SonClass Inherits FatherClass Public Function ChiaCa() As Single Return Disn End Function End Class y ta c BaseClass FatherClass vi Protected Field Disn. Khng c client code no c th thy Field DiSn c. Th nhng bt c SubClass no ca FatherClass cng u tha k v dng c DiSn. Trong th d trn, mt ln na SubClass c mt Public method (ChiaCa) c th return mt protected value - nhng chnh value y, DiSn, khng trc tip cho php client code dng. Overriding Methods Chng ta bit rng c tnh quan trng ca Inheritance l mt SubClass chng nhng tha k behaviours ca ParentClass m cn c th override (ln quyn) cc behaviours y na. Chng ta thy mt SubClass c th extend (thm ra) ParentClass bng cch cho thm cc methods Public, Protected v Friend. Hn na, khi dng overriding, mt SubClass c th alter (sa i) behaviours ca cc methods trong ParentClass. Bnh thng (By default), ta khng th override methods trong ParentClass tr khi cc methods y c declared vi keyword Overridable trong ParentClass. Th d: Public Class ClassCha Public Overridable Sub ChoHi() MessageBox.Show("Cho cc chu", "Class Cha") End Sub End Class Tip theo, khi to mt SubClass, nu mun ta c th override behaviour ca Sub ChoHi bng cch dng keyword Overrides nh sau: Public Class ClassCon Inherits ClassCha Public Overrides Sub ChoHi() MessageBox.Show("Tha cc Bc", "Class Con") End Sub End Class By gi ta c th vit client code nh sau: Private Sub BtnSubClassObject_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnSubClassObject.Click Dim obj As New ClassCon() obj.ChoHi() End Sub Khi ta click button BtnSubClassObject program s hin th message dialog di y:

46

Virtual Methods Tuy nhin, hy xem trng hp ta code nh sau: Private Sub BtnParentClassObject_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnParentClassObject.Click Dim obj As ClassCha obj = New ClassCon() obj.ChoHi() End Sub Trc ht, y c v k k, ti sao declare mt variable loi ClassCha m li instantiate mt object ClassCon. Chuyn hon ton bnh thng, v ClassCon l mt ClassCha. Tc l mt variable loi ClassCha hay ClassCon u c th cha, tht ra l hold references to (point to, ch ti), mt instance ca ClassCon. im ny p dng tng qut khi ta dng Inheritance. Mt variable loi SuperClass c th hold reference to bt c SubClass Object no tha k t SuperClass y. l mt cch ta implement tnh a dng (polymorphism). u c th lm ta ngc nhin l khi ta click button BtnParentClassObject ta cng thy hin th message " Tha cc Bc".

Sao l vy? Variable obj c declared l ClassCha ti sao message khng phi l "Cho cc chu"? L do l Sub ChoHi ca ClassCon c gi thay v Sub ChoHi ca ClassCha. Ta ni Sub ChoHi l Virtual method. Tt c methods trong VB.NET u l virtual. nim virtual ni rng ci implementation ca con chu tr nht trong dng h c dng - khng cn bit l variable c data type l class ca th h no trong dng h. Tc l, nu variable dng trong client code hold references to ClassngNi, ClassCha, ClassCon hay ClassChu th method trong ClassChu c gi. Nu trong ClassChu khng c implementation ca method th ta gi method trong ClassCon, nu khng c th gi method trong ClassCha .v.v.. theo th t t b di ln b trn. Bn c th Download source code ca program ny ti y.

47

Keyword Me Keyword Me c dng khi ta mun ni r (explicitly) rng ta mun dng method ca chnh ci Class ang cha code y, ch khng phi mt implementation no khc ca method y. Cng c trng hp ta phi dng keyword Me ni ta mun dng class-level variable ch khng phi procedure-level variable c cng tn. Mt procedure-level variable, tc l local variable ca mt method, c cng tn vi mt class-level variable c gi l shadowed variable. Th d: Public Class TheClass Private strName As String Public Sub DoSomething() Dim strName As String strName = "Quang" End Sub End Class y, variable strName c declared class-level v bn trong Sub DoSomething. Bn trong method y local variables (k c shadowed variables) s c dng v chng che y class-level variables tr khi ta ni r rng phi dng variable ca class-level bng cch dng keyword Me: Public Class TheClass Private strName As String Public Sub DoSomething() Dim strName As String strName = "Quang" ' thay i value ca local (shadowed) variable Me.strName = "Kim" ' thay i value ca class-level variable End Sub End Class Keyword MyBase Keyword Me rt tin dng khi ta mun dng Class members ca chnh Class cha code. Tng t nh vy, i khi ta mun dng Class method ca BaseClass (cng gi l SuperClass), ch khng phi mt implementation ca method y trong SubClass. Nh l mt virtual method lun lun gi implementation ca Class tr nht. T trong mt SubClass, nu mun gi mt method ca BaseClass ta dng keyword MyBase nh sau: Public Class ClassCon Inherits ClassCha Public Overrides Sub ChoHi() MessageBox.Show("Tha cc Bc", "Class Con") MyBase.ChoHi() End Sub End Class By gi nu ta chy Sub ChoHi ca ClassCon ta s c hai messages, mt ci t ClassCon theo sau bi mt ci t ClassCha. MyBase ch ni n BaseClass trc tip, tc l Class cha thi ch khng ni n Class ng ni. Khng c cch no ni n hn mt th h. Du vy, keyword Mybase c th c dng cho bt c th g c declared Public, Friend hay Protected trong ParentClass. iu ny k lun c nhng th m ParentClass tha k t cc th h trc trong gia nh, tc l ClassngNi, ClassngC .v.v.. Keyword MyClass

48

V l do virtual method, ta s gp nhng trng hp rc ri nh khi code ca ParentClass li chy code ca SubClasses. Khi vit code ca mt class, t method ny ta thng gi nhng methods khc nm trong cng class. Th d nh: Public Class ClassCha Public Sub V() ChoHi() End Sub Public Overridable Sub ChoHi() MessageBox.Show("Cho cc chu", "Class Cha") End Sub End Class Trong trng hp ny, V gi Sub ChoHi n tip. l v ChoHi c declared Overridable nn rt c th mt SubClass s implement method ChoHi v ln quyn n. Th d: Public Class ClassCon Inherits ClassCha Public Overrides Sub ChoHi() MessageBox.Show("Tha cc Bc", "Class Con") End Sub End Class V c tnh virtual ca ChoHi nn ta tng ClassCha execute chnh Sub ChoHi ca n nhng t ra n li execute code ca ChoHi trong ClassCon. Trong code di y, mt Object ClassCon gi Sub V ca ClassCha: Private Sub BtnSubClassObject_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnSubClassObject.Click Dim obj As New ClassCon() obj.V() End Sub Trong ClassCha, Sub V gi ChoHi ca chnh n, tuy nhin Sub ChoHi y b overridden bi implementation ca ChoHi trong ClassCon. Do , program s hin th message "Tha cc Bc". Nu ta khng mun nh vy, ta mun V execute chnh code ca ChoHi trong ClassCha th phi dng keyword MyClass nh sau: Public Class ClassCha Public Sub V() MyClass.ChoHi() End Sub Public Overridable Sub ChoHi() MessageBox.Show("Cho cc chu", "Class Cha") End Sub End Class y ta khng th dng keyword Me v V c gi ChoHi class-level trong ClassCha ch khng phi trong mt SubClass, nhng b overridden. Hnh di y minh ha qu trnh gi V t client code:

49

Sub V tht ra nm trong ClassCha m ClassCon tha k nn V c executed trong ClassCha v gi Sub ChoHi trong cng class ( ClassCha). Nhng v ClassCon c mt implementation ca Sub ChoHi nn n overrides ChoHi ca ClassCha. Overridding Method New Chng ta thy ta c th override methods v dng cc keywords Me, MyBase v MyClass gi cc overriden methods trong dy chuyn tha k. Tuy nhin, i vi Constructor ca class th c nhng lut l c bit dnh ring cho method New. Nhng methods New khng t ng di truyn t BaseClass xung SubClass. Mi SubClass phi c mt implementation ring cho Constructor d rng, nu mun, n c th gi vo BaseClass vi keyword MyBase: Public Class ClassCon Inherits ClassCha Public Sub New() MyBase.New() ' thm cc code khc initialise ti y End Sub End Class Khi gi Constructor ca BaseClass, ta phi gi n trc nht - nu khng s b error. Tuy nhin ta khng cn gi Constructor ca BaseClass v Constructor ca BaseClass c gi t ng. C mt lut c bit l nu tt c methods New trong BaseClass u i hi parameters th ta phi implement t nht mt method New trong SubClass v ta phi t statement MyBase.New ngay pha u. D nhin l ta c th Overload method New trong SubClass, nhng ta phi t lo liu cch gi mt method New thch hp trong BaseClass. To BaseClasses v Abstract Methods Cho n gi ta bn v virtual method vi c tnh override trong nguyn tc tha k. Trong cc th d trc y BaseClass c instantiated thnh Object lm chuyn ny, chuyn kia. Nhng i khi ta mun to mt BaseClass ch dng cho tha k m thi. Keyword MustInherit (Phi c Tha K)

50

Tr li ci th d v Inheritance vi Class LineItem. S d ta t ra Class LineItem l v n cha nhng th chung cho c hai classes ProductLine v ServiceLine. Ch tht ra mt Object ca Class LineItem khng cha mi c tnh lm mt vic g thc t. Nu ta mun ni r rng Class LineItem ch c dng to nhng SubClasses bng cch tha k t n, ta c th declare nh sau: Public MustInherit Class LineItem Tc l ta ch thm keyword MustInherit thi, ch khng thay i g khc. Kt qu l t nay Client code khng th instantiate mt Object t Class LineItem. Do dng code sau s b syntax error: Dim myObject As New LineItem() Thay vo , nu mun dng LineItem ta phi to SubClass t n. Keyword MustOverride (Phi b Ln Quyn) Tng t vi nim Phi-c-tha-k trong Class, ta cng c MustOverride cho mt method. C th trong BaseClass ta khai bo mt method, nhng ta i hi method y phi c mt implementation trong SubClass. Ta declare nh sau: Dim MustOverride Sub CalculatePrice l y khng c thn th ca Sub CalculatePrice hay statement End Sub g c. Khi dng MustOverride ta khng c php cung cp mt implementation cho method trong BaseClass. Mt method nh th c gi l abstract method hay pure virtual function, v n ch c phn khai bo ch khng c phn nh ngha. Nhng abstract methods phi c overridden trong bt c SubClass no ca BaseClass th mi dng c. Nu khng, ta s khng c phn implementation ca method u c v khi compile s gp syntax error. Abstract Base Classes Nu hp c hai nim MustInherit v MustOverride li ta s to ra mt abstract base class. y l mt Class ch c khai bo ch hon ton khng c implementation. Ta phi SubClass t n th mi lm vic c, th d nh: Public MustInherit Class ClassCha Public MustOverride Sub V() Public MustOverride Sub ChoHi() End Class K thut ny rt thch hp ta code ci sn hay b cc ca program ngay trong lc thit k. Class no tha k ClassCha th phi implement c Sub V ln Sub ChoHi, nu khng s b syntax error. Nhn v mt phng din, abstract base class rt ging khai bo Interface. Nu dng Interface, chng ta c th khai bo nh sau: Public Interface ICha Sub V() Sub ChoHi() End Interface Bt c class no chu implement interface ICha th phi implement c Sub V ln Sub ChoHi, nu khng s b syntax error - do , ta thy Interface rt ging mt abstract base class. S khc bit chnh gia abstract base class vi Interface l ch tha k. Khi ta to mt class con bng cch SubClass t ClassCha, chnh class con y li cng c th c SubClassed.

51

My class chu ny s t ng tha k V v ChoHi t class con. Trong khi y ni v Interface, mi class phi t implement ICha mt cch c lp v phi cung cp hai Subs V v ChoHi ca chnh n. V th, nu ta khng c nh dng li code ca cc Subs khi ta to cc classes mi th ta c th dng interface. Ngc li nu ta mun dng li code trong SubClass theo nguyn tc tha k th ta nn dng abstract base class.

Bi 5 Nhng chc nng i Tng mi ca VB.NET (phn II)


Dng OO trong VB.NET To mt Class mi Class Keyword Trong mt .vb file ta c th vit nhiu Classes, code ca mi Class nm trong mt Class ... End Class block. Th d: Public Class TheClass Public Sub Greeting() MessageBox.Show("Hello world", MsgBoxStyle.Information, "TheClass") End Sub End Class MessageBox.Show v MsgBoxStyle.Information trong VB.NET thay th MsgBox v vbInformation trong VB6. Classes v Namespaces Nhc li l .NET dng Namespace sp t cc Classes cho th t theo nhm, loi. Namespaces c declared vi mt Block Structure ging nh sau: Namespace Vovisoft Public Class TheClass Public Sub Greeting() MessageBox.Show("Hello world", MsgBoxStyle.Information, "TheClass") End Sub End Class End Namespace Mun ni n bt c Class, Structure, hay th g c declared bn trong mt Namespace...End Namespace block ta phi dng tn Namespace trc. Th d: Private myObject As Vovisoft.TheClass Mt source file c th cha nhiu Namespaces, v bn trong mi Namespace li c th c nhiu Classes. Ngoi ra, Classes thuc v cng mt Namespace c th nm trong nhiu files khc nhau trong mt VB.NET project. Th d ta c mt source file vi code nh sau:

52

Namespace Vovisoft Public Class TheClass ' Code End Class End Namespace V mt source file khc trong cng project vi code: Namespace Vovisoft Public Class TheOtherClass ' Code End Class End Namespace Vy th trong Namespace Vovisoft ta c hai Classes TheClass v TheOtherClass. Nh l, by default, Root Namespace ca mt VB.NET project l tn ca project y. Khi ta dng Namespace block structure l chng ta ang thm mt tng tn vo Root Namespace. Do , trong th d trn nu tn project l MyProject th, t bn ngoi project y, ta c th declare mt variable nh sau: Private myObject As MyProject.Vovisoft.TheClass To ra Methods Methods trong VB.NET c hai th: Sub v Function. Function th phi return mt kt qu. By default, parameters ca Method l ByVal ch khng phi ByRef. Tc l nu mun parameter no ByRef th phi nh khai ra r rng. Nhc li l khi mt variable c passed vo trong mt method bng ByVal th system cho method mt copy (bn sao) ca variable, do , tr s ca variable khng b thay i bi cng tc ca method. Ngc li, nu mt variable c passed vo trong mt method bng ByRef th method dng chnh variable , do , tr s ca variable c th b thay i bi cng tc ca method. Ta c th gii hn vic s dng mt method bng cch p t mt Access Modifier (sa i quyn truy nhp) hay cn gi l Scoping keyword (phm vi hot ng): Private - ch cho php code trong cng Class c gi. Friend - ch cho php code trong cng project/component c gi. Public - cho php ai gi cng c. Protected - cho php code trong subclasses (classes con, chu) c gi. Protected Friend - cho php code trong cng project/component hay code trong subclasses c gi. To ra Properties Trong VB.NET ta ch dng mt routine duy nht cho mi Property, vi hai ch Get v Set nh sau (khng cn dng ch Let ca VB6 na): Private mdescription As String Public Property Description() As String Set (ByVal Value As String) mdescription = Value End Set Get Description = mdescription End Get End Property ReadOnly v WriteOnly property

53

By gi nu Property l ReadOnly ta s ly phn Set ra v vit: Public ReadOnly Property Age() As Integer Get Age = 3 End Get End Property hay WriteOnly ta s y phn Get ra v vit: Private _data As Integer Public WriteOnly Property Data() As Integer Set (ByVal Value As Integer) _data = Value End Set End Property Default Properties Default Property l property ca Object m program dng khi ta ch cho tn ca Object v khng ni r property no. Th d trong VB6 khi ta code: TextBox1 = "The house of rising sun" VB6 hiu rng ta mun dng Default Property text ca Textbox1 nn code y tng ng vi: TextBox1.text = "The house of rising sun" Trong VB6 khi ta dng keyword Set vi tn ca Object, th d nh: Dim myTextBox As Textbox Set myTextBox = TextBox1 program s hiu l ta mun ni n chnh Object myTextBox . Nu khng th n bit ta mun ni n Object Default Property m lm bing code cho r ra. Trong VB.NET Default Property phi l mt Property array. Mt Property array l mt property c Indexed (ni n tng Item bng con s Index) ging nh mt array. L do chnh ca s bt buc ny l khi ln ln gia hai trng hp ta ni n Default property ca mt Object hay chnh Object y, v trong VB.NET ta khng cn dng Set keyword cho Object assignment na (ta ch cn dng keyword Set trong Property m thi). By gi h mun ni n Default Property ca Object th phi dng Index. Th d ni n chnh Object, ta code: myValue = myObject ni n Default Property Item 3 ca Object, ta code: myValue = myObject(3) S thay i t VB6 ny c ngha l mt property array procedure phi nhn mt parameter. Th d: Private theData(100) As String Default Public Property Data(ByVal Index As Integer) As String Get Data = theData(Index)

54

End Get Set(ByVal Value As String) theData(Index) = Value End Set End Property T nay ta khng th code: TextBox1 = "Good morning!" nh trong VB6 c na, m phi code: TextBox1.text = "Good morning!" V Property Text khng cn l Default Property ca TextBox. Overloading methods Mt trong nhng chc nng a din (Polymorphism) hng mnh nht ca VB.NET l overload (qu ti, c ri m cn cho thm) mt method. Overloading c ngha l ta c th dng cng mt tn cho nhiu methods - min l chng c danh sch cc parameters khc nhau, hoc l parameter dng data type khc nhau (td: method ny dng Integer, method kia dng String), hoc l s parameters khc nhau (td: method ny c 2 parameters, method kia c 3 parameters). Overloading khng th c thc hin ch bng cch thay i data type ca Return value ca Function. Phi c parameter list khc nhau mi c. Di y l th d ta dng Overloading code hai Functions tm data, mt ci cho String, mt ci cho Integer: Public Function FindData(ByVal Name As String) As ArrayList ' find data and return result End Function Friend Function FindData(ByVal Age As Integer) As ArrayList ' find data and return result End Function l ta c th cho mi overloading Function mt phm vi hot ng (Scope on implementation) khc nhau. Trong th d trn ta dng Access Modifier Public cho Function u v Friend cho Function sau. Object Lifecycle Object Lifecycle (cuc i ca Object) c dng ni n khi no Object bt u hin hu v khi no n khng cn na. S d ta cn bit r cuc i ca mt Object bt u v chm dt lc no l trnh dng n khi n khng hin hu, tc l cha ra i hay khut bng ri. New method Trong VB6, khi mt Object thnh hnh th Sub Class_Initialize c executed. Tng ng nh vy, trong VB.NET ta c Sub New(), gi l Constructor. VB.NET bo m Sub New() s c CLR gi khi Object c instantiated v n chy trc bt c code no trong Object. Nu Sub Class_Initialize ca mt Class Object trong VB6 khng nhn parameter th Sub New() trong VB.NET chng nhng c nhn parameters m cn cho php ta nhiu cch gi n. S khc bit trong Constructors ca VB6 v VB.NET rt quan trng. Tng tng ta c mt Khun lm bnh bng lan; khun l Class cn nhng bnh lm ra t

55

khun s l cc Objects bnh bng lan. Nu ta mun lm mt ci bnh bng lan vi mt lp s-c-la trn mt th cng tc s gm c hai bc:

1. 2.

Dng khun (Class) nng mt ci Object bnh bng lan (dng Sub Class_Initialize) ln mt bnh mt lp s-c-la (dng class Public Sub ThoaScla) n y, mi chuyn tng i n tha. By gi, nu khch hng mun mt ci bnh bng lan dng trng vt thay v trng g th ta chu thua thi, v khng c cch no bo Sub Class_Initialize dng trng vt thay v trng g ngay trong lc ang to dng ra Object bnh bng lan. Sub New() trong VB.NET c th nhn parameters nn n c th nhn ch th dng trng vt ngay trong lc nng ci Object bnh bng lan. Ci dng n gin nht ca Sub New() m ta c th dng l khng pass parameter no c (trong trng hp ny th ging nh Sub Class_Initialize ca VB6). Ta code Sub New() trong Class nh sau: Public Class BanhBongLan Public Sub New() ' Code to initialise object here End Sub End Class Ta instantiate mt Object bnh bng lan nh sau: Dim myBanhBongLan As New BanhBongLan() cho Users c s la chn khi instantiate Object, ta c th code thm nhng Sub New khc, mi Sub dng mt danh sch parameter khc nhau. Th d: Public Class BanhBongLan Public Sub New() ' Code to initialise object here End Sub Public Sub New(ByVal LoaiTrung As String) Select Case LoaiTrung Case "Vit" ' Code for TrngVt here Case "Ga" ' Code for TrngG here End Select End Sub End Class Dng cng mt tn method implement nhiu methods khc nhau c gi l overload. l mt trng hp a dng (polymorphism) ca OO programming. Trong th d trn nu TrngVt v TrngG l hai loi Data Types khc nhau th ta cng c th dng: Sub New (ByVal TrngVt As TrngVtDataType) instantiate bnh TrngVt v Sub New (ByVal TrngG As TrngGDataType) instantiate bnh TrngG. Nh th ta khi bn tm vi Select Case LoaiTrung khi ch dng mt Sub New duy nht vi 1

56

parameter. Trong VisualStudio.NET, khi ta dng tn ca mt overloaded method, IntelliSense s hin th hng dn ta nh vo parameter list khc nhau ty theo method ta chn. Termination Trong VB6 mt Object s b hu dit khi ci reference (ch dng n Object) cui cng b ly i. Tc l khi khng c code no khc dng Object na th Object s b t ng hu dit. System gi mt counter m s clients ang dng Object. Cch ny hay ch khi counter tr thnh 0 th Object b hu dit ngay. Ta ni n c deterministic finalization, ngha l ta bit r rng khi no Object bin mt. Tuy nhin, nu ta c hai Object dng ln nhau (gi l circular references), th ngay c n lc chng khng cn hot ng na, chng vn hin hu mi trong b nh v ci Reference counter ca c hai Objects khng bao gi tr thnh 0. Nu trng hp ny xy ra thng ln ln system khng cn memory na, ta gi l memory leak (b r b nh) . .NET dng phng php khc qun l chuyn ny. C mi chc, mt program s chy kim xem c Object no khng cn reference na hu dit. Ta gi l Garbage Collection (nht rc). Ngay c trng hp hai Objects c circular references nhng nu khng c code no khc reference mt trong hai Objects th chng cng s c hu dit. C iu, cng tc nht rc chy in the background (pha sau hu trng) vi u tin thp, khi CPU rnh rang, nn ta khng bit chc mt Object s b hy dit n bao gi mi tht s bin mt. Ta ni n c nondeterministic finalization. Ta c th p CLR nht rc lp tc bng code: System.GC.Collect() Tuy nhin, ta ch lm vic y khi kt qu thi. Tt hn, ta duyt li design ca mnh cho php cc Objects ht xi c th ngi chi trong b nh ch n lc c hy dit. Dng Dispose Method Nu ta c mt Object dng nhiu ti nguyn (resources) nh b nh, database connection, file handle,.v.v. v ta cn phi th cc ti nguyn ra ngay sau khi Object khng cn hot ng na, ta cn implement mt Interface tn IDisposable vi Implements keyword nh sau: Public Class TheClass Implements IDisposable Bn phi vit code cho Sub Dispose ging nh sau: Private Sub Dispose() Implements IDisposable.Dispose ' Vit clean up code y th cc ti nguyn ra End Sub Sau bn vn phi vit code cho Client n gi Dispose Method trong IDisposable interface. Bn cn phi dng CType cast Object Class khi gi Dispose. Dim objObject As New TheClass() CType (objObject, IDisposable).Dispose() ly i Reference n mt Object (gi l Dereference Object) bn c th dng: myObject = Nothing l ta khng c dng keyword Set nh trong VB6. Nh l sau khi statement trn c executed th myObject khng bin mt ngay nhng n i Garbage Collector n gii quyt.

57

Tha k Tha k (Inheritance) l kh nng ca mt Class t c interface (giao din) v behaviours (tnh tnh) ca mt Class c sn. Ci qu trnh lm nn vic y c gi l Subclassing. Khi ta to ra mt Class mi tha k c interface ln behaviours t mt Class c sn l chng ta to ra mt subclass ca Class nguyn thy. Ngi ta ni l mt mi lin h is-a (l mt), ni Class mi l mt loi Class nguyn thy. Ta phn bit mi lin h is-a vi mi lin h has-a (c mt). Trong mi lin h has-a, Object ch c th lm ch mt hay nhiu Objects t, nhng Object t l mt loi c th hon ton khc vi Object ch. biu din c tnh Inheritance ta hy xt trng hp mt cng ty cung cp Sn phm v Dch v. Ta c th code mt Class cho Sn phm (ProductLine) v mt Class cho Dch v (ServiceLine) , ring r nhau. Nhng v thy chng c nhiu im tng ng nn ta s code mt Class gi l Mn hng (LineItem), ri inherit t LineItem ra ProductLine v ServiceLine. LineItem c cc properties ID, Item, Price (gi) v Quantity (s lng). N cng c mt Public Function cho Amount (s tin). Public Class LineItem Private mintID As Integer Private mstrItem As String Private msngPrice As Single Private mintQuantity As Integer Public Property ID() As Integer Get Return mintID End Get Set (ByVal Value As Integer) mintID = Value End Set End Property Public Property Item() As String Get Return mstrItem End Get Set (ByVal Value As String) mstrItem = Value End Set End Property Public Property Price() As Single Get Return msngPrice End Get Set (ByVal Value As Single) msngPrice = Value End Set End Property Public Property Quantity() As Integer Get Return mintQuantity End Get Set (ByVal Value As Integer) mintQuantity = Value End Set End Property Public Function Amount() As Single Return mintQuantity * msngPrice

58

End Function End Class to Class ProductLine t Class LineItem ta phi dng Inherits keyword. Mi Object ProductLine l mt Object LineItem vi ProductID v Description. ProductID ca ProductLine c pass vo Sub New lc instantiate Object ProductLine. Cn Description l mt ReadOnly property ca ProductLine. Ta c th code Class ProductLine nh sau: Public Class ProductLine Inherits LineItem Private mstrDescription As String Public ReadOnly Property Description() As String Get Return mstrDescription End Get End Property Public Sub New(ByVal ProductID As String) Item = ProductID mstrDescription = "No description yet" ' Default description ' Vit code y c chi tit ca Product t Database ' trong c th c Description ca Product End Sub End Class Statement Inherits LineItem khin ProductLine tha k mi interface v behaviours ca LineItem. Do ta c th code mt Sub BtnProduct_Click hin th chi tit ca ProductLine trong mt Listbox nh sau: Protected Sub BtnProduct_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnProduct.Click Dim pl As ProductLine pl = New ProductLine("P1234") ListBox1.Items.Add("ProductItem:" & pl.Item) ListBox1.Items.Add("Description: $" & pl.Description) End Sub Trong code bn trn ta dng c property Item ca Class LineItem ln property Description ca Class ProductLine. C hai u l property ca ProductLine v n l mt SubClass ca LineItem. Ging nh vy, mt ServiceLine c th c ghi ngy gi cung cp service. Ta code Class ServiceLine nh sau: Public Class ServiceLine Inherits LineItem Private mdtDateProvided As Date Public Sub New() ' Make 1 as default number of services of this kind for invoice Quantity = 1 End Sub Public Property DateProvided() As Date Get Return mdtDateProvided End Get Set (ByVal Value As Date)

59

mdtDateProvided = Value End Set End Property End Class Mt ln na ta dng Sta

Bi 7 Nhng chc nng i Tng mi ca VB.NET (phn IV)


Dng OO trong VB.NET Shared class members ( Cc thnh vin dng chung ca class) Mc d Object rt hiu nng v hu ch, c khi ta ch mun truy cp cc variables hay methods ca mt class lm vic m khng cn phi instantiate mt Object no c. Tc l y nh trong qu kh, khi vit VB6, ta dng cc variables hay methods ca mt BAS Module. i khi ging nh thay v k giao ko vi mt thu (Object) thc hin mt cng trnh, ta ch mun mn th hay chuyn vin lm vic gia cng ( gi cc methods) thi. Shared Methods Trong VB.NET chng nhng mt Class c cc methods v properties thng thng nh ta thy - tc l nhng methods v properties ca mt Object ta c th dng ngay sau khi Object y thnh hnh qua qu trnh instantiation - m cn c cc methods v properties ta c th dng m khng cn phi to ra mt instance no t Class. Chng c gi l shared methods. ( Trong cc ngn ng lp trnh khc cc methods ny cn c gi l static methods hay class methods). Ta khng th truy cp mt shared method qua mt Object nh method bnh thng, nhng phi dng trc tip tn ca class. Th d sau y s minh ha iu ny: Public Class Math Shared Function Add( ByVal x As Single, ByVal y As Single) As Single Return x + y End Function End Class Sau khi nh ngha Class Math, ta c th dng Shared Function Add m khng cn instantiate mt Object thuc class Math nh sau: Dim Result As Single result = Math.Add(12.5, 36.8) thay v dng mt object variable ta dng thng tn ca class Math truy cp method Add. Vi mt method bnh thng th lm nh th s b syntax error, nhng trong trng hp ny th khng sao. Ta cng c th overload shared methods, tc l c th code nhiu shared methods vi cng mt tn nhng c nhng parameter lists khc nhau. Phm vi hot ng bnh thng (Default Scope) ca shared methods l Public. Tuy nhin ta c th gii hn vic truy cp chng bng cch dng nhng Access Modifiers nh Friend,

60

Protected hay Private. Tht ra khi overloading mt shared method ta c th dng nhng scopes khc nhau cho mi shared method. C mt th d v shared method t .NET system class libraries. m mt text file theo mode input, in hnh ta dng shared method trong File class nh sau: Dim inFile As StreamReader = File.OpenText("words.txt") Dim strIn As String strIn = inFile.ReadLine() y khng c object File no c to ra. Method OpenText l mt shared Function, n m input text file words.txt v cho ta mt object loi StreamReader tn inFile ta dng sau . Shared Variables i khi ta mun tt c objects ca cng mt class u dng chung mt variable. Ta c th thc hin vic y vi shared variables. Mt shared variable c khai bo vi keyword shared ging nh shared method: Public Class MyCounter Private Shared mintCount As Integer End Class Ta c th cho shared variable mt scope Public hay Private ty , nhng By Default, scope ca shared variables l Private, khc vi shared methods th By Default l Public. im quan trng ca shared variables l chng c dng chung gia mi instances (objects) ca cng mt class. Di y l mt th d trong ta gi ci counter c tr s tng thm 1 mi ln c mt instance mi ca class MyCounter. Bt c lc no ta cng c th bit c bao nhiu objects c to ra bng cch c property Count: Public Class MyCounter Private Shared mintCount As Integer Public Sub New() mintCount += 1 End Sub Public ReadOnly Property Count() As Integer Get Return mintCount End Get End Property End Class Nh th, nu ta chy client code di y n s hin th kt qu l 3: Protected Sub Button1_Click( ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim obj As MyCounter obj = New MyCounter() obj = New MyCounter() obj = New MyCounter() MsgBox(obj.Count, MsgBoxStyle.Information, "Counter") End Sub

61

Nu ta chy code thm hai ln na, ta s c 6 v 9. H ta cn chy chng trnh th ci counter cn lm vic. Khi ta chm dt chng trnh th ci counter s bin mt. Bn c th Download source code ca program ny ti y. Global values Mt cch dng rt thng dng khc ca shared variable l xem n nh mt loi Global variable. Khi dng scope Public ta s c mt dng tng ng vi VB6 Global variable trong mt BAS Module. Th d nh: Public Class GlobalData Public Shared TotalCost As Single End Class Sau ta c th dng variable ny khp ni trong client code: GlobalData.TotalCost += 45.60 Events Raising Event x l trong mt Project khc VB.NET khng h tr Events t i cha n i con theo ng nguyn tc tha k. Nu mt BaseClass nh ngha mt Public Event th ta ch c th raise event y trong code ca BaseClass thi ch khng th raise event y trong SubClass no ca BaseClass y. Khc vi methods, ta khng th overload mt Event, tc l khng th dng mt tn cho hai Events c parameter list khc nhau. Ta c th to mt Class Library Project vi mt Class trong c raise mt Event ri to mt project khc trong c code n nhn v x l Event y. th vic ny bn hy to mt Class Library Project mi vi tn ClassLibrary1 v vit nhng dng code nh ngha Class Class1 vi Event TheEvent v Sub LmVic raise Event nh sau: Public Class Class1 Public Event TheEvent() Public Sub LmVic() RaiseEvent TheEvent() End Sub End Class K bn dng Menu command File | Add Project | New Project thm mt project mi vi tn EventClass. c th dng Class1, bn cn phi reference n vi Menu command Project | Add Reference..., chn Tab Projects v click Browse chn ClassLibrary1.DLL t subfolder ClassLibrary1\bin ca solution nh trong hnh di y:

62

Mt khi referenced ClassLibrary1 vi Class1 trong y, by gi bn c th doubleclick ln Form1 code nh sau: Private WithEvents obj As ClassLibrary1.Class1 Private Sub Form1_Load( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load obj = New ClassLibrary1.Class1() End Sub Nh l ta phi declare variable obj thuc loi ClassLibrary1.Class1 vi WithEvents. t mt Button tn BtnLmVic v doubleclick ln n code nh sau: Private Sub BtnLmVic_Click( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnLmVic.Click obj.LmVic() End Sub x l Event ca obj bn chn tn t combobox pha trn bn tri, ri chn TheEvent t combobox bn phi nh trong hnh di y:

63

y ta handle Event bng cch hin th mt message n gin: ang x l mt Event t Class1. By gi bn c th chy program. Khi bn click Button BtnLmVic program s hin th message chng minh rng t mt Application ta c th handle event trong Class ca mt Project khc.

Bn c th Download source code ca program ny ti y.

Ghi ch Nu sau khi Unzip source file v load project vo, bn dng IDE Menu command Build | Rebuild Solution compile li ht cc modules nhng gp error v references th hy lm nh sau: Trong Solution Explorer click cc tree nodes references tm cc references c du chm thang trong tam gic vng v remove chng. Dng Menu command Project | Add Reference... chn *.dll li t mt \bin subfolder. Rebuild Solution.

64

Nu bn dng ch Vit Unicode trong program th nh set up Advanced Save Option vi Menu command File nh trong hnh di y:

Khi Dialog hin ra, bn chn Unicode (UTF-8) cho Encoding:

65

Nu bn khng thy c menuItem Advanced Save Option trong Menu File th c dng menuItem Save As... ri click ln combo box Save pha di, bn phi ca Save File As Dialog ri chn Save with Encoding... nh trong hnh di y:

Nu bn qun set up Advanced Save Option nh trn, ch Vit s b lu tr di dng ANSI nn mt s s mt du ch Vit v thay vo bng nhng du ?.

Shared Events Events c th c declared l Shared. Shared methods ch c th raise shared events, chng khng th raise non-shared events. Th d nh: Public Class NgunEvent Shared Event EventDngChoSharedMethods() Public Shared Sub DngChung() RaiseEvent EventDngChoSharedMethods() End Sub End Class Mt shared event c th c raised bi c shared methods ln non-shared methods:

66

Public Class NgunEvent Public Event TheEvent() Shared Event EventDngChoSharedMethods() Public Shared Sub DngChung() RaiseEvent EventDngChoSharedMethods() End Sub Public Sub LmVic() RaiseEvent TheEvent() RaiseEvent EventDngChoSharedMethods() End Sub End Class Nu bn tm cch raise mt non-shared event t mt shared method th s b syntax error. Early Binding hay Late Binding (Hiu lc Sm hay Tr) Early Binding c ngha l program bit r ngay t u loi Object (thuc Class no) s c dng trong hon cnh no. N cho php IntelliSense hin th cho ta thy nhng class members no ta c th dng v compiler kim xem nhng methods ta dng c hin hu khng. Early Binding code c compiled ra IL rt hiu nng v compiler bit r rng data types ca cc parameters. Ngc li Late Binding c ngha l ta lm vic cch linh ng vi mt Object lc run-time, tc l program khng bit trc Object y thuc loi no. Late Binding cho ta s uyn chuyn ch lm sao Object cung cp ng method cn thit l . Do , ta khng hng c s sang trng IntelliSense cung cp v compiler khng th kim sot loi Object trc dm cho ta c. Mc du Late Binding code chy chm hn nhng n cho ta s t do ging nh khi lm vic ngoi i, n gi cht mi xc nhn. By Default, mi objects trong VB.NET u l Late Bound. Visual Studio.NET IDE vi Option Strict Off by default p t lut . Nu mun p t Early Binding ta cn phi nht cu Option Strict On u mt source file. Dng Object Type Ta c Late Binding khi compiler khng th xc nh loi Object ta ang gi. Ta c th thc hin iu ny bng cch dng Object Type tuyn b mt cch m h rng ta s dng mt loi Object no , v mt variable vi Object type c th hold-reference-to bt c mt Object no. Do , nhng dng code sau y c th c dng cho bt c Object no m Class ca n c implement Sub CngTcTi v khng dng parameter no c: Option Strict Off Module LateBind Public Sub LmVic( ByVal obj As Object) obj.CngTcTi() End Sub End Module Nu obj passed vo Sub LmVic khng c mt Sub CngTcTi chng dng parameter no ht th program s b error lc run-time. Do , ta nn lun lun dng mt Try Structure bt ci error . Th d nh: Option Strict Off Module LateBind Public Sub LmVic( ByVal obj As Object) Try obj.CngTcTi() Catch e As Exception

67

' Code x l trng hp Object khng thch hp Console.WriteLine("Invalid Object passed to LmVic") End Try End Sub End Module Late Binding v Reflection .NET framework h tr mt nim gi l reflection. N ni n kh nng ca program kim tra .NET code bit trong code c nhng th g. Ta dng namespace System.Reflection vit code lm chuyn y. Vi System.Reflection ta c th vit code khm ph nhng classes nm trong mt assembly, bit mi class c nhng methods, properties v events no. Tip theo , ta c th dng reflection instantiate v dng nhng objects t cc classes y. C qu trnh ny hon ton linh ng - ging ht nh Late Binding. Tht ra, CLR (Common Language Runtime) dng reflection implement Late Binding dm cho chng ta. Thay v bt chng ta phi t dng reflection code Late Binding, .NET t t lo lng chuyn y mt cch t ng cho chng ta. Dng Function CType Du ta c dng Late Binding hay khng, nhiu khi rt tin ta pass reference n mt object no , t ch ny n ch khc, bng cch dng Data Type Object tng qut - khi no cn dng n th ta i n ra ng loi Object trong hon cnh. Ta thc hin vic convert data type bng cch dng Function CType, iu cho php ta ni trc Data Type Object s c converted ra object ca class no gi mt method theo cch Early Bound: Module LateBind Public Sub LmVic( ByVal obj As Object) CType(obj, TheClass).CngTcTi() End Sub End Module Trong th d trn d rng ta ang lm vic vi variable thuc type Object - trn nguyn tc th c v l Late Bound - nhng chng ta ang dng Function CType convert obj ra mt object thuc class TheClass. K thut ny c gi l casting ( khun). Nu ta xem TheClass nh mt ci khun, khi ta p obj vo khun y th ging nh khun cho obj c dng ca TheClass. Function CType rt hu dng khi ta lm vic vi nhng objects c implement nhiu interfaces, v ta c th dng cng mt object cho nhng interfaces khc nhau. Gi d nh ta c mt object thuc loi TheClass v n cng c implement mt interface tn MyInterface, ta c th dng interface y trong code sau y: Dim obj As TheClass obj = New TheClass CType(obj, MyInterface).DoSomething()

Theo cch trn ta c th gi methods theo cch Early Bound trong nhiu interfaces ca mt object m khng cn phi declare mt variable mi. Tha k t mt ngn ng khc VB.NET code c compile ra IL (Intermediate Language) managed code, tc l code s c CLR (Common Language Runtime) chy trong .NET Framework. Mi managed code, khng cn bit c compiled t ngn ng no u c th lm vic chung nhau, tc l ta c th to mt class trong ngn ng ny v dng n trong mt ngn ng khc, k c vic tha k .

68

Tht ra hu nh ta lun lun lm vic y khi vit VB.NET. l v phn ln .NET system library c vit bng C#, nhng ta dng hay tha k t n thng xuyn trong VB.NET. To mt VB.NET BaseClass Trong th d v tha k t mt ngn ng khc, trc ht ta th to mt Class Library Project trong VB.NET tn vblib v thm vo mt class n gin tn Parent ging nh sau: Public Class Parent Public Sub SayHello() MsgBox("Hello from Parent Class", MsgBoxStyle.Information, "Parent Class in VB.NET") End Sub End Class Ta s dng Parent lm BaseClass tha k thnh mt SubClass trong C#. To mt C# SubClass Dng File | Add Project thm mt C# Class Library project mi v t tn n l cslib. Reference vblib bng cch dng Menu command Project | Add Reference... v chn Tab Projects, click Browse tm vblib.dll trong vblib\bin subfolder. Lu l ta va mi reference vblib.dll, ci assembly ca Class Parent, ch ta khng ng n hay cn VB.NET source code ca Class Parent. Trong C#, ta s tha k Class Parent qua reference BaseClass trong vblib.dll assembly. By gi code C# nh sau: namespace cslib { using System.Windows.Forms; using vblib; public class cSharpclass : Parent { public cSharpclass() { MessageBox.Show("Instantiating cSharpclass object, inheriting VB.NET Parent class", "CSharp Class"); } } } Code C# bn trn c nhiu im tng ng vi VB.NET. Tuy nhin v C# n t ngn ng lp trnh C v C++ nn n c syntax hi khc mt cht: Mi statement trong C# phi chm dt bng du ; nh du cui hng Cp du ngoc cong queo { .. } c dng nh du u v cui ca mt Statement Block thay v dng End Sub. Keyword using c dng thay v keyword Imports trong VB.NET C# th case sensitive, tc l phn bit ch hoa, ch thng - th d obj th khc vi Obj. Constructor method mang cng tn vi class thay v tn New nh trong VB.NET. Ta hy th i qua cc dng code. Cu th nht nh ngha namespace cho source file. Trong C#, mi namespace phi c tuyn b r rng (explicitly declared) trong mi code module. namespace cslib K l hai cu tuyn b ta nhp khu System.Windows.Forms v vblib:

69

using System.Windows.Forms; using vblib; Cu k tuyn b cSharpclass tha k t class Parent, cch dng du : thay v keyword Inherits: public class cSharpclass : Parent Sau cng l Constructor dng chnh tn ca class: public cSharpclass() { MessageBox.Show("Instantiating cSharpclass object, inheriting VB.NET Parent class", "CSharp Class"); } cch dng MessageBox.Show ging ht nh trong VB.NET hin th mt message. To mt program Client Dng menu command File | Add Project thm mt VB.NET Windows Application project mi cho solution. Trong project mi ny ta dng menu command Project | Add Reference... thm references cho cslib v vblib. Right-click ln project trong Solution Explorer v chn n lm Set As Startup Project project ny chy khi ta bm F5. By gi t mt Button tn BtnStartDemo ln Form v vit code di y x l Event Click: Private Sub BtnStartDemo_Click( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnStartDemo.Click Dim objCS As New cslib.cSharpclass() objCS.SayHello() End Sub Khi ta chy program v click button StartDemo ta s thy mt dialog cho bit Constructor ca cSharpclass ang c gi instantiate object objCS:

Tip theo mt dialog th nh hin th message t Sub SayHello m objCS tha k t BaseClass Parent:

70

Bn c th Download source code ca program ny ti y. Tha k hnh nh (Visual Inheritance) Cho n by gi ta bn qua chc nng OO ca ngn ng VB.NET, phn ln nhm vo c tnh tha k. V cc hnh nh (Visual Components) trong VB.NET c implemented bng ngn ng lp trnh chnh quy ch khng phi dng mt cch thc khc bit nh trong VB6 (tin tc din t cc hnh nh nm phn u cc *.frm files), nn VB.NET cng h tr Tha k hnh nh (Visual Inheritance) cho Windows Forms mt cch t nhin. iu ny c ngha l sau khi lm xong mt Windows Form vi nhng Textboxes, Labels, Listboxes ..v.v.. ta c th tha k n ri v thm cc hnh nh khc. Ta s bn v chi tit v chuyn ny trong tng lai. Ta cng c th tha k t chnh cc hnh nh. Th d ta c th tha k t mt Textbox to ra mt class Textbox mi, c thm chc nng nhn keystrokes theo cch VNI v hin th ch Vit Unicode. Cng mt nguyn tc tha k ny ca Windows Forms Controls cng p dng cho Web Forms Controls, tc l ta c th SubClass mt Web Forms Control, cho thm cc chc nng mi v overriding mt s chc nng c sn

Bi 8 Nhng chc nng mi trong giao din ca s ca VB.NET (phn I)


Xin nhc li l .NET Framework cho ta ba cch user giao din vi chng trnh p dng, l Windows Forms (c khi c gi tt l WinForms), Web Forms v Console applications. Ln lt chng ta s hc qua c ba th ny. Ngoi ra, k t u thng hai 2002, thy V Nng Hin s vit mt lot bi ring v ASP.NET. ASP.NET l hu thn ca ASP (Active Server Pages), ci framework ta lp trnh trn Webserver. Microsoft dng ASP thay th cgi-Perl (Common Gateway Interface - Practical Extraction and Report Language), mt ngn ng lp trnh rt thnh hnh trn cc Unix-based Webserver. Sau ny chnh Microsoft mn ngi ta port Perl qua WindowsNT. Mt chng trnh ASP gm c nhiu trang ging nh trang Web (HTML) nhng bn trong c nhng mnh chng trnh vit bng VBScript hay JavaScript (tht ra script no cng c, k c PerlScript) nm nhiu ni. Cc mnh Script ny c th truy cp c s d liu sa i hay ly d kin ra hin th ti ch y (ni mnh Script nm trong trang ASP) to trang Web kt qu.

71

Trong ASP.NET, tt c cc mnh chng trnh Script y c ly ra ring, chung vi nhau v c vit li di dng ngn ng thun ty VB.NET hay C#. Phn coding c gi l code behind (code nm pha sau) v rt ging nh cc Event Handling Sub ta vit trong VB.NET cho Windows Forms. Trong tng lai, khi bn n Web Forms ta ch hc tng qut v ASP.NET v nht l ch dng VB.NET trong cc chng trnh n gin. S quan trng ca Windows Forms ? Windows Forms l cch hin th mn nh ti tn hn Win32 bnh thng. K thut nm pha sau Windows Forms trc y c pht trin cho Windows Foundation Classes (WFC), dng trong Visual J++. iu ny ct ngha s gi dn v vng chi ca mt sn phm hy cn tnh trng Beta. Khi ta nghe ni n .NET vi nhng ha hn v ng dng trn Internet nh Web Forms v Web Services, rt d cho ta tng rng Microsoft phi cung cp Windows Forms l cc chng cho n trn vn mn hng. Tht ra, Windows Forms l mt phn ca cc base classes ca .NET Framework. Ci Namespace dng cho n l System.Windows.Forms, mt Namespace cha rt nhiu th n i hu nh chng ta s khng cn phi dng trc tip cc Windows API v ho (Graphics v Drawings) nh trong VB6 na. Nhu cu c nhng p dng pha khch (client-based application) phong ph (rich), linh ng (flexible) v nhanh chng (responsive) s vn cn . Hin nay, trnh ph tn v ci t (deployment) cc chng trnh, ngi ta bt u c khuynh hng t cc chng trnh chy trn Webserver, ri cho user s dng chng qua WebBrowser. Ngoi cng chng th dng Internet, trong hng xng th dng Intranet (Intranet l Internet chy trn Local Area Network mng a phng, khng lin lc g vi bn ngoi), tuy nhin giao din trn Web khng phong ph hay nhanh nh trn desktop v d nhin cng tc lp trnh i hi mt thi gian pht trin lu hn. V .NET Framework cha y mi th vin cn thit cho chng trnh, nn mt khi ci t .NET Framework trn my khch ri ta ch cn XCopy n nhng folders cn thit c cha cc tp (files) chng trnh v d kin l . Thc hin vic ny trn mng a phng (Local Area Network) rt d v nhanh, thm ch ta c th t ng ha cng tc copy ny. Trong m hnh lp trnh nhiu tng (multi-tier programming model) m ta gi l Windows DNA (Distributed Network Application), qu trnh x l mt cng tc c chia ra lm nhiu giai on nh:

1. 2. 3.

Kim chng cc con s user mi in vo cc forms ti my khch (user interface) Tnh ton (business logic) Truy cp c s d liu (database access) V mi giai on ni trn c th nm trn mt computer khc nhau. Nu dng Internet th giai on 1 ni trn s chy trong WebBrowser bng trang Web c cha JavaScript routines kim chng cc con s user mi nh vo. Cn cc giai on kia c th chy trn WebServer. D nhin giai on 3 phi chy trn WebServer, ni cha c s d kin. .NET cho php ta lp trnh giai on 1 chy trong Windows Forms. Cn cc giai on kia c th y nguyn. Nh th, gi d nh ta c mt h thng t hng, ta c th cho cc telephone operators dng desktop (Winforms) application vi mt giao din c ti u ha, chy tht nhanh phc v nhng ngi t hng bng in thoi. Trong khi khch hng cng c th t hng qua Internet WebBrowser nh bnh thng. C hai nhm users ny d c giao din khc nhau nhng u xi chung cc tng business logic v database access. y l mt u im rt quan trng ca .NET m t ai ch . Nu thit k kho, ta c th lp trnh dng chung hu ht phn mm trn desktop, distributed (phn tn), Internet v Mobile (Mobile phone, Pocket-PC). Nhng im cn bn ca Windows Forms ?

72

Trong cc bi hc v th d trc y ta ni qua, by gi ta tm tc nhng im cn bn ca Windows Forms: Mt Windows Form tht s l mt class. Trong .NET khng c t c bit nh "form module" dng cho n. V mt form l mt class nn ta khng th load n m khng ni thng thng ra. Tc l trong VB6 nu ta Show hay dng n mt Form th n t ng c loaded. Chng nhng th thi, ci class Form2 c dng nh mt variable Form2 lun, tc l by default ta c mt Object tn Form2. Trong .NET ta phi khai bo (declare) mt variable tn myForm2 chng hn ri instantiate form y nh mt Object ca Form2 trc khi dng n. Tt c mi form u tha k t class System.Windows.Forms.Form. Ging nh tt c cc classes trong .NET Framework, Windows Forms c constructors v destructors. Constructor ca form tn l Sub New, i khi ging nh Sub Form_Load trong VB6. Destructor ca form tn l Sub Dispose, i khi ging nh Sub Form_Unload trong VB6. Ci visual forms designer ca VS.NET nht rt nhiu code instantiate form v t cc controls vo form. l code m ng l ta phi t vit nu ta dng notepad lp trnh. Phn code ny thay th ci phn nm u tp .frm ca VB6 din t cc visual components ca form. Mi ln ta thm bt cc controls hay thay th cc properties ca controls trn form th code generated cho form c thay i theo. Do bn nn trnh sa i code y, tr khi bit chc mnh ang lm g, hay l bn lm mt phin bn trc khi thay i nu l kt th restore code c. Event c x l bng cch linh ng hn. Cc events cha nhiu tin tc hn. Mt Event c th c x l bi nhiu controls cng mt lc v mi control c mt cch x l khc nhau. Ngc li, nhiu Events khc nhau c th c x l bng mt Event Handler duy nht. Bn to mt chng trnh Windows Forms bng cch dng IDE menu command File | New | Project.. hin th giao thoi New Project v chn Template Windows Application.

Trong th d ny, khi bn click nt OK th mt subfolder tn (Name:) WindowsApplication4 s c to ra trong folder (Location:) E:\NET\HongDevelopment\LessonPreparation cha cc tp ca Project. Sau ny, khi bn build, tc l compile chng trnh, th kt qu s l mt tp .exe cha trong folder E:\NET\HongDevelopment\LessonPreparation\WindowsApplication4\bin. D nhin trc khi click nt OK bn c th sa Name: hay Location: ty . Ngoi ra, v bn chn Windows Application, nn project ca bn t ng c reference n .NET component System.Windows.Forms.dll. xem lt qua namespace System.Windows.Forms, bn hy th xc tin to ci project

73

WindowApplication4 ny. K bn chy Object Browser bng cch click hnh tam gic nh ca Class View icon ri chn Object Browser:

Trong Object Browser, expand ci System.Windows.Forms tree xem nhng types c nh ngha bn trong v cc class members ca Form:

Kin trc (Architecture) ca Windows Forms ? Nu bn xem gia ph ca form, bn s thy t ph (i th nht) n l class Object, cn form l con chu i th by. Di y l ci cy ca gia ph form v mt t ch thch:

74

Th bc cc classes Object MarshalByRefObject Component

Ch thch ng t trong .NET, superclass cao nht t sanh ra con chu. Cung cp cc code cn thit qun l cuc i ca objects. Cung cp s gy dng cn bn ca IComponent interface v cho php cc chng trnh khc nhau dng chung mt object y l base class ca mi component dng hin th. N h tr nhng kh nng lin h n vc dng v cng tc hin th t Show, BringtoFront, Font, Color cho n Dock, Anchor. Ngoi ra n cn cung cp cc Events ca keyboard, mouse v c method WndProc cho ta truy cp cc thng ip ca Windows. Cung cp chc nng t ng cun khi c cha bn trong mt control cn thm ch hin th. Cho php mt component cha cc controls khc. Ca s chnh ca mt chng trnh.

Control

ScrollableControl ContainerControl Form Cc chc nng mi ca Windows Forms Nhng Controls tn hnh c cha ring

Mt thay i rt tt trong .NET t VB6 l nhng controls khng hin th lc chy th khi thit k chng c cha trong mt ci mm ring pha di. Th d nh trong hnh di y ta c Timer, Tooltip, Menus v cc Dialogs c cho nm trong mt component Tray.

Mun thay i properties ca Control no, ta ch cn chn n ri right click v chn Properties. Chn Startup Form ch nh StartUp Form ca chng trnh, bn cn phi m ca s Properties ca Project nh vo Startup Object. Bn c th lm iu y bng cch dng IDE menu command Project | Properties hay right click tn ca Project trong Solution Explorer ri chn Properties.

75

V tr ban u Nhiu lc ta mun form hin ra ngay gia mn nh khi chng trnh khi ng. VB.NET c th lm vic y t ng nu bn set property StartPosition ca n thnh CenterScreen. Cc v tr khi u bn c th set c lit k di y: Tr s V tr khi u Manual CenterScreen CenterParent WindowsDefaultLocation WindowsDefaultBounds Borders ca Form Thay i property FormBorderStyle s nh hng nhng g user c th thay i hay dng v MaximizeBox, MinimizeBox, SizeGripStyle (my ci gch cho gc di phi ca ca s) v HelpButton. Lun lun nm trn ht Mt s chng trnh c kh nng lun lun nm trn ht, ngay c khi n khng c focus. thc hin iu ny trong VB6 ta phi gi API. Trong VB.NET, forms c mt property mi tn l TopMost. Ch cn set TopMost ca mt form thnh True th n lun lun nm trn ht. Owned Forms (Forms c ch) Khi mt form c ch, n c minimized v closed theo form ch ca n. Owned forms, i khi cn c gi l forms n l, lun lun nm ln trn form ch ca n. Du vy, n khng cn tr form ch nhn focus. Kt qu Hin th form v tr theo gi tr ca property Location ca form Hin th form ngay gia mn nh Hin th form ngay gia form ch (owner) ca n Hin th form v tr default ca ca s Hin th form v tr default ca ca s, vi kch thc default ca ca s

76

Ta dng method AddOwnedForm ca form ch cho thm owned form vo collection of OwnedForms ca n nh sau: Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim myForm2 As New Form2() myForm2.Show() Me.AddOwnedForm(myForm2) End Sub Form ch c th truy cp collection ca cc forms n l qua property OwnedForms. Di y l code loop qua cc forms n l ca mt form: Private Sub BtnListOwnedForms_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnListOwnedForms.Click Dim OwnedForm As Form For Each OwnedForm In Me.OwnedForms Console.Write(OwnedForm.Text) Next End Sub Form ch c th ct b (remove) mt form n l bng cch dng method RemoveOwnedForm nh: Me.RemoveOwnedForm(myForm2) Khi mt form khng cn l n l na, n khng hn b unloaded, ch tr thnh mt form t do (khng cn lin h vi form ch na) thi. Ch s khc bit gia form n l v TopMost form l form n l ch nm trn form ch n, trong khi TopMost form nm trn tt c mi forms khc. TopMost form cng khng b minimized hay closed khi mt form no khc ca chng trnh b minimized hay closed. Khng phi mi controls u b kho (locked) Trong Vb6, ta c option Lock Controls trong Format menu. Khi ta chn Option ny cho mt form, tt c controls u b kha, ngay c nhng controls mi c vo mt form sau ny. Trong VB.NET, ta cng c option Lock Control trong Format menu hay khi ta right click mt nhm controls c chn trn form. Nhng thao tc kha ny ch hiu lc i vi cc controls c sn trn form m thi. Mt control mi c t ln form sau s khng b kha. iu ny cho php ta kha nhng controls c ng v tr, ri tip tc sp t cc controls mi m khng ngi v tnh lm di chuyn v tr cc controls c. m (Opacity) ca Form C mt property mi ca form rt th v dng, d rng s ch li hay mc ch ca p dng khng r rng. l ta c th thay i m ca mt form. Ta c th lm cho n trong sut khi set property Opacity ca form bng 0, hay cho n m m nh ma nu tr s ca Opacity t hn 1. Bn hy th nh code di y vo mt form cho Button1 chng hn, ri chy chng trnh v click Button1 y: Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Double For i = 0 To 1 Step 0.01 ' Opacity c tr s t 0 (trong sut) n 1 (m t) Me.Opacity = i Next End Sub

77

Form properties cho Cancel Button v Default Button Trong VB6, ta c th set mt button n nh c clicked khi tht ra user bm phm Esc. Ta thc hin iu ny bng cch set property Cancel ca button y thnh True. N c gi l Cancel button. Tng t nh th, nu ta set property Default ca mt button thnh True, n c gi l Default button, khi user bm phm Enter Default button coi nh c clicked. Trong VB.NET ta cng c th dng cc chc nng y, nhng by gi ta khng ng g n property no ca cc buttons, m li set cc properties CancelButton v AcceptButton ca chnh form. Khi ta click bn phi ca property AcceptButton trong ca s Properties th danh sch cc buttons c sn trn form c lit k ra ta chn nh di y:

Ngoi ra ta cng c th chn cc CancelButton v AcceptButton lc ang chy chng trnh, nht l khi ta mun b nhim cc cng tc ny cho nhng buttons khc v form ang lm vic trong mt trng thi khc nh trong code th d di y: Me.CancelButton = BtnCancel2 Me.AcceptButton = BtnAccept2

Bi 9 Nhng chc nng mi trong giao din ca s ca VB.NET (phn II)


S khc bit trong cc Hp Giao Thoi (Dialog Boxes)

78

Trong VB6, cc hp giao thoi tht ra l nhng form bnh thng nhng c hin th vi parameter vbModal, tc l trong Modal mode. iu ny khn cho hp giao thoi tr nn form tch cc (active form) duy nht trong chng trnh cho n khi n i khut. Mt hp giao thoi cn mt phng tin lin lc vi form gi n (calling form). Trong VB6, ta gii quyt vn ny bng cch ch ra mt property tm gi l Action. Ta dng Read-only property Action nh sau trong mt hp giao thoi c hai buttons, OK v Cancel: ' VB6 code used for Dialog Boxes Public Enum dialogAction actionOK = 1 actionCancel = 2 End Enum Dim mAction As dialogAction Public Property Get Action() As dialogAction Action = mAction End Property Private Sub cmdOK_Click() ' Get here when user click the OK button mAction = actionOK ' Hide the Dialog Box to return control to calling form Me.Hide End Sub Private Sub cmdCancel_Click() ' Get here when user click the Cancel button mAction = actionCancel ' Hide the Dialog Box to return control to calling form Me.Hide End Sub Ch ta dng Enumerated type dialogAction. N c hai tr s: actionOK v actionCancel. Property Action thuc loi enumerated type ny. Khi user click mt button, ta set tr s cho local variable mAction ri Hide ci dialog box. Ci Giao thoi phi c du i (hidden) nhng khng unloaded, v ci calling form cn phi truy cp dialog box c tr s ca property Action bit user va mi click button no. Gi d ta t tn cho hp giao thoi l frmDialog. gi mt hp giao thoi t mt form khc trong VB6 ta c th code nh sau: Dim Dialog As frmDialog Set Dialog = New frmDialog ' Instantiate a Dialog Box ' Show dialog box in Modal mode Dialog.Show vbModal Nhng bao nhiu ch l hin th hp giao thoi thi. Sau khi hp giao thoi Hide ri ta cn phi truy cp n c tr s ca property Action. Do ta cn phi vit thm codes cho y sau y: Dim Dialog As frmDialog Set Dialog = New frmDialog ' Instantiate a Dialog Box ' Show dialog box in Modal mode Dialog.Show vbModal ' Get here after the dialog box has hidden, but still loaded ' Now process the Action Select Case Dialog.Action Case actionOK ' code goes here for normal processing Case actionCancel ' code goes here for user canceling

79

End Select Unload Dialog ' Now we can unload the dialog box C hai s thay i quan trng trong VB.NET, l dng ShowDialog v DialogResult. ShowDialog thay v Show vbModal Argument vbModal khng c h tr trong VB.NET. Thay vo , mt form c th dng method ShowDialog. Di y l s so snh ca coding trong VB6 v VB.NET. VB6 code: Dim Dialog As frmDialog Set Dialog = New frmDialog ' Instantiate a Dialog Box ' Show dialog box in Modal mode Dialog.Show vbModal VB.NET code: Dim Dialog As New frmDialog() ' Show dialog box in Modal mode Dialog.ShowDialog l trong VB.NET hng code u ta c th kt hp hai chuyn khai bo v instantiate form mi trong mt statement. Hng code cui cho thy s thay i t Show vbModal qua ShowDialog. DialogResult Trong VB.NET, khi mt form khi th bng method ShowDialog, n d b sn mt property tn l DialogResult calling form c th truy cp. DialogResult c th mang mt trong nhng tr s enumerated sau y: DialogResult.Abort DialogResult.Cancel DialogResult.Ignore DialogResult.No DialogResult.None DialogResult.OK DialogResult.Retry DialogResult.Yes C im rt tin l khi DialogResult c set cho mt tr s th dialog c du i (hidden) mt cch t ng. Cch n gin nht set tr s cho DialogResult l assign mt tr s cho property DialogResult ca mt button. Khi user click button y th DialogResult ca hp giao thoi ly tr s ca property DialogResult ca button v hp giao thoi Hide.

80

biu din ShowDialog trong VB.NET, km theo y l m ngun ca mt th d. Trong th d ny ta to mt form tn frmDialog c hai button tn OK v Cancel. Ta set property DialogResult ca button OK thnh OK v property DialogResult ca button Cancel thnh Cancel. Form frmDialog hon ton khng c mt hng code no c. Form chnh ca chng trnh, Form1, ch c mt button tn BtnShowDialog vi code cho Event Click nh di y: Private Sub BtnShowDialog_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnShowDialog.Click ' Declare and instantiate a Dialog Box Dim Dialog As New frmDialog() ' Show the Dialog Box in Modal mode Dialog.ShowDialog() ' get here after user has clicked a button and the Dialog box has hidden ' Process the DialogResult Select Case Dialog.DialogResult Case DialogResult.OK MsgBox("User clicked OK, se please go ahead") Case DialogResult.Cancel MsgBox("Sorry, but User clicked Cancel") End Select Dialog = Nothing ' Dispose the Dialog Box End Sub Bn c th chy chng trnh ri click button ShowDialog. Khi Dialog box hin th, th click mt trong hai buttons trn y. So snh vi VB6, ta thy dng Dialog Box trong VB.NET n gin v t nhin hn. Nu khng dng Property DialogResult ca mt button trong Dialog Box tr v kt qu DialogResult, ta cng c th dng code trong Dialog form nh sau: Me.DialogResult = DialogResult.Retry Hng code trn set DialogResult ca Dialog form thnh DialogResult.Retry v km theo phn ng ph l Hide Dialog Box. Calling form s truy cp c kt qu DialogResult.Retry ny. S khc bit v sp t v tr cho Forms v Controls

81

VB.NET c nhng chc nng v positioning v layout tng t nh trong VB6, nhng cch thc thi hi khc. Property Location Thay vo cc properties Left v Top trong VB6, forms v controls trong VB.NET c property Location. Property Location nhn v tr v mt structure tn Point, c ta X v Y tng ng vi Left v Top m ta dng trc y. Structure point c dng trong nhiu p dng v ha trong GDI+ (Graphic Devices Interface plus) ca .NET. Tht ra, trong code ta vn cn dng Top v Left c nh xa. Nhng Top v Left khng hin ra trong ca s Properties ca forms hay controls. ch nh mt v tr mi cho form, ta c th code nh sau: Me.Location = (New Point(200, 100)) Property Size Property Size trong VB.NET c cng mt nim nh property Location, c iu n tng xng vi Width v Height. Property Size nhn v tr v mt structure tn Size, c chiu cao v chiu rng p dng cng mt lc thay v tun t tng chiu. Ging nh Left v Top, trong code ta vn cn dng Width v Height c nh xa. Nhng Width v Height khng hin ra trong ca s Properties ca forms hay controls. thay i Size ca mt form, ta c th code nh sau: Me.Size = (New Size(300, 400)) ReSize nhiu controls VS.NET cho ta mt chc nng mi l Resize nhiu controls cng mt lc. Trc ht bn Select nhiu controls bng cch drag mt dy thun (rubber band) bao quanh chng hay n nt Ctrl trong lc click cc controls. K , tp trung vic resize vo mt control, cc controls kia cng c resized theo. Cc features thit k chung cho cc Controls Tab Order ca cc Controls Sp t th t trong Tab ca cc controls (Tab Order) trn mt form i khi rt phin phc trong VB6. VS.NET cho ta mt feature rt tin dng lm vic ny. khi ng feature y, ta dng IDE menu command View | Tab Order. N s hin th mt con s nh gc trn tri ca mi control, cho thy tr s Tab Index ca mi control. By gi ta ch cn click ln tng control mt theo th t m ta mun. Di y l screenshot ca mt form sau khi user ch nh Tab Order cho cc controls. Mun ra khi Tab Order mode, ta bm menu command View | Tab Order mt ln na.

82

Ghi ch:Trong VB.NET nhiu controls c th c cng mt Tab Index. Trong trng hp y, th t v Tab ca chng c quyt nh da vo z-order. Control c z-order cao nht s nhn focus trc nht trong nhm. Z-order ca mt control c th c thay i bng cch right click control ri chn Bring to Front. Control Arrays Khi nghe ni VB.NET khng h tr Control Arrays chc bn bun nm pht. C hai l do ti sao bn cn Control Arrays:

1. 2.

Dng cng mt Event handler (th d nh Sub BtnBrowse_Click) x l Event t nhiu Controls tng t. dynamically to thm Controls trong form lc ang chy program (at runtime). May thay, VB.NET cung cp cho ta mt phng tin khc khi phi thua thit. VB.NET cho php ta linh ng b nhim cc methods x l Events ca cc controls. im th nht bn s ch l bn khng th dng cng mt tn cho nhiu controls na. Property Index b khai t. Trong VB.NET bn c th dng mt Event handler duy nht x l Events n t cc controls tng t. Trc y ta da vo Index bit Event pht xut t control no. By gi bn da vo parameter Sender. minh ha im ny, ta s vit mt chng trnh c hai buttons, Button1 v Button2, nm trn form chnh. Double click Button1 vit code x l Event Button1.Click. Mun dng cng mt Event Sub ny x l lun Event Click n t Button2, bn ch cn thm ch Button2.Click vo cui ci Handles List ca Sub Button1_Click. cho c v tng qut ta rename Sub Button1_Click thnh Sub Button_Click. By gi ta vit vi dng code n gin hin th cho bit Event Click n t Button no: ' Note that we change the name of the Sub from Button1_Click to Button_Click to ' make it more general, since we're going to use this same Sub to handle Click ' Events originated from many different Buttons ' Also note that we add the word Button2.Click to the end of Sub Button_Click declaration Private Sub Button_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click, Button2.Click Dim btnClicked As Button ' Type cast sender to Button btnClicked = CType(sender, Button) ' Show what button was clicked MessageBox.Show("You clicked """ & btnClicked.Text & """") End Sub Th chy chng trnh v click Button2, bn s thy hnh di y:

83

biu din chc nng qun l Event Handling at runtime, ta s t mt button tn BtnAddNewButton vo form n dynamically add mt button th ba tn Button3. Ta mun button ny cng s dng Sub Button_Click x l Event Click ca n. V khng th nh thm ch Button3.Click vo cui cu Sub Button_Click nh trc y ta lm vi Button2.Click, nn at runtime ta s dng statement: ' Tell system to use Button_Click as Event Handler for the Event Button3.Click AddHandler newButton.Click, AddressOf Me.Button_Click M ngun y ca Sub BtnAddNewButton_Click c lit k di y: Private Sub BtnAddNewButton_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAddNewButton.Click ' Declare and instantiate a Button Dim newButton As New Button() ' Set it up on the form With newButton .Text = "Button3" ' Text of this new button .Location = New Point(230, 120) ' define its location on the form .Size = New Size(88, 40) ' define its size End With ' Add the new button to the form's collection of controls Me.Controls.Add(newButton) ' Tell system to use Button_Click as Event Handler for the Event Button3.Click AddHandler newButton.Click, AddressOf Me.Button_Click End Sub Khi user click BtnAddNewButton, Button3 vi Size(88,40) s c to ra v t Location(230,120) trn form. K n chng trnh thc hin hai chuyn quan trng: Add button mi ny vo collection of controls ca form v ng k (register) vic dng Sub Button_Click lm Event Handler ca Event Click ca n. Lm xong my chuyn ny ri, bn chy chng trnh, click AddNewButton thm Button3 vo form, k click Button3, bn s thy hnh di y: Bn c th ti v chng trnh ControlArrays ny ti y.

Bi 10 Nhng chc nng mi trong giao din ca s ca VB.NET (phn III)


84

T ng Resize v nh ch (positioning) Nhng chng trnh ng dng chuyn nghip ta mua ngoi ch dng thng thng c c tnh resize cc controls hay nh v tr ca cc controls trn form mt cch t ng. Nu bao gi bn th thm cc chc nng y cho mt chng trnh p dng vit bng VB6 ca mnh, bn s thng cm rng coi vy ch khng phi l chuyn nh. Tng tng l ta phi ghi nh v tr v kch thc ca mi control trn form mi ln user resizes form th ta phi theo resize v nh v tr ca control. Trong lc thit k ta phi cho user mt phng tin ch nh rng h mun mt control c x nh th no khi form resize. cha tin tc y hoc ta dng property Tag ca control hoc ta dng registry. Ch vic c ra, vit vo cp nht ho cc tin tc cng mt, cha ni n chuyn tnh ton resize v nh v tr ca control. Do , nhiu khi lm bing ta dng i mt third party ActiveX gip ta lm cc chuyn y. .NET cho ta thm cc properties Anchor v Dock cho mi control. Ngoi ra .NET cn cung cp control Splitter cho php ta nm mt thanh phn hai ko qua, ko li hay ko ln, ko xung ty thch, m rng thm mt bn trong khi bn kia b thu hp. Ci p dng ca Splitter thng dng nht l trong Windows Explorer. Trong ta c hai phn: bn tri l mt Treeview cha ci cy ca disk drives v file folders, bn phi l mt Listview cha icons hay chi tit ca cc folder v files. Mun xem Treeview nhiu hn, ta nm thanh phn hai gia ko qua bn phi mt cht.

Anchoring (b neo) Khi con tu b neo l n . D con nc chy th no, con tu vn nm yn mt ch v n c ct vo ci neo. Control trong .NET c property Anchor ta ch nh n c buc vo gc no ca form: Left, Right, Bottom hay Top. Trong lc thit k, sau khi select ci control (th d Button1), ta vo ca s Properties v click hnh tam gic nh bn phi property Anchor. Mt hnh vung vi bn thanh rp li ging hnh ch thp mu trng s hin ra. Mi thanh tng trng cho mt gc m ta c th ch nh ct control vo form. Khi ta click mt thanh, n s i mu thnh xm m, v mt ch tng ng vi thanh y sau ny s hin th trong textbox area ca combobox Anchor. Th d ta click vo thanh di v hai thanh hai bn, ta s c Bottom, Left, Right nh trong hnh di y:

85

Khi Button1 c Anchor l Bottom, Right th mi khi gc phi di ca form di chuyn v resize, Button1 c chy theo gc y:

Nu Button1 c Anchor l Left, Right, Bottom th khi form resizes cho ln ra, Button1 c gi khong cch t n n ba cnh Left, Right, Bottom ca form khng i. Do n phi n rng ra nh trong hnh di y:

Nu Button1 c Anchor l Top,Bottom,Left, Right th khi form resizes, Button1 c gi khong cch t n n bn cnh Left, Right, Top, Bottom ca form khng i. Do n phi n rng hay thu nh c chiu cao ln chiu rng nh trong hnh di y:

86

V property Anchor c hiu lc lp tc ngay trong lc ta thit k, nn nu bn resize form trong lc thit k, cc control c Anchor property set cng resize v di chuyn theo. C th bn khng mun chuyn xy ra, nn tt nht l set property Anchor ca cc control sau khi thit k form xong ht ri. Docking (gn vo) Khi ta Dock mt control vo mt cnh ca form c ngha l ta dn dnh n vo cnh . p dng ta thng thy nht ca Docking l ToolBar v StatusBar. ToolBar th dock vo pha trn ca form, cm StatusBar th dock vo pha di ca mt form. Chng dn ra chim t tri qua phi ca form, user khng th ch nh chiu rng ca chng. Khi form c resized th ToolBar v StatusBar cng dn ra hay co vo theo chiu rng ca form. Property Dock ca control trong .NET cng ging ging nh property Align ca control trong VB6 StatusBar. Ta ch c th dn mt control vo mt trong bn cnh ca form, ch khng c chuyn bt c hai, ba tay nh trng hp Anchor c th neo vo Left, Right, Bottom cng mt lc. Tuy nhin, property Dock c tr s Fill ni control chim ht bn trong phn cn li ca container ca n. Trong lc thit k, sau khi select ci control (th d Label1), ta vo ca s Properties v click hnh tam gic nh bn phi property Dock. Mt hnh vung nhiu thanh mu xm s hin ra. Mi thanh tng trng cho mt cnh m ta c th ch nh dn control vo form (Top, Bottom, Left hay Right), ci hnh vung gia tng trng cho tr s Fill, v thanh di cht c ch None cho php ta xa khng chn tr s Dock no c.. Khi ta click mt thanh, tr s Docking tng ng s hin th trong textbox area ca combobox Dock.

87

Gi s ta set Property TextAlign ca Label l MiddleCenter bng cch chn ci thanh xm nm ngay gia trong s 9 thanh tng trng cho cc v tr ca Text c th nm trong Label1 nh trong hnh di y:

Khi chy chng trnh v resize form cho ln ra, ta s thy Label1 dn ra hai bn, nhng khng h tng b cao, v Text ca Label1 lun lun nm gia.

88

Nu bn tm cch dock nhiu controls vo cng mt cnh ca form th VB.NET phi quyt nh control no nm st cnh y nht. Qui c v th t l ngc li vi th t trong z-order. Tc l trong z-order, control no nm di nht th li c dock trc nht vo cnh ca form. Do , nu bn dock hai controls vo mt cnh, v mun ci control nm xa cnh c dock trc nht (tc l st cnh nht) th right click control y v chn Send To Back. Nu bn mun cha mt khong trng gia control v cnh ca container th set Property DockPadding ca container. T trc n gi ta dng form i din container cha controls. Tht ra container cng c th l mt Panel. Bn c th set Property DockPadding ca cc cnh ca container khc nhau bng cch click du + bn tri ch DockPadding trong ca s Properties m ra cc chi tit nh trong hnh di y:

Bn c th set tt c Property DockPadding cng mt tr s bng cch dng All setting. Control Splitter By gi bn hiu r cc c tnh, s khc bit v cch dng hai properties Anchor v Dock ca control, sau y ta s p dng kin thc y vo vic thit k dng Splitter trong mt form. Nu cn mi vi Splitter bn s d b bc mnh khi dng n. Do , bn hy th lm theo cc bc sau y:

1. 2. 3.

To mt Application mi, t mt Panel ln pha tri ca form chnh n chm bn tri ca form bng cch set property Dock ca n thnh Left. Ta gi Panel y l Panel1. t mt Splitter ln form (nh trnh t n ln Panel1 v Panel cng l mt loi container nn c th cha Splitter c). Splitter s t ng dock Left vo form tc l nm bn phi Panel1. Chn property BoderStyle ca Splitter1 lm FixedSingle cho d thy. t mt button ln Panel1 v set property Anchor ca n thnh Top, Left, Right. By gi form s ging nh di y:

89

4. 5.

K , t mt Panel ln bn phi ca form, gi l Panel2, v set property Dock n thnh Fill. C ngha l ta mun Panel2 chim ht phn cn li bn phi ca form. Thm vo trong Panel2 ny mt Button, gi l Button2, v set property Anchor ca n thnh Top, Left, Right. Khi chy chng trnh, mi ln bn nm Splitter ko qua phi th Button1 dn ra v Button2 co li:

Ngc li, nu bn nm Splitter ko qua tri th Button1 co ra v Button2 dn li:

90

Trong th d ny ta yn chiu rng ca Splitter, nhng bnh thng ta lm cho n hp hn. Nu Splitter hp th kh thy, do bn c th cho n mt mu rc trong lc thit k d thy. Khi thit k xong ht ri, bn i n li thnh mt mu du hn. Nu by gi bn mun chia Panel2 thnh hai phn, ngn cch bi mt Horizontal Splitter th sao? Ta c xem Panel2 nh mt form vy, tc l c hai u l containers, loi control c th ng nhiu controls, v lp li cc bc sau:

1. 2. 3. 4.

t mt Panel ln pha trn ca Panel2, gi n l Panel3 v set property Dock ca n thnh Top. t mt Splitter ln Panel2 (nh trnh t n ln Panel3), gi n l Splitter2 v set property Dock ca n cng thnh Top. Resize Splitter2 cho n dp li v i property Backcolor thnh ra ControlDark cho d thy. t mt Panel ln pha di ca Panel2, gi n l Panel4 v di Button2 t Panel2 qua Panel4 bng cch Cut and Paste. Set property Dock ca Panel4 thnh Fill. By gi hy chy chng trnh v nm ko Splitter2 ln xung.

Tm li, mun dng control Splitter trong mt form hay panel ta t mt PanelX vi Docking Left hay Top ln trc, k t mt Splitter vi cng loi Docking vi PanelX, ri t PanelY vi Docking Fill.

91

Bn c th ti v chng trnh Splitter ny ti y.

Bi 11 Nhng chc nng mi trong giao din ca s ca VB.NET (phn IV)


Cc control Providers Trong Windows Forms c mt gia nh controls mi m ta ch c th dng khi chng i chung vi cc controls khc trn cng mt form. Chng c gi l Provider Controls v c c tnh l khin cho cc property mi hin ra trong cc controls khc. Provider Controls khng hin th trn form lc chy program. Do chng nm ring trong Component Tray lc ta thit k. Hin gi c 3 Provider Controls : HelpProvider, ToolTip v ErrorProvider. C ba u lm vic mt cch tng t nhau. Controls HelpProvider v ToolTip Trong VB6, cc controls c property HelpContextID ta ch nh khi user bm nt F1 th chng trnh s hin th Help ng trang c tr s HelpContextID trong Help file. Cn ToolTip l mt Textstring property ca mi control. Ta ch cn dng ca s Properties cho vo ToolTip text ca mt control l trong lc chy chng trnh, khi no ta mouse cursor nm ln control l chng trnh s hin th ToolTip text. Hai th y khng cn dng trong Windows Forms na. Thay vo , ta phi t cc Provider Controls ln form thc hin cc cng tc tng ng. Control HelpProvider cho php cc controls khc ch nh context sensitive help (tr gip trong tnh hung ng thi) hin th khi user bm nt F1. Khi mt control HelpProvider (gi l HelProvider1 by default) c thm vo mt form, th mi controls trn form u s c thm cc properties di y, chng s hin th trong ca s Properties sau khi ta chn mt control.

Property HelpString on HelpProvider1 HelpTopic on HelpProvider1 ShowHelp on HelpProvider1 Khi control control

p d ng c focus, user b m nt F1 s popup Tooltip HelpString cho

Cung c p m t Topic cho control dng trong Help file cho context-sensitive help. Control HelpProvider1 c m t property ta ch nh dng Help file no Xc nh l control HelpProvider c Active cho control n y khng

Mt khi property HelpString c cho mt Textstring th trong lc control nhn c focus, nu user bm nt F1 mt Tooltip s hin th Textstring y. HelpProvider c mt property dn n mt Help file, hoc l HTMLHelp file, hoc l Win32Help file, v tr s trong property HelpTopic s ch dn n topic y trong Help file.

Trong lc chng trnh chy, ta cng c th thay i tr s HelpString ca Textbox1 nh sau:

92

HelpProvider1.SetHelpString(Textbox1, "Mt HelpString mi c dng ti y.") Control ToolTip cng hot ng tng t, nhng n gin hn. N ch cho thm mt property mi tn ToolTip on ToolTip1 vo mi control, gi d tn ca ToopTip provider l ToolTip1. Property ny lm vic y ht nh ToolTipText trong VB6. Trong lc chng trnh chy, ta cng c th set cho property Tooltip ca Textbox txtName mt tr s Textstring nh sau: ToolTip1.SetToolTip(txtName, "Xin vui lng nh tn bn vo y") Control ErrorProvider Thng thng sau khi user in xong cc d kin vo mt form th s click mt button OK hay Submit chng hn. trnh trng hp cp nht data ca mt record vi nhng d kin bt hp l, ta thng kim tra li d kin nm trong tng Textbox trn form v hin th mt thng ip nhc nh v gii thch cho user khi c error. Nu user lm li nhiu Textboxes th c th s c nhiu thng ip hin th ln lt ci ny tip theo ci kia, mi thng ip lin h n mt Textbox c error. Cch y cng tm c, nhng c th khin cho user bc mnh. Control ErrorProvider cung cp mt cch n gin v thn thin cho user bit Textbox no c d kin bt hp l. Control ErrorProvider cho cc controls trn cng form mt property mi gi l Error on ErrorProvider1 ( gi d l control ErrorProvider mang tn ErrorProvider1). Trong lc chng trnh chy, nu kim thy mt Textbox c li ta assign mt TextString vo property Error on ErrorProvider1 ca Textbox y. Lc by gi mt icon hnh du chm than trng s hin th bn phi Textbox c Error. Nu user mouse cursor ln trn icon y th chng trnh s hin th mt Tooltip vi tr s TextString ca property Error on ErrorProvider1 ging nh trong hnh di y:

Cng vic assign mt TextString vo property Error on ErrorProvider1 ca mt Textbox c th c coded nh sau: Private Sub BtnOK_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOK.Click ' Set error if TextBox txtName is blank If txtName.Text = "" Then ' Assign error ToolTip message to Textbox txtName ErrorProvider1.SetError(txtName, "You must supply a name!") End If End Sub Trn y ta dng Event Click ca button BtnOK kim tra d kin trong mi Textbox. C mt Event ca cc controls m ta cng c th dng trong cng tc kim tra d kin ca mt TextBox. l Event Validating. gy ra Event Validating ta cn phi dng property CauseValidation ca cc controls. Thng thng, property CauseValidation ca cc controls c set thnh True. TextBox txtName ch to ra Event Validating khi chnh property CauseValidation ca n l True v khi focus c di chuyn n mt control khc c property CauseValidation l True.

93

Xin lu l khng nht thit Event Validating c to ra khi txtName mt focus. Khi txtName mt focus th Textbox txtAge c focus (gi d txtAge c tr s TabOrder ngay sau txtName) , nhng nu property CauseValidation ca txtAge khng phi l True th phi i n khi focus p ln mt control c property CauseValidation l True txtName mi gy ra Event Validating. Ta c th code cho Sub txtName_Validating nh sau: Private Sub txtName_Validating( ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) _ Handles txtName.Validating ' Set error if TextBox txtName is blank If txtName.Text = "" Then ' Assign error ToolTip message to Textbox txtName ErrorProvider1.SetError(txtName, "You must supply a name!") Else ' Clear the error ToolTip message for Textbox txtName and make error Icon invisible ErrorProvider1.SetError(txtName, "") End If End Sub Ci icon hnh du chm than trng l default icon ca ErrorProvider. Mun dng mt icon khc ta ch cn assign icon y vo property Icon ca ErrorProvider. Menus Mc du Menu Editor ca VB6 cung cp y cc phng tin lm Menu v tng i d dng, VB.NET cho ta mt giao din cng thn thin v t nhin hn thit k Menu. Menu c thm vo form di dng mt control. Tuy Menu control nm trong mt mm components pha di, nhng trong lc thit k, Menu hin ra trong form y nh lc Runtime v bn ch cn in vo cc menuitems cn thit. C hai loi menus: Main Menu (Menu dng thng thng) v Context Menu (dng cho Pop-Up). Bn c th ti v chng trnh ErrorProvider ny ti y. Menus Main Menu l Menu cn bn m bn thy n dnh vo cnh trn ca mt form. d gii thch, ta s dng mt th d to ra mt Editor tht n gin bng VB.NET. Bn hy khi ng mt Windows Application mi v thm mt Textbox vo trong form chnh. Set property MultiLine ca Textbox thnh True n c th hin th nhiu hng, ng thi Stretch (ko dn ra) ci Textbox cho ln ra lm ni ta c th nh vo mt bi text. K , thm mt Main Menu vo form. Ci menu Designer s kch ng v bn ch cn nh vo chi tit cc menuItems v dng ca s Properties set cc parameters. Khi no bn select control Main Menu trong mm components l bn c th edit cc MenuItems. Mun lm vic vi MenuItem no th select MenuItem . Nhng ch c ch Type Here l ngh cho bn nh thm vo mt MenuItem (Type Here nm pha di) , mt MenuCommand mi (Type Here nm bn phi mt MenuCommand) hay mt MenuSubItem (Type Here nm bn phi mt MenuItem).

94

Mun insert mt ln ngang gia MenuItem Paste v MenuItem Clear All, bn select MenuItem Clear All ri right click v chn Insert Separator trong Pop-Up Menu.

Mun ch nh Shortcut cho mt MenuItem, bn select MenuItem y ri vo ca s Properties chn tr s cho property Shortcut. Tng t nh vy cho property Checked lm mt checkmark hin ra bn tri (pha trc) Text ca MenuItem.

95

Thm vo cc dng code sau y cho chng trnh. Khi doubleClick ln MenuItem copyMenuItem ca s m ngun s m ra cho bn nh code cho Private Sub copyMenuItem_Click: Private Sub copyMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles copyMenuItem.Click ' Copy the selected text to the Clipboard Textbox1.Copy() End Sub Private Sub pasteMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pasteMenuItem.Click 'Paste the Clipboard text into Textbox1 Textbox1.Paste() End Sub Private Sub clearAllMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles clearAllMenuItem.Click ' Clear everything in Textbox1 Textbox1.Text = "" End Sub Private Sub closeMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles closeMenuItem.Click ' Close the form Me.Close() End Sub Khi chy chng trnh, hnh di y s hin th:

96

Context Menus Ta dng Context Menu Pop-Up mt Menu xng hp vi tnh hung ng thi ca program khi user right click mt control trn form. Trong VB6, Context Menu cng l mt MenuCommand thng thng nhng ta thit k cho n invisible, ch khi no ta mun PopUp n th n mi hin th. Trong VB.NET, Context Menu l mt control ring, nhng ta edit n cng ging nh Main Menu. Khi thm mt control ContextMenu vo form ri, mi ln ta select n trong mm components th Context Menu hin ra cnh trn ca form ging nh Main Menu. Lc Runtime, khi user right click mt control c Context Menu th ContextMenu s hin th v tr . Bn hy doubleClick control ContextMenu trong hp ngh thm mt Context Menu vo trong form. K set up cc MenuItem nh sau:

hin th ci Radio button bn tri mt MenuItem, bn phi lm hai chuyn:

1.

Set property Checked ca MenuItem thnh True hin th mt checkmark hay mt hnh trn nh (Radio button).

97

2.

Set property RadioCheck ca MenuItem thnh True khi no n hin th th c dng Radio button, thay v mt checkmark. Nh l ta dng checkmark khi mun cho user chn nhiu th cng mt lc, v dng Radio button khi mun cho user ch chn mt nhim m thi, tc l mutually exclusive. Tuy nhin, khc vi khi edit mt nhm Radio buttons trong mt container trn form, VB.NET khng cn tr ta cho hai Radio buttons trong mt menu cng hin ra. Do , bn phi t qun l vn mutually exclusive trong code ca mnh. ch nh ContextMenu1 Pop-up khi user right click Textbox1, bn ch cn set property ContextMenu ca Textbox1 thnh ContextMenu1 (chn n trong ci dropdown list ca comboxbox ca property ContextMenu trong ca s Properties). Khi bn chy chng trnh v right click Textbox1, ContextMenu1 s hin th nh di y:

M ngun nm pha sau cc click events ca hai MenuItems ca ContextMenu1 c lit k di y: Private Sub blackOnWhiteMenuItem_Click( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles blackOnWhiteMenuItem.Click ' Change colors of Textbox1 Textbox1.ForeColor = Color.Black Textbox1.BackColor = Color.White 'Toggle the radio check blackOnWhiteMenuItem.Checked = True WhiteOnBlueMenuItem.Checked = False End Sub Private Sub WhiteOnBlueMenuItem_Click( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles WhiteOnBlueMenuItem.Click ' Change colors of Textbox1 Textbox1.ForeColor = Color.White Textbox1.BackColor = Color.Blue 'Toggle the radio check blackOnWhiteMenuItem.Checked = False WhiteOnBlueMenuItem.Checked = True End Sub property Checked ca hai MenuItems c coded h ci ny True th ci kia phi False, tc l mutually exclusive. V MenuItem no c tr s Checked l True th Radio button hin th pha trc n. Sa i Menus lc Runtime

98

Ta c th sa i Menu lc Runtime, chng hn nh Context Menu thng c nhng dng khc nhau ty theo trng thi ca mt control hay form. Mt th d khc l hin th danh sch cc files m chng trnh truy cp trong qu kh. Thng thng ta cha tn cc files y trong Registry v khi cn s c v load vo Menu. Di y l code ch cch cho thm mt MenuItem vo trong mt ContextMenu, v cch clear (xa) mi MenuItems. Ta bit rng ContextMenu c mt property l collection ca nhng MenuItems. Do mun thm mt MenuItem th cn tri qua ba bc:

1. 2. 3.

Instantiate mt MenuItem. ng k Event Handler ( y l AddressOf Sub NewMenuItem_Click), m chng trnh s dng x l Event Click ca MenuItem y. Thn MenuItem y vo collection MenuItems ca control ContextMenu. Thm vo form hai buttons t tn l BtnAddMenuItem v BtnClearContextMenu. Private Sub BtnAddMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnAddMenuItem.Click 'Add a menu item at the top of ContextMenu1 Dim AnewMenuItem As MenuItem ' Declare a MenuItem variable ' Create the new menu Item AnewMenuItem = New MenuItem("New Menu Item!") ' Register EventHandler for Event Click of this new Menu item AddHandler AnewMenuItem.Click, AddressOf Me.NewMenuItem_Click ' Add it to the collection MenuItems ContextMenu1.MenuItems.Add(0, AnewMenuItem) End Sub Private Sub NewMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) MessageBox.Show("You clicked new Menu Item!") End Sub Private Sub BtnClearContextMenu_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnClearContextMenu.Click ' Remove all the menu items from ContextMenu1 ContextMenu1.MenuItems.Clear() End Sub Sau khi bn click nt Add MenuItem, lc bn right click Textbox1, Pop-up Menu s c thm mt MenuItem nh sau:

99

Th click new Menu Item trong ContextMenu1, chng trnh s hin th thng ip You clicked new Menu Item!. By gi click nt Clear ContextMenu ri right click Textbox1. ContextMenu1 b cleared nn s khng hin th. Duplicating Menus Mt vic khc ta c th lm trong lc Runtime ca chng trnh l cloning (to object song sinh). Th d, ta mun dng Edit menu ca MainMenu1 lm ContextMenu (ging ging nh trong VB6) cho Textbox1. thc hin vic ny, ta dng method CloneMenu(). Di y l code ta dng thay th ContextMenu1 trong chng trnh bng Edit menu ca MainMenu1. Private Sub BtnCloneMenu_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnCloneMenu.Click ' Instantiate a new ContextMenu object Dim newContextMenu As New ContextMenu() ' Add a clone copy of EditMenu to this new ContextMenu's collection of MenuItems newContextMenu.MenuItems.Add(editMenuItem.CloneMenu) ' Assign this new Context Menu to Textbox1 Textbox1.ContextMenu = newContextMenu End Sub Khi ng chng trnh, click nt Clone Menu, ri right click TextBox1, ContextMenu mi s hin th nh di y:

Lu : V CloneMenu() clone hon ton Object editMenuItem, k c cc Event Handlers ca cc SubMenuItems nn ta khng cn phi lm thm g c. Mun tr li trng thi c, tc l dng ContextMenu1 cho Textbox1, ta ch cn reassign ContextMenu1 vo property ContextMenu ca Textbox1 nh sau: Textbox1.ContextMenu = ContextMenu1 Bn c th ti v chng trnh Menu ny ti y. MDI Forms Trong VB6 ta to mt MDI (Multiple Document Interface) form bng cch set property MDIChild ca form y thnh True. Mt form nh th ch c th c dng lm child form, tc l n cn mt form MDI parent hin th trong y. Ngoi ra, mi application ch c th c mt

100

form MDI parent duy nht v ch trong lc thit k ta mi c th ch nh c tnh ca mt form l MDIChild. Mt form khng th tr thnh mt MDIChild lc Runtime. Trong VB.NET, mt form c th tr thnh mt MDI child lc Runtime bng cch set property MDIParent ca form y nhm vo mt form MDI parent. Do , mt form c th va l MDIchild form, va l form bnh thng ty theo hon cnh. Tht ra, ngc vi VB6, ta khng th set property MDIParent lc thit k, m phi lm lc Runtime. Ging nh VB6, trong VB.NET ta c th hin th nhiu forms MDIChild trong mt form MDI parent, khi parent form di chuyn th mang theo cc forms con. Khi hin th nhiu child forms, ta c th dng property ActiveForm bit child form no hin thi l Active. Ta th khi ng mt Windows Application mi. i tn Form1 thnh ParentForm v ch nh n lm MDI parent bng cch set property IsMDIContainer ca n thnh True. K thm mt form v i tn n thnh ChildForm. Di y l code thm hai child forms vo ParentForm v hin th chng: ' Declare child forms of type ChildForm Private WithEvents FirstChild As ChildForm Private WithEvents SecondChild As ChildForm Private Sub ParentForm_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load ' Instantiate an Object of type Childform FirstChild = New ChildForm() ' Make this form the MDI Parent of FirstChild FirstChild.MdiParent = Me FirstChild.Text = "First Child Form" ' Set Title ' Show FirstChild FirstChild.Show() ' Instantiate the second Object of type Childform SecondChild = New ChildForm() ' Make this form the MDI Parent of SecondChild SecondChild.MdiParent = Me SecondChild.Text = "Second Child Form" ' Set Title ' Show SecondChild SecondChild.Show() End Sub

cung cp mt Menu hin th danh sch cc forms MDIchild ca ParentForm, ta thm control MainMenu vo ParentForm. K , to mt MenuItem tn Windows v set property MDIList ca n thnh True. Property ny s khin danh sch cc forms child t ng hin th lm nhng menu items nm pha di Menu Windows. Danh sch ny t ng cp nht khi mt child form tr thnh Active, c thm vo, hay b ly ra. Parent MDI form c mt method tn l LayoutMDI t ng sp t v tr cc forms child theo kiu Cascade hay Tile layout. Thm mt MenuItem tn Tile Vertical v nht my hng code di y vo form x l Event click ca n: Private Sub tileVerticalMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles tileVerticalMenuItem.Click Me.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical) End Sub Khi ng chng trnh, by default hai forms childs c layout kiu Cascade. Trong Menu Windows c hin th title ca hai forms child v cho bit Second Child Form l Active form.

101

Nu bn click Tile vertical, hai forms child s c layout kiu Tile nh di y:

Bn c th ti v chng trnh MDIForm ny ti y.

Bi 12 Nhng chc nng mi trong giao din ca s ca VB.NET (phn V)


Toolbars Toolbars trong .NET c nng cp bng cch thm chc nng cho cc ToolBarButtons trong collection ca nhng buttons y. dng th Toolbar control, bn hy khi ng mt Project mi v t mt Toolbar vo form chnh bng cch doubleclick ln Toolbar icon trong Toolbox. Mt Toolbar s hin ra nm ngay di tiu ca form. K rightclick ln Toolbar y v chn Properties edit property Buttons Collection bng cch click ln ch (Collection) ri click ba du chm pha bn phi hin th ToolbarButton Collection Editor.

102

Bn hy Add vo Toolbar ba buttons vi nhng c tnh sau: i property Text ca button th nht (ToolbarButton1) ra Close v ta mun ng chng trnh khi user click ln button y. By default Style ca ToolbarButton l PushButton. i property Style ca button th nh (ToolbarButton2) ra Separator v ta mun dng n to khong cch gia button th nht v button th ba. i property Text ca button th ba (ToolbarButton3) ra Background Colour v property Style ra DropDownButton v ta mun dng n nh mt Combobox. Khi chy th chng trnh ta s thy hnh ging nh di y:

By gi ta s vit code x l Event Click ca Toolbar. Ch c mt handler, Sub ToolBar1_ButtonClick, c dng cho tt c cc buttons. Ta phn bit Button no da vo Index ca n, ging ging nh mt array of buttons trong VB6. Nu user click button th nht ta s c ToolBar1.Buttons.IndexOf(e.Button) bng 0, lc y ta s Close form chnh. Private Sub ToolBar1_ButtonClick( ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick Select Case ToolBar1.Buttons.IndexOf(e.Button) Case 0 ' Close Button Me.Close() Case 1 ' Never happens because the Button is a Separator

103

Case 2 ' MessageBox.Show("You clicked the third button") End Select End Sub Nu khng mun dng ToolBar1.Buttons.IndexOf(e.Button), bn cng c th so snh Buttons vi operator Is nh sau: If e.Button Is ToolBarButton1 Then Me.Close() ElseIf e.Button Is ToolBarButton3 Then MessageBox.Show("You clicked the third button") End If K chng ta cho t mt ContextMenu tn ContextMenu1 vo form v assign n vo property DropDownMenu ca button th ba nh trong hnh di y:

Nu khng mun assign ContextMenu1 vo button th ba trong lc thit k, bn c th thc hin vic y bng code lc form mi load nh sau: Private Sub frmToolbar_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ToolBarButton3.DropDownMenu = ContextMenu1 End Sub Bn hy edit hai menuItems cho ContextMenu1: mt ci tn mnuXm vi Text l Xm v ci kia tn mnuTrng vi Text l Trng. Khi chy chng trnh, nu bn click ci thanh c du tam gic en nm bn phi button th ba, ContextMenu1 s hin ra bn dng. Nu bn click button th ba, chng trnh cng generate mt Click Event nhng hin gi ta khng dng n, ch hin th mt s ip nh xc nh l c Event Click y. Nh th, ta thy .NET ghp mt ContextMenu vo mt ToolbarButton bin n thnh mt DropDownMenu. C iu sau khi user chn mt Item trong ContextMenu/DropDownMenu, Text ca Item khng c hin th ging nh trong mt ComboBox. Nu bn kh tnh v mun c chuyn th phi t lm ly nh cho thy trong code di y:

104

Private Sub frmToolbar_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ToolBarButton3.DropDownMenu = ContextMenu1 ToolBarButton3.Text = "Xm" End Sub Private Sub mnuXm_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuXm.Click MessageBox.Show("Bn chn mu Xm") ToolBarButton3.Text = "Xm" End Sub Private Sub mnuTrng_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuTrng.Click MessageBox.Show("Bn chn mu Trng") ToolBarButton3.Text = "Trng" End Sub Khi chy chng trnh bn s thy nh sau:

Bn c th ti v chng trnh Toolbar ny ti y. ListBox Items l mt collection of Strings Mi dng n, ta s thy .NET ListBox rt ging ListBox trong VB6. Tin ch by gi ta c th edit cc string Items ca ListBox trong mt editor nho nh s hin ra khi ta click vo ch (Collection) ca property Items:

105

Cc Items c cha trong mt collection tn Items, do ta c th lm vic vi mi chc nng ca mt collection nh Add, Clear, Insert, Remove, RemoveAt, Count .v.v.. Th d nh ta cho thm bn Items vo Listbox1 lc Form_Load nh sau: Private Sub frmListbox_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Add individual items ListBox1.Items.Add("Kng-gu-ru") ListBox1.Items.Add("Cng") ' Add more than one items by instantiating an object with items list enclosed in curly brackets {} ListBox1.Items.AddRange(New Object() {" iu", "Gu Panda"}) End Sub Nu trong khi chy chng trnh, bn thm nhiu Items vo ListBox v mun trnh update display Listbox nhiu ln, bn c th kp code gia hai statements BeginUpdate v EndUpdate nh sau: ' Shutdown the painting of the ListBox as items are added. ListBox1.BeginUpdate() ' Loop through and add 50 items to the ListBox. Dim x As Integer For x = 1 To 50 ListBox1.Items.Add("Item " & x.ToString()) Next x ' Allow the ListBox to repaint and display the new items. ListBox1.EndUpdate() Ging nh trong VB6, property MultiColumn hin th Items trong nhiu ct nu c set thnh True, property SelectionMode nu bng MultiExtended th cho ta select nhiu Items cng mt lc. Tuy nhin, cc Items c chn s c mt trong mt collection ch khng phi c Selected(i)=True nh trong VB6. Mun select mt Item lc run-time ta dng code nh sau: ' Select three items (2nd, fourth and sixth) from the ListBox.

106

ListBox1.SetSelected(1, True) ' 1 is index of 2nd item ListBox1.SetSelected(3, True) ListBox1.SetSelected(5, True) Trong th d ti y ta c ListBox1 vi danh sch cc con vt trong S Th Saigon. Button List Items s lit k danh sch ny. cch ta hin th mt Item vi expression Listbox1.Items(i).ToString. Private Sub BtnListItems_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnListItems.Click Dim i As Integer Dim Mess As String ' make up the list of Items separated by CarriageReturn/LineFeed For i = 0 To ListBox1.Items.Count - 1 Mess &= (ListBox1.Items(i).ToString) & vbCrLf Next ' Show the list MessageBox.Show(Mess) End Sub

Sau khi set property SelectionMode ca Listbox1 ra MultiExtended, code di y s lit k danh sch cc items c chn vi index ca chng: Private Sub BtnListSelectedItems_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnListSelectedItems.Click Dim i As Integer Dim Mess As String ' make up the list of Selected Items separated by CarriageReturn/LineFeed ' Collection SelectedIndices contains the index of selecteditems For i = 0 To ListBox1.SelectedItems.Count - 1 Mess &= (ListBox1.SelectedIndices(i).ToString) & ":" & (ListBox1.SelectedItems(i).ToString) & vbCrLf Next ' Show the list MessageBox.Show(Mess, "Selected Items", MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub

107

Items l mt Array of Objects ListBox ca .NET khng h tr ItemData nh trong VB6. ItemData l mt array cha cc con s tng ng vi nhng Items trong List array ca ListBox trong VB6. Tc l mi ListBox Item trong Vb6 c th c ch nh trc mt con s i din n. Khi user select List(i), ta c th ly ra ItemData(i) ca List Item y. Tht ra Items ca .NET Listbox cng c th l mt Array of Objects, khng nht thit phi l mt collection of Strings nh ta dng. Di y l code ta nh ngha mt Class tn LBItem, on dng code th Add mt Array of Objects loi LBItem vo Listbox1: Public Class LBItem Private mList As String Private mItemData As Integer ' List Item of Listbox Public Property List() As String Get Return mList End Get Set ( ByVal Value As String) mList = Value End Set End Property ' ItemData of Listbox Public Property ItemData() As Integer Get Return mItemData End Get Set ( ByVal Value As Integer) mItemData = Value End Set End Property ' Function to return a string representing this item for display Overrides Function ToString() As String Return mList End Function End Class Sau khi Add mt Array of Objects vo ListBox1 ta phi ch nh lm th no hin th mt Item. Th d nh dng property List ca LBItem nh di y: ' Indicate that Property List of LBItem will be used to display ListBox1.DisplayMember = "List" Nu ta khng ch nh DisplayMember, tc l ListBox1.DisplayMember = "" th ListBox1 s dng Function ToString ca LBItem hin th.

108

Ngoi ra, tr v mt value ging nh ItemData ca List Item ta ch nh ValueMember nh di y: Private Sub BtnAddOjects_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAddOjects.Click ' Clear all items in Listbox1 ListBox1.Items.Clear() Dim Objs(5) As LBItem ' Create an array of 6 Objects of LBItem Dim i As Integer For i = 0 To 5 Objs(i) = New LBItem() Objs(i).List = "Line " & i.ToString Objs(i).ItemData = i + 100 Next ' Add the array of objects to Listbox1 ListBox1.DataSource = Objs ' Indicate that Property List of LBItem will be used to display ListBox1.DisplayMember = "List" ' Indicate that Property ItemData of LBItem will be used to return a value ListBox1.ValueMember = "ItemData" End Sub Khi chy chng trnh ny, sau khi click nt Add Objects clear ListBox1 v Add 6 Objects mi, nu bn click hng th 4 trong ListBox s thy hnh di y:

Code x l Event SelectedIndexChanged (tc l Event Click trc y) ca ListBox1 ging nh di y: Private Sub ListBox1_SelectedIndexChanged( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged Try If ListBox1.SelectedValue <> "" Then MessageBox.Show(ListBox1.SelectedValue & " of " & ListBox1.SelectedItem.ToString, "Selected value") End If Catch ex As Exception ' Do nothing, ignore this error End Try End Sub Nh th ta implemented (thi hnh) cho .NET ListBox mt chc nng tng ng vi ItemData ca ListBox trong VB6. .NET ListBox khng h tr Style Checkbox, nhng ta c th dng CheckedListBox. Bn c th ti v chng trnh ListBox ny ti y.

109

ComboBox V ComboBox tha k t ListBox nn tt c nhng g ta bit v ListBox u p dng cho ComboBox. c bit by gi ComboBox c property MaxDropDownItems cho ta quyt nh hin th bao nhiu items khi danh sch c m ra. Km theo y l mt chng trnh biu din ComboBox trong ta dng Property ValueMember ca ComboBox tr v mt tr s i din Item. Data trong ComboBox1 c loaded t mt Access2000 database table bng code sau y: Private Sub frmCombo_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ds As New DataSet () ' Instantiate a Dataset ' Instantiate an OleDbDataAdapter for Access2000 database Authors.mdb and return table Authors Dim myData As New OleDbDataAdapter("Select * from Authors", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\Authors.mdb") myData.Fill(ds, "Authors") ' Load table Authors into Dataset With ComboBox1 ' Bind Table Authors to ComboBox1 .DataSource = ds.Tables("Authors") ' Make Property/Datafield FullName the DisplayMember of ComboBox1 .DisplayMember = "FullName" ' Make Property/Datafield AuthorID the ValueMember of ComboBox1 .ValueMember = "AuthorID" End With End Sub Chng ta ch nh record datafield FullName lm DisplayMember ca ComboBox1 v datafield AuthorID lm ValueMember ca ComboBox1. Ta truy cp data ca c s d liu bng cch dng mt DataAdapter loi OleDbDataAdapter khi cho n mt SQL CommandText: "Select * from Authors" v mt connection string, trong c cho bit database driver: Microsoft.Jet.OLEDB.4.0 v tn ca database ..\Authors.mdb. File Authors.mdb nm chung vi m ngun ca chng trnh trong parent folder ca folder bin, ni cha ComboBox.exe. K ta dng DataAdapter b table Authors vo dataset ds. Cch lm vic ny tng t nh ADO (Active Data Object) trong VB6. C im khc l Dataset c th cha nhiu tables (recordsets) v n hot ng nh mt cached disconnected database trong b nh. K thut ny c tn l ADO.NET v ta s bn thm nhiu v n trong tng lai. Mi ln user select mt item mi t ComboBox1, chng trnh s hin th AuthorId, l ValueMember trong Label1. Private Sub ComboBox1_SelectedIndexChanged( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Try 'Display the selected valueMember Label1.Text = ComboBox1.SelectedValue Catch End Try End Sub y c hai cch ta select mt ComboBox item bng coding. Cch th nht l cho bit AuthorId (ValueMember), user clicks button Select by AuthorId thy kt qu: Private Sub BtnSelectbyAuthorId_Click_1( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSelectbyAuthorId.Click 'Use Try to ignore error if operation fails Try ' Select the ComboBox Item whose valueMember equal txtAuthorId.Text ComboBox1.SelectedValue = txtAuthorId.Text

110

Catch End Try End Sub v cch th hai l cho bit FullName (DisplayMember), user clicks button Select by Name thy kt qu: Private Sub BtnSelectByName_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSelectByName.Click 'Use Try to ignore error if operation fails Try ' Select the ComboBox Item whose DisplayMember equal txtFullName.Text ' FindString returns the index of the found item ComboBox1.SelectedIndex = ComboBox1.FindString(txtFullName.Text) Catch End Try End Sub Khi chy chng trnh, bn s thy hnh nh di y. Trong hnh y, MaxDropDownItems ca ComboBox1 c set bng 4.

Bi 13 DataGrid (phn I)
DataGrid trong .NET tuy c cc chc nng ging nh trong VB6 nhng c nng cp vt bc v cch dng thay i rt nhiu nn coi nh ta phi hc li t u. Cch dng thng thng nht ca mt DataGrid trong VB6 l hin th mt Table cc records trong dng mt spreadsheet, mi hng (row) cha cc datafields ca mt record v mi ct (column) c header cho bit l datafield g. Ni cho ng ra, nm sau lng mi DataGrid l mt Recordset, tc l mt Set of Records m ta chn ly t database. Table chng qua cng l mt Recordset trong trng hp tng qut khi ta khng dng Clause WHERE trong SQL command, th d nh "Select * from Authors". Gii thiu ADO.NET Trong .NET, nim Recordset c thay th bng Dataset. Trong mt bi ti ta s hc chi tit v Data Access trong VB.NET, nn hin gi ch cn bit i khi v Dataset dng trong cc th d p dng DataGrid. Trong ADO (ActiveX Data Object) ca VB6 ta dng Connection ni chng trnh p dng ca mnh vi c s d liu v ly ra mt Recordset. Ci connection y vn c gi nguyn trong khi chng trnh ta lm vic vi Recordset. Trong ADO.NET ca .NET sau khi thit lp connection vi c s d liu ta copy mt hay nhiu Recordset vo Dataset. Cc Recordset ny c th c mi lin h Master/Slave Relation vi nhau. Th

111

d nh Invoice/InvoiceDetails, trong cc InvoiceDetails lin h vi Invoice qua InvoiceID chng hn, tc l InvoiceID l Primary Key ca Invoice v cng l Foreign Key ca InvoiceDetails . Sau ta ch lm vic vi Dataset m thi. Ci connection coi nh b ct t. Do Dataset c xem nh l disconnected database nho nh nm trong b nh. Chc chn bn s khng an lng v hi nu c hai ngi cng copy cc Recordset ra dng th liu khi update ta c b mt nhng sa i no khng. l vn kh khn c in v Multiuser lc hai ngi copy cng mt record ra Edit. Ngi Update record sau c th vit chng ln Edited Record ca ngi trc khin cho nhng thay i ngi trc nh vo b mt. Ci hay ca ADO.NET l khi ta mun Update Dataset, connection s c t ng ni li v dataset s c reconciled vi c s d liu. Ch reconcile l mt t k thut trong k ton m ta hay dng ni n vic so snh cc chi tit tin ra v ca mt trng mc gia s sch chng ta gi v bng bo co ca nh bng iu chnh li cc con s trong s sch ca chng ta cho ging nh ca nh bng. Nu ta gi s sch chnh xc th s khc bit ch l nhng transactions (mn tin ra, v) nh bng lm m ta cha bit nh chi ph dch v ca nh bng, thu ti chnh .v.v.. Bn trong Dataset c cha cc tr s c ca datafields dng vo vic so snh khi Reconcile cc records. C l bn thc mc ti sao Microsoft li by t thm ra chuyn ADO.NET vi nim disconnected database chi cho mt, nh c ngi tro phng: "Mi nm li thm mt k thut mi v Data Access t Microsoft". L do chnh l p dng trong Internet. V mi connection trn mng u nht thi, sau khi hon tt transaction th hai bn chia tay tm bit. Do rt kh cho ta gi mt connection thng trc nh trong ADO. Nn nh rng sau ny ln ln cc p dng trn Internet s thay th cc gii php (Applications) ta dng trong mng cc b. Ngay c nu ch mun dng Application trong ni b ta cng c th dng Intranet. Nh th ta ch cn trin khai mt Application duy nht dng cho c ngi ngoi (Internet), ln ni b (Intranet). Dataset ca ADO.NET cho ta cc li ch thc tin nh: Hon ton trong b nh: Mt Table trong Dataset l mt Array of Rows, nn ta c th dng thng (direct access) mt record bng cch ni n ci Row cha n, ch khng cn phi dng MoveNext, MovePrev,.v.v. Lm nh cng tc ca c s d kin chnh: Vai tr ca Dataset i vi c s d kin chnh (Oracle, Informix, SQLServer .v.v.) cng ging nh mi nm trc y ta bt u dng Workstations lm nh cng tc ca Mainframe computer. Chuyn no Workstation lm c th ta giao cho n, va nhanh, va linh ng, khi cn phin n Mainframe. Tt c mi cng tc sa i d kin u c thc hin trong Dataset. Dataset c th c biu din bng mt XML (eXtensible Marked Language): Ta c th dng cc cng c ca XML lm vic vi Dataset, trao i Dataset gia cc computers trn mng di dng XML, thm ch c th cha mt c s d kin nho nh di dng mt XML.

Dng thng XML lm c s d liu Chng ta mun hin th cc records ca mt Table trong Dataset biu din cc chc nng ca DataGrid. Hm nay mnh chi ni, nn s to mt XML file dng n lm mt Dataset, thay v trch mt Table t mt SQLServer hay Access database. Trc ht bn hy khi ng mt d n mi, t tn n l AlarmList. K , trong Solution Explorer rename tn ca file Form1.vb thnh frmAlarmList.vb v thay i property Text ca form thnh Alarm List, property Name ca form thnh frmAlarmList.

112

Lu l ch khi bn thay i property Name ca form bn mi thy tn ca Class ca form thay i t Form1 ra frmAlarmList nh ta thy trong hnh di y:

Nu by gi bn right click ln tn ca project AlarmList trong Solution Explorer v chn PopupMenuItem Properties, dialog AlarmList Property Pages hin ra. Trong ComboBox ca Startup object vn cn c ch Form1. Bn c th click ln ci ci tam gic bn phi ca hp Combobox select ch frmAlarmList ch nh n lm Startup form.

Trong chng trnh ny ta lo v an ninh v mun hin th cc cnh ca trong ta nh b m ca ngoi gi lm vic. Nu p dng ngoi i th Real-time Data s c thu thp t cc dng c gi l Data Acquisition hay Telemetry Monitoring Devices v bo co cho h thng trung ng cp nht ha Dataset m ta dng hin th trong DataGrid. Bn hy click IDE menu command Project | Add New Item ri chn XML File v t tn n l AlarmList.xml nh trong hnh di y:

113

K ta s nh vo data ca AlarmList. Hng u ca XML file l mt Processing Instruction (hun th cch x l) tuyn b rng ta dng tiu chun xml version 1.0 vi Unicode encoding utf-8. <?xml version="1.0" encoding="utf-8"?> Phn chnh ca c ci XML file nm gia cp Tag <alarmlist> (gi l opening Tag) v </alarmlist> (gi l closing Tag). Ta gi alarmlist l Element. Bn trong chnh alarmlist l nhiu Elements tn alarm. Cc Element alarm khng cn c closing Tag v chng khng c cha g bn trong. Trong trng hp ny ta chm dt opening Tag bng />. Tuy nhin mi Element alarm c ch nhiu Attributes nh priority, datetime, pointid .v.v.. bn trong opening Tag ca n. Mi Attribute c dng TncaAttribute="valuecaAttribute". Lu valuecaAttribute nm gia du ngoc kp hay ngoc n. <alarmlist> <alarm priority="3" datetime="20/7/2001 16:33:11" pointid="401-2-9" description="Level 1 backroom door" statusvalue="Open" diagram="19" alarm="true" isolate="false" fault="false" ackn="true"/> <alarm priority="3" datetime="20/7/2001 18:47:33" pointid="402-8-7" description="Level 1 kitchen side door" statusvalue="Open" diagram="6" alarm="true" isolate="false" fault="false" ackn="false"/> <alarm priority="2" datetime="20/7/2001 16:21:40" pointid="401-6-7" description="Side door of third level" statusvalue="Open" diagram="14" alarm="true" isolate="false" fault="false" ackn="true"/> <alarm priority="1" datetime="20/7/2001 15:19:37" pointid="401-2-3" description="Car park rear entrance" statusvalue="Open" diagram="16" alarm="true" isolate="false" fault="false" ackn="false"/> <alarm priority="1" datetime="20/7/2001 17:18:27" pointid="401-1-3" description="Front door of tenth level" statusvalue="Open" diagram="25" alarm="true" isolate="false" fault="false" ackn="true"/> <alarm priority="2" datetime="20/7/2001 16:21:30" pointid="401-5-4" description="Back door of nineth level" statusvalue="Open" diagram="5" alarm="true" isolate="false" fault="true" ackn="false"/> </alarmlist>

By gi click MenuCommand XML | Create Schema nh di y:

114

Ch l MenuCommand XML ch hin ra khi ta lm vic vi XML file ca project (doubleclick tn AlarmList.xml trong Solution Explorer). Mt Schema ca file AlarmList.xml, tn AlarmList.xsd, s hin ra trong Solution Explorer v bn c th doubleclick tn AlarmList.xsd lm vic vi file y. .NET IDE cho ta hnh ca Schema ta c th Edit d dng. Thng thng, IDE ch xc nhn th no l Element (c ch E nm bn tri), th no l Attribute (c ch A nm bn tri). Cn v Datatype th n nhm mt ni mi th l string. Do ta phi sa i li theo mnh, ni Attribute priority l integer v cc Attributes alarm, isolate, fault, ackn l Boolean.

AlarmList.xsd cng l mt XML file, n cha chi tit v cu trc ca AlarmList.xml v Datatype (loi data ) ca tng Element v Attribute trong file AlarmList.xml. Nu bn click Tab XML k bn Tab DataSet pha di bn s thy hnh di y:

To DataSet t XML Schema

115

By gi click tr li Tab DataSet, on dng MenuCommand Schema | Generate Dataset to ra cu trc ca mt DataSet da vo Schema AlarmList.xsd.

Mt file tn AlarmList.vb s c to ra trong source code folder ca project. N nh ngha v cung cp mi method cn thit dng cho DataSet loi alarmlist. Dng DataGrid hin th data trong DataGrid, ta c th bind (buc) n vo Dataset, Array hay Collection. Tht ra, nu bn mun, bn c th cu c DataGrid vo mt Set ca Listbox Items. DataGrid trong .NET c th hin th c Master/Detail records nn n m nhn lun chc nng ca MSHFlexGrid trong VB6. Bind DataSource ca DataGrid vo mt Dataset Ta hy tr li form frmAlarmList. t ln n mt DataGrid tn DataGrid1 v thm mt Button tn BtnLoadXMLData vi Text Load XML Data. Doubleclick ln Button BtnLoadXMLData cho vo cc hng codes sau y: ' Declare a Dataset of type alarmlist from AlarmList.vb that was created from the schema AlarmList.xsd Dim DS As alarmlist Private Sub BtnLoadXMLData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnLoadXMLData.Click ' Instantiate a DataSet type alarmlist DS = New alarmlist() ' Load the XML data from file AlarmList.xml in the source code folder. Note that the program EXE resides ' in the bin subfolder DS.ReadXml("../AlarmList.xml") ' Bind the Datagrid DataSource to this new DataSet table alarm DataGrid1.DataSource = DS.alarm End Sub By gi bn c th chy chng trnh ca chng ta. Click nt Load XML Data bn s thy nh sau:

116

Hin th cc ct data theo mnh Trong hnh trn tt c datafields ca mi record c hin th vi cng b ngang v vi datafield name ca chng dng lm ta ca mi ct. Ta c th dng DataGridTableStyle object hin th cc ct data theo mnh bng cch gi Sub AddCustomDataTableStyle() (c code lit k di y) trong Sub BtnLoadXMLData_Click. Private Sub AddCustomDataTableStyle() ' Instantiate a DataGridTableStyle object Dim ts1 As New DataGridTableStyle() ts1.MappingName = "alarm" ' Name of data table ts1.AlternatingBackColor = Color.Beige ' Make alternating row beige ts1.RowHeadersVisible = False ' Make RowHeaders (on the left of DataGrid) invisible ' Only two types are supported: Text and Boolean ' Add the display field in order of display from left to right 'Just ignore a datafield if you don't want to display it Dim boolCol1 As New DataGridBoolColumn() ' Boolean boolCol1.MappingName = "ackn" ' Name of datafield boolCol1.HeaderText = "Ackn" boolCol1.Width = 35 ts1.GridColumnStyles.Add(boolCol1) ' Dim TextCol1 As New DataGridTextBoxColumn() ' Text TextCol1.MappingName = "priority" TextCol1.HeaderText = "Prio" TextCol1.Width = 30 ts1.GridColumnStyles.Add(TextCol1) ' Dim TextCol2 As New DataGridTextBoxColumn() TextCol2.MappingName = "datetime" TextCol2.HeaderText = "Time" TextCol2.Width = 110 ts1.GridColumnStyles.Add(TextCol2) ' Dim boolCol2 As New DataGridBoolColumn() boolCol2.MappingName = "alarm" boolCol2.HeaderText = "ALM" boolCol2.Width = 30 ts1.GridColumnStyles.Add(boolCol2) ' Dim boolCol3 As New DataGridBoolColumn() boolCol3.MappingName = "isolate" boolCol3.HeaderText = "ISO" boolCol3.Width = 30 ts1.GridColumnStyles.Add(boolCol3) ' Dim boolCol4 As New DataGridBoolColumn() boolCol4.MappingName = "fault" boolCol4.HeaderText = "FLT" boolCol4.Width = 30 ts1.GridColumnStyles.Add(boolCol4) ' Dim TextCol3 As New DataGridTextBoxColumn() TextCol3.MappingName = "pointid" TextCol3.HeaderText = "PointID" TextCol3.Width = 70 ts1.GridColumnStyles.Add(TextCol3) ' Dim TextCol4 As New DataGridTextBoxColumn() TextCol4.MappingName = "description" TextCol4.HeaderText = "Description" TextCol4.Width = 210 ts1.GridColumnStyles.Add(TextCol4) '

117

Dim TextCol5 As New DataGridTextBoxColumn() TextCol5.MappingName = "statusvalue" TextCol5.HeaderText = "Status/Value" TextCol5.Width = 150 ts1.GridColumnStyles.Add(TextCol5) ' Dim TextCol6 As New DataGridTextBoxColumn() TextCol6.MappingName = "diagram" TextCol6.HeaderText = "Diag" TextCol6.Width = 40 ts1.GridColumnStyles.Add(TextCol6) ' Now add the DataGridTableStyle object to Collection TableStyles of Datagrid1 DataGrid1.TableStyles.Add(ts1) End Sub Trong code bn trn, ta thy DataGridTableStyle tn ts1 cha mt collection of GridColumnStyles. Mun hin th datafield no ca record ta to cho n mt ct hoc l Text hoc l Boolean. Nu l Text th ta instantiate mt object loi DataGridTextBoxColumn, nu l Boolean th ta instantiate mt object loi DataGridBoolColumn. MappingName ca DataGridTextBoxColumn hay DataGridBoolColumn l tn ca Datafield. HeaderText l Tiu nm pha trn ca ct datafield y. Width l b ngang ca ct m bn phi th nghim cc con s vi ln cho n hin th va vn. Ct no ta cho v trc th hin th bn tri, v sau th nm bn phi. Nu ta c khng nhc n mt datafield no, th n khng c hin th. Sau khi chun b DataGridTableStyle y ri, ta cho n vo Collection TableStyles ca DataGrid1. K Edit property Text ca DataGrid1 cho n cu "Dng DataGridTableStyle hin th theo mnh". Chy chng trnh li v click nt Load XML Data bn s thy nh sau:

Bi 14 DataGrid (phn II)


Dng Dataview Filter v Sort Thng thng, khi iu khin trong thi gian tht (real-time control), l Operator, ta mun cc alarms c u tin cao v mi xy ra nht c hin th trn ht. i khi, ta ch mun thy cc alarm priority 3 (u tin cao nht) m thi. thc hin cc vic ny, ta dng Dataview Object. Thay v dng thng table alarm ca DataSet alarmlist lm datasource ca DataGrid1, ta s dng mt DataView derived from (n t) table alarm. Ta c th Sort (sp theo th t) cc alarms/records theo Priority hay p dng Filter (sn lc) vo DataView ch thy nhng th g mnh mun, th d ch c alarms priority 3 thi. Nn nh l nm ng sau vn l table alarm, nhng Dataview ng vai tr cp king mt mu gip cho ta thy nhng th g v theo cch ta mun. Mi khi ta thay mt cp king, ta li thy nhng th khc.

118

Di y l Sub BtnLoadXMLData_Click c sa li mt cht dng DataView: Private Sub BtnLoadXMLData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnLoadXMLData.Click ' Instantiate a DataSet type alarmlist DS = New alarmlist() ' Load the XML data from file AlarmList.xml in the source code folder. Note that the program EXE resides ' in the bin subfolder DS.ReadXml("../AlarmList.xml") ' Bind the Datagrid DataSource to this new DataSet table alarm ' DataGrid1.DataSource = DS.alarm ' Create a Dataview from DS DV1 = New System.Data.DataView(DS.alarm) ' Sort alarms by priority, then datetime ' DESC stands for descending order,i.e. biggest on top DV1.Sort = "priority DESC, datetime DESC" ' Bind the Datagrid DataSource to Dataview DataGrid1.DataSource = DV1 AddCustomDataTableStyle() ' Display the number of alarms in each priority DisplayTotal() End Sub Dataview object DV1 c derived t DS.alarm. Sau ta Sort cc alarms theo th t u tin, ri trong s nhng alarm c cng priority ta li Sort chng theo datetime ( y data type ca datetime ch l string). Ngoi ra m con s cc alarms thuc mi priority ta c th dng Dataview vi filter ri xem property Count ca n nh sau: Private Sub DisplayTotal() ' Create a Dataview object from table DS.alarm Dim DVP1 As New System.Data.DataView(DS.alarm) ' Apply filter DVP1.RowFilter = "priority = 1" ' Display Count of records in this Dataview NumPrio1.Text = "Prio1: " & DVP1.Count.ToString Dim DVP2 As New System.Data.DataView(DS.alarm) DVP2.RowFilter = "priority = 2" NumPrio2.Text = "Prio2: " & DVP2.Count.ToString Dim DVP3 As New System.Data.DataView(DS.alarm) DVP3.RowFilter = "priority = 3" NumPrio3.Text = "Prio3: " & DVP3.Count.ToString NumTotal.Text = "Total: " & DS.alarm.Rows.Count.ToString Dim bmb As BindingManagerBase = Me.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember) NumDisplayed.Text = "Displayed: " & bmb.Count.ToString End Sub Chc bn thy thay v iterate qua mi record m con s alarms thuc priority 1,2 hay 3, ta dng ba Dataviews filter ra alarms thuc ba priorities khc nhau ri ly tr s Count ca mi Dataview. y l li lp trnh da vo nhng g c sn cng nhiu cng tt trnh to ra bugs. Ngoi ra, m con s hng alarms c tht s hin th bt c lc no ta dng BindingManagerBase object trong hai hng code di y: Dim bmb As BindingManagerBase = Me.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember) NumDisplayed.Text = "Displayed: " & bmb.Count.ToString Ta t thm ba buttons filter alarms vi code sau y: Private Sub Btn1and2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Btn1and2.Click DV1.RowFilter = "priority < 3" Dim bmb As BindingManagerBase = Me.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember) NumDisplayed.Text = "Displayed: " & bmb.Count.ToString End Sub

119

Private Sub Btn1Only_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Btn1Only.Click DV1.RowFilter = "priority = 1" Dim bmb As BindingManagerBase = Me.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember) NumDisplayed.Text = "Displayed: " & bmb.Count.ToString End Sub Private Sub BtnAllAlarms_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnAllAlarms.Click DV1.RowFilter = "" Dim bmb As BindingManagerBase = Me.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember) NumDisplayed.Text = "Displayed: " & bmb.Count.ToString End Sub Bn c th chay chng trnh v bm cc nt va mi thm vo xem cc alarms c filtered nh th no.

Lm vic vi mt Row trong DataGrid Khi mt alarm mi c bo co v hin th, h thng iu khin real-time thng hay pht ra nhng ting Beep nho nh nhc Operator x l s c to ra alarm. Vic u tin Operator s lm l Acknowledge (xc nhn l ti bit ri, kh lm, ni mi!) ci alarm bng cch right click ln Row hin th alarm ri click menuCommand Acknowledge t PopupMenu. Khi bn Acknowledge mt alarm ri th ci ACKN checkbox s c nh du v nu h thng khng cn alarm no cha c acknowledged th n s ngng Beep. Ngoi ra, c khi v bn bit l l do gy ra mt alarm no khng quan trng (th d nhn vin k thut ang sa v th ci sensor ca alarm y) v bn khng mun alarm y c bo co trong tng lai, bn c th Isolate (c lp ha) n. Khi no mun cho n hot ng bnh thng tr li, bn s Enable (tc ng) n. By gi bn hy t mt ContextMenu control vo form v Edit cho n ba menuCommands tn mnuAckn(Acknowledge), mnuIsolate(Isolate) v mnuEnable(Enable) nh trong hnh di y:

Mi khi user right click ln mt hng alarm, ContextMenu1 s hin th ch nhng menuCommands thch hp vi tnh hung. Tc l nu alarm cha c acknowledged th mi c menuCommand Acknowledge, khi alarm

120

cha b isolated th mi c menuCommand Isolate, nu b isolated ri th ch c MenuCommand Enable. Bnh thng, nu bn click ln mt checkbox cn trng trong DataGrid1, checkbox y s c nh du. Nhng trong chng trnh ca chng ta ti y ta khng mun cho user lm vic y m phi Acknowlege, Isolate hay Enable bng PopupMenu. Do bn hy cho property ReadOnly ca DataGrid1 bng True. Lc chng trnh nhn c Event MouseDown t DataGrid1 ta s tm cch xc nh lc by gi Mouse ang nm trn alarm line no bng cch chy Method HitTest ca DataGrid1. Khi DataGrid1 HitTest v tr ca Mouse vi instruction myGrid.HitTest(e.X, e.Y), n s cho ta mt Object HitTestInfo. Property Row ca HitTestInfo l hng th my trong DataGrid1. ly ra ng DataRowView no ang hin th HitTestInfo.Row y ta phi da vo BindingManagerBase. Ci DataRowView m ta ang tm chnh l DataRowView ca BindingManagerBase vi position bng HitTestInfo.Row y. Trong chng trnh ny, ta s cha DataRowView y trong variable drv. Di y l code x l Event MouseDown ca DataGrid1, l ta hin th bn di ci description ca alarm c clicked bng statement Label1.Text = drv("description") cho user mt feedback: ' Variable used to store selected DataRowView Dim drv As DataRowView Private Sub DataGrid1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles DataGrid1.MouseDown ' Only proceed when Mouse Right Button was clicked If e.Button <> MouseButtons.Right Then Exit Sub ' Typecast sender to DataGrid data type. myGrid is actually DataGrid1 Dim myGrid As DataGrid = CType(sender, DataGrid) ' Declare a HitTestInfo variable Dim hti As DataGrid.HitTestInfo ' Obtain the info about Mouse location hti = myGrid.HitTest(e.X, e.Y) ' Only proceed when a Cell was hit If hti.Type = DataGrid.HitTestType.Cell Then Try ' Obtain BindingManagerBase of DataGrid1 Dim bmb As BindingManagerBase = Me.BindingContext(myGrid.DataSource, myGrid.DataMember) ' Position at DataRowView corresponding to the physical row that was hit bmb.Position = hti.Row ' Store the found DataRowView in temporary variable drv drv = bmb.Current ' Display description of the alarm line as a feedback Label1.Text = drv("description") If Not (drv Is Nothing) Then ' Only display the MenuCommands that are appropriate to this context Dim ctx As DataRow = drv.Row If Not (ctx Is Nothing) Then If drv("ackn") = True Then mnuAckn.Visible = False Else ' Only display menuCommand Ackn when alarm is not yet acknowledged mnuAckn.Visible = True End If If drv("isolate") = True Then ' If alarm is already isolated then only display MenuCommand Enable mnuIsolate.Visible = False mnuEnable.Visible = True Else mnuIsolate.Visible = True mnuEnable.Visible = False End If ' Popup context menu ContextMenu1.Show(myGrid, New Point(e.X, e.Y)) End If End If Catch ex As Exception

121

MessageBox.Show(ex.ToString()) End Try End If End Sub Khi User click mt trong cc Popup menu commands ta thay i cc boolean value Ackn hay Isolate v vit xung AlarmList.xml data file nh sau: Private Sub mnuAckn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuAckn.Click If Not drv Is Nothing Then drv("ackn") = True UpdatePoint() End If End Sub Private Sub mnuIsolate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuIsolate.Click If Not drv Is Nothing Then drv("isolate") = True UpdatePoint() End If End Sub Private Sub mnuEnable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEnable.Click If Not drv Is Nothing Then drv("isolate") = False UpdatePoint() End If End Sub Private Sub UpdatePoint() ' Accept the changes in DataSet DS.AcceptChanges() ' Write updated data to XML file to persist the information DS.WriteXml("..\AlarmList.xml") End Sub Khi khi ng chng trnh v right click ln alarm point 402-2-9 Acknowledge n bn s thy nh sau:

Bn c th ti v chng trnh AlarmList ny ti y. Edit mt XML Schema Trong chng trnh mi ny ta s c mt p dng khc cho DataGrid. Ta mun to ra mt DataForm Edit chi tit ca cc Operators, nhng ngi c php dng h thng iu khin Real-time On-line Acknowledge alarm, m, tt cc qut, my bm,.v.v.. DataForm ny s c mt DataGrid nm bn di cho ta mt hnh spreadsheet ca tt c cc Operator records, v ta c th chn lm vic vi record no bng cch click bn tri ca record y trong spreadsheet.

122

Trc ht bn hy khi ng mt project mi tn Operators. K dng IDE MenuCommand Project | Add New Item thm mt XML Schema bng cch click ln icon XML Schema. Ch Name XMLSchema1.xsd hy sa n thnh operatorlist.xsd nh trong hnh di y:

Edit ci schema mi ny, bn hy doubleclick ln tn operatorlist.xsd trong Solution Explorer. Mt khung vng nht cn trng s hin ra gia. Bn hy drag icon E Element t XML Schema Toolbox (nm bn tri ) vo khung vng nht. Hy click ln ch Element1 (nm bn phi ch E) trong hnh mi to ra v sa n thnh operator nh trong hnh di y:

K drag icon A Attribute t XML Schema Toolbox vo drop n ngay trn hng nm di Element operator. Sa tn Attribute thnh operatorid. Click bn phi ch string ca operatorid chn datatype integer t ComboBox. Lp li cng nhng thao tc y cho Attributes username, password v level. Click bn phi ch string ca level chn datatype integer t ComboBox. H tr s level ca mt operator cng ln th operator y cng c quyn lm nhiu chuyn. MasterUser l ngi c level cao nht. Mi command trong h thng iu khin Real-time c cho mt level m user phi c mt level vi tr s t nht l bng n th mi dng command y c. Th d Command Modify Username/Password/Level c level bng 5 th ch c MasterUser vi level bng 5 mi dng n c. n y ta nh ngha xong cc Attributes ca mt Element operator m ta s dng lm record trong Table operator trong c s d liu XML. c mt XML hp l ta cn phi gi cc Element operator vo trong mt Element gc (root) m ta s gi n l operatorlist. Bn hy drag icon E Element t XML Schema Toolbox vo khung vng nht v sa tn ca Element thnh operatorlist. K nm gc tri trn (top left) ca hnh Element oparator v drag drop n vo ngay hng di ch operatorlist ca Element operatorlist. Bn s thy hnh di y:

123

Nu by gi bn click Tab XML pha di ca khung vng nht bn s thy m ngun XML ca Schema operatorlist.xsd nh sau:

M ngun XML ca Schema operatorlist.xsd cho thy Element operatorlist l Element gc (root) cn gi l DocumentElement ca XML ny. Bn trong Element operatorlist c Element operator. Mi Element operator c nhng Attributes l operatorid, username, password v level. datatype ca Attributes operatorid v level l integer. Tr li hnh ca Schema bng cch click Tab Schema pha di, ta thy hng u tin ca mi khung ch nht cha tn ca Element ch ca khung y. T hng th nh tr xung l nh ngha nhng g thuc v Element y

Bi 15 DataGrid (phn III)


Edit XML file da trn XML Schema
Sau khi xc nh cu trc v datatypes ca cc Elements v Attributes ca table operator, by gi ta s cho data vo table y. Bn hy dng IDE menuCommand Project | Add New Item thm mt XML file (click ln icon XML file) vo project. Sa Name ca file y t XMLFile1 thnh alarmlist.xml. Right click ln trang trng ca XML, ch mi c cu: <?xml version="1.0" encoding="utf-8" ?>

124

Chn PopupMenu command Properties hin th dialog DOCUMENT Property Pages.

Trong ci Dropdown Combo, chn http://tempuri.org/operatorlist.xsd lm Target Schema cho operatorlist.xml ca chng ta. Sau bn s thy Element operatorlist c thm mt Attribute mi tn xmlns (ch ns trong xmlns l vit tc cho namespace) vi tr s http://tempuri.org/operatorlist.xsd. iu ny c ngha l ta p t Schema operatorlist.xsd ln cu trc v cc d kin bn trong XML file operatorlist.xml. By gi, bn c th bt u nh data vo trang operatorlist.xml. l v IDE bit ta ang dng Schema operatorlist.xsd, nn n c th p dng Intellisense gip ta edit chnh xc v nhanh nh trong hnh di y:

Mi khi bn nh xong opening Tag operator l closing Tag ca n t ng hin ra. Bn trong opening Tag ca operator, Intellisense s hin th tn cc Attributes bn chn. Mi khi bn nh du = sau tn mt Attribute th IDE s t ng insert mt cp du ngoc kp. Sau khi nh xong d kin ca mt s operators, nu bn click MenuCommand XML | Validate XML Data IDE validate cc d kin ta va mi cho vo xem n c ng nh nh ngha trong ci Schema operatorlist.xsd khng th s thy IDE than phin nh sau:
E:\NET\HongDevelopment\LessonPreparation\Operators\operatorlist.xml(4): Element 'http://tempuri.org/operatorlist.xsd:operatorlist' has invalid child element 'http://tempuri.org/operatorlist.xsd:operator'.

125

l v trong Schema khng c ni r l bn trong Element operatorlist c nhiu Element operator. gii quyt tr ngi ny ta phi edit trc tip trong m ngun XML ca Schema. Bn hy doubleclick ln file name operatorlist.xsd ca Solution Explorer v nu cn th click Tab XML ca trang Schema hin th m ngun XML ca operatorlist.xsd. Thay th ci cp Tags <xs:sequence></xs:sequence> bng cp Tags <xs:choice maxOccurs="unbounded"></xs:choice> nh trong hnh di y ni rng c nhiu Elements operator trong Element operatorlist :

Typed Dataset
Trong bi 13 ta to Dataset t Schema bng cch dng IDE MenuCommand XML | Schema Generate Dataset. Sau mi khi mun ni n mt datafield ca record ta dng tn ca datafield y. Th d ni n datafield description trong DataRowView drv ta vit nh sau:
Label1.Text = drv("description")

Mt cch vit d c v t nhin hn l:


Label1.Text = drv.description

Coding cch ny c thm li im l ngay trc khi chy chng trnh, compiler s cho bit ngay nu ta nh vn khng ng ch description chng hn. Thm na, Intellisense c th h tr ta trong lc nh code vo bng cch hin th danh sch ca tt c datafields ca drv. So vi trng hp ta dng tn datafield, nu nh vn khng ng ch description th cho n run-time chng trnh mi khm ph ra vic y.

126

Loi Dataset cho php ta code drv.description c gi l Typed Dataset v ta c th pht sinh (generate) n t Schema ca XML file bng cch dng line command:
xsd.exe /d /l:VB operatorlist.xsd /n:operatorlistDS

y ta dng chng trnh dng c xsd.exe pht sinh t Schema operatorlist.xsd mt dataset trong ngn ng (language) lp trnh VB vi namespace tn operatorlistDS. Nu bn khng thy xsd.exe th tm n trong folder \Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin ri c th copy n vo project folder. Lu l bn xsd.exe dng trong final version ca VS.NET th khc vi bn xsd.exe dng trong version Beta 2. K , bn c th thm Typed Dataset ny vo project bng cch dng IDE MenuCommand Project | Add Existing Item ri chn operatorlist.vb t project folder.

Dng Dataform wizard pht sinh form t Dataset


Ta s dng Dataform Wizard generate mt dataform. Nhng trc , ta cn phi compile project vi IDE menuCommand Build | Build Operators chc na Wizard thy c Typed Dataset. Bn hy dng IDE MenuCommand Project | Add Windows Form, click ln icon Data Form Wizard v i Name ca form thnh frmOperator.vb nh trong hnh di y:

127

Tip theo bn s thy Data Form Wizard dialog vi tn ca Typed Dataset hin ra trong ComboBox ca Option Use the following dataset: nh di y:

y nguyn v click Next:

128

Click Checkbox Include an Update button, ri click Next:

y nguyn v click Next:

129

Chn cc options nh trong hnh bn trn ri click Finish. Form frmOperator s c generated v t ng cho vo Project. By gi bn hy right click ln tn file Form1.vb trong Solution Explorer delete n v right click tn project Operators ri chn command Properties t PopupMenu i Startup object thnh frmOperator. K hy sp xp cc object trn form frmOperator cho gn li nh trong hnh di y:

hin th cc operator records nh mt Spreadsheet pha di, bn hy thm mt DataGrid tn DataGrid1 vo form. V du cc ch ca Password trong Dataform, ta s Edit Property PasswordChar ca TextBox editpassword thnh * nh di y:

130

load data vo DataForm sau khi khi ng chng trnh bn hy doubleclick ln button Load ri vit code sau y cho Event Click:
Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click ' Read operator data from XML file Me.objoperatorlist.ReadXml("..\operatorlist.xml") ' Bind DataGrid1's Datasource to table operator DataGrid1.SetDataBinding(Me.objoperatorlist, "operator") ' Define our owned display style. Do not display Passwords AddCustomDataTableStyle() ' Display current record position Me.objoperatorlist_PositionChanged() End Sub

Ta s gi mt Sub AddCustomDataTableStyle hin th cc records ca operators trong DataGrid1. RowHeaders ca DataGrid1 s c yn visible cho user c th click bn tri mt record khi mun lm vic vi record y. ng thi ta cng c khng hin th Datafield password. Coding ca Sub AddCustomDataTableStyle c lit k di y:

Private Sub AddCustomDataTableStyle() ' Instantiate a DataGridTableStyle object Dim ts1 As New DataGridTableStyle() ' Map table operator to it ts1.MappingName = "operator" ' Set other properties. ts1.AlternatingBackColor = Color.Beige ' Add a first column style. Dim TextCol1 As New DataGridTextBoxColumn() TextCol1.MappingName = "operatorid" TextCol1.HeaderText = "OperId" TextCol1.Width = 50 ts1.GridColumnStyles.Add(TextCol1) DataGrid1.TableStyles.Add(ts1) ' Add a second column style. Dim TextCol2 As New DataGridTextBoxColumn()

131

TextCol2.MappingName = "username" TextCol2.HeaderText = "Operator" TextCol2.Width = 120 ts1.GridColumnStyles.Add(TextCol2) ' Add a third column style. Dim TextCol3 As New DataGridTextBoxColumn() TextCol3.MappingName = "level" TextCol3.HeaderText = "Level" TextCol3.Width = 35 ts1.GridColumnStyles.Add(TextCol3) ' Now add ts1 to the Datagrid1's collection of TableStyles DataGrid1.TableStyles.Add(ts1) End Sub

By gi hy chy chng trnh v click nt Load. Data ca cc operators s c loaded vo c DataForm ln DataGrid1. Khi bn click cc nt navigators di chuyn n record sau hay record trc, ci hnh tam gic nho nh trong DataGrid RowHeaders nm bn tri DataGrid1 cng di chuyn theo nh trong hnh di y:

Ngc li, khi bn click bn tri mt row trong DataGrid1, DataForm s hin th chi tit cc d kin ca record y. Tuy nhin hng ch cho bit v tr ca record (nm gia cc nt navigators) vn khng c thay i theo. gii quyt chuyn ta tm dng Event TextChanged ca TextBox editoperatorid nh sau:
Private Sub editoperatorid_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles editoperatorid.TextChanged ' Show position of current record objoperatorlist_PositionChanged()

132

End Sub

cho y , ta cng s vit code cho Event Click ca button Update lu tr data trong mt XML file tn operatorlistNew.xml:
Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click ' Accept all changes in Dataset Me.objoperatorlist.AcceptChanges() ' Write Dataset to XML file Me.objoperatorlist.WriteXml("..\operatorlistNew.xml") End Sub

133

You might also like