chươnq 8. f ì i es -...
TRANSCRIPT
ChươNq 8 . F ì I es
Khi cần lưii dữ liệu vào đĩa, cung cấp một cơ chế để thite hiện giống như mọi ngôn ngữ khác. Có hai cách ghi và đọc dử liệu vào íiles; kiểu file íext và kiểu file nhị phân.
8 . 1 . G H I / Đ Ọ C F I L E T E X T
ỉ<hi viết chương trinh để luu dữ liệu vảo fi!e, ta phải thêm dòng tiêu đề; using System.10;
8.1.1. Ghi d ữ liệu v ã o fileCú pháp để ghi dữ liệu vào íile: s tr in g filenaine = ”c ; \ \ C S \ \ t e s t ĩ . t x t StreamWriter sw = new StreamVỉriter (filename) sw.Write("This i s the te x t ." ) ;
Sau khi ghi xong cần phải đóng file lại. sw.Close () ;
8.1.2. Đ ọ c dO liệu tù fileị
s tr in g filenaiTte “ " c : \ \ c s \ \ t e s t l . txt" ;StreamReader s r l = new StreamReader {filename);srl.ReadLine0 ;sr l .C lo seO ;
^ViàụS. l .using System; using System.10; using System.Text; c ia s s PileText
s t a t i c str ing f i l e l * * 'c : \ \ t e s t f i l e . t x t .” ; s t a t i c doxible a * 123.456;
• s ta t ic in t b * 789; s t a t i c châr kt *
1 0 1
s t a t i c void Main(stríng( ] args)
{using (StreamVỉriter sw = new StreêưnWriter ( f i l e l ) )
{sw.Write {•'This i s a tex t; a “ "); sw.WriteLine(â); sw.WriteLine (b); sví.VíriteLine (k t); sw.Close ();
ìStreamReader sr l " new Stream Reađer(filel); s tr in g input;w hile((input = srl.ReadLine() ) != null)
Consoĩe.WriteLine(input);)Console.WriteLine("Ket thuc!")! sr l .C io se ();Console. ReađLine{) ;}}
íSkổIí quả:
This ỉs a text; a - 123.456 789 M Ket thuc.Chú ý: Một cách khác để ghi dữ iiệu vào file. Tniớc hếỉ phải khai
báo biến file:StreanMriter sw;
Tạo tìle text nhờ hàm CreateYextQ:s t a t l c s tr in g f i l e l * " c : \ \ t e s t f i l e . t x t " ; sw •= F i le .C r e a te T e x t( f i le l ) ;
1 0 2
I ?
Ghi dữ liệu vào file: sw.W riteLinerThis i s a tex t ." );
Sau khi ghi xong dữ liệu cần phải đóng file lại. SM.Close 0 ;
Đọc dữliệu từíiie:
Khai báo đối tưỢng file:StreanReader sr l;
Mở file:str in g input;sr l “ F ile .O p en T ex t(f ile l) ;
Đọc file:input=srl.ReadToEnd();
Hiển ữiị dữ liệu sau khi đọc:Console.WriteLíne(input);
Ui dụ 8.2.using System; using System.10; c la ss FileText {s t a t ic s tr in g f i i e l = "c : \ \ t e s t f i l e . t x t " ; s td t ic void Main(strlng[ 1 args)
iStreamHritec sw; / / ghi du l ie u vao f í l e sw = F ile .C rea teT ex t(f iie l) ; sw.WriteLine("This i s a te x t ." ); sw.WriteLine{"Dai hoc Bach Khoa Ha Noi."); sw.WriteLine("Trung tam Genetic Singapore."); sw.WriteLine(123.456);SM.Close();StreamReader s r l ; / / doc du l ie u tu f i l e / / =* new StreamReader ( f i l e l ) ;
103
str in g input;s r l * F ile .O p en T ex t(f ile l) ; input « srl.ReadToEnđ0 ;Console.W riteLine(input);Console .VíriteLine (** The end of the stream!” ); sr l .C lo se 0 ;Console.ReadLine();
}}
H k ể 'í quá:
Thìs is a text Daí hoc Bach Khoa Ha Noi Trung tam Genetic Singapore 123.456Ta cũng có thể đọc file tíieo các dòng kế tiếp như đoạn mã dưới đây: StreamReader sr; str in g input;sr “ F ile .O p en T ex t(f i le l) ; while-(true)
if ( in p u t »» nulĩ) break;Console.WriteLine(input);}sr .C loseO ;
s Ví dụ 8.3.using System; . using System. 10; •, using System.Text; c la s s FileText
{s t a t í c s tr in g f i l e l = "c : \ \ t e s t f i i e . t x t " ;
104
s t a t i c doubie a * 123.456; s t a t i c in t b 789;s t â t i c char * ’K';s t a t i c void Main (stringỉ ) args){using (5treamWriter sw « new StreamVíriter (f i l e l ) Isw.Write ("This i s a text; a - ;sw.WriteLine (a ); sw.VíriteLine (b);5 W,WriteLine(kt); sw.Clos€ ();)StreamReaàer sr; str in g input;sr « File.OpenText ( f i l e l ); while(true)
{input * sr.ReadLine(); if ( in p u t “ null) break;Console-WriteLine(input);1
Console.WriteLíne (’* Ket thuc !'*); sr.C lose 0 ;Consoie.ReadLine();
quá:
This is a text; a = 123,456 789 M Ket Ihuc.
105
8. 2. G H I/Đ Ọ C FILE NHỊ PHÂN
Việc ghi/đọc dữ liệu của file nhị phân có nhiều ưu điểm hcAi ỉile text
vì bảo mật file cao hơn. ở đây sỗ trình bày cách ghi/đọc dữ liệu cho một byte và cách ghi/đọc dữ liệu cho một đối tượng chúÈi nhiều trường dữ iiệu.
- Ghi dữ liệu vào file kiểu byte:
+ Giả sử ta khai báo một biến mảng kiểu byte [ ] b l = { 1, 2, 3, 4, 255} ;
+ Khai báo đối tượng để ghì dữ liệu vào file "testbin.dat" ở ổ đĩa C;F ile S tr e a m (" c : \ \ t e s tb in .d a t” , FileMode.OpenOrCreate,
P ileA ccess .W rite , P iỉeShare.N one);
+ Thựt hiện quá tìình ghi các phần tử của mảng số b l có kiểu byte: foreach(byte bnext in bl){sw.WríteByte(bnext);
}Sau khi ghi xong, ta phải đóng fiie )ại.
sw .C lose();
- E)ọc dữ liệu từ fi)e kiểu byte;
+ Mở file để đọc:F ileIn fo fr » new F ileInfo r c : \ \ t e s tb in .d a t ' ' ); stream strm ■ fr.OpenReađ<);
+ Sử dụng vòng lặp để đọc:in t i ;while(true)
i - strm.ReadBỵtỹO ;
i f ( i “ - 1 ) break/C on so le .w riter{0 ,4 )" , i ) ;
1
+ E>óng file sau khi đọc xong: strm .Close{)?
106 . _
& Ví dụ 8.4. Ví dụ này cho phép ta ghi và đọc các số có kiểu byte (giá trị 0 ^ 255).
using System; using Sỵsteni.IO;c ỉa s s P ilebin / /c a c so kieu bỵte {s t a t i c void Main (stringl ] args){//G hi du l ie u tu f i i e voi so kieu byte(0 4- 255) . byte [ ] b l ^ ị 255, 33, 44, 55, 6 6 } ;P ileStream sw = new FileStream (*'c : \ \ t e s t b i n . dat” ,'
rileMode.OpenOrCreate, F i le A c c e s s , Writ6 r F ileShare .N one);foreach(byte bnext in bl)ísw.WriteByte(bnext);
sw.Close (>;/ / Doc đu ĩ ie u tu f i l eF iieIn fo f * new F ileInfo (”c : \ \ t e s t b in .dât” ); stream strm » f .OpenRead(); in t i / w hile(true)
. {i = s t r m . R e a d B y t e 0 /
i f ( i « - 1 ) breâk/Console.W riter{ 0,4) i ) ;)stmì-Close {) /Consoie. ReadLine()/)}
^^ K ể t quả:
255 33 44 55 66
107
Ta có thể thực hiện việc ghi/đọc dữ liệu của nhiều kiểu dữ liệu khác nhau bằng file nhị phân.
- Ghi dữ liệu từ íile nhị phân; s t r in o f i l e l = " c :\ \F ile B in l .d a t" ;FileStreâfn f i l e l ;s tr in g name; / /d ữ l iê u thành viêndouble Sâlary; / /d ừ l iê u thành viên/ / khai bảo đ6i tượng wf cho v iêc ghi vào f i l e nhị phán B inaryW riter wf * new B i n a r ỵ W r i t e r ;/ / Các hàm Write {) để ghi từng thảnh vỉén wf,Write(name); wf.W rite(salary) /
“ Đọc dữ liệu từ íilc nhị phân:
Khai báo file cần đọc: riieStream f i l e l ;
Khai báo đối tưỢng rf cho việc đọc:BinarỵReađer r f « new B inaryR eader(filô l);
Các hàm để đọc dữ liệu nhị phân: name “ rf^Readstring{); sa lary « r f . ReadDoiable ();
Phụ thuộc vào kiểu khai báo từng dữ liệu mà ta có các hàm đọc dữ liệu khác nhâu.
by te b l; b l * rfrPeâdB yte0 ; char chl; chl « rf.ReadChar(); decimâl d l; d l * rf.ReađDecimal(); double d2; d2 « r f . ReadDoưble(); f lo a t f l ; f l » r f .R ea d sin g le0 ; i n t a; a * rf,R ead In t3 2 (); long b; b * rf•R e ad ln t6 4 í); sbyte sb l / sb l * r f •ReađSByteO; u in t u i l ; u i l “ rf-Readưlnt32{); ulong u l l ; u l l = rf.ReadUInt640 ;
108
Vi dụ 8.5.using System; using System.10; c la s s FiieBin2(private str in g name; private in t age; private double salary; public FileBin2()Iname “ agè = 0 ; salary = ũ;
}public F iÌ€Bir2(string name, int âge, đouble Sâlary){this.name = name; th is .a g e * age/ this.sâlary » Sâlary;
)public void Inputo
(Console.Vírite ("\ nNhap ten: **); name * Console.ReadLine0 ;Consoỉe. Write("Nhap tu o i : " );age = Int32»Parse(Console.ReadLine ( ) ) ;Console,Write("Nhap ĩuong: ” );salary = Double. Parse(ConsoÌe.ReadLine());
)public void Show()
Console.WriteLine(’'Ten: *'+name+''; Tuoi: ’.'+age);
109
Console.W riteLineLuong: **+saLary);
)public void SaveData(FileStream f i l e l )
BinaryWriter wf * new BinarỵVỉriter ;wf.Write (name); wf .Vírite (age); wf .W rite(salary);
}public void ReađData(FileStream f i l e l )
{BinaryReader r f * new B i n a r ỵ R e a đ e r / name « r f .ReadStringO age * rf.R eađlnt320 ; salarỵ * r í . ReadDouble();
}public void MenuO
{Console.WriteLine (” MENƯ ");Console.VíriteLine (”■«■...... ' );Console • VíriteLine (" 1, Nhap du l ie u ” );Console.WriteLine <"2• Doc va xem ");Console. WriteLine (” 3 • Thoat” ); Console,WriteLine (" ■■iLUi— ) •
Console• WriterNhap so 1 - 3 de lua chon: ");
})c la ss T estP ile
{s t a t i c voíd Main (string[ ] args){FileBin2 p » new FileBin2();
1 1 0
s tr in g filename = ”c:\\D atâ .d at’* ; s tr in g choice = ” ;w hile(choice !» ” 3")
{p.Menu 0 ;choice * Console.ReadLine0 ; switch(choice){Câse ”1*’ : Console.WriteLine Save data to EileStream fwr * new rileStream (fiienam e,
EileMođe. Create, r i le A c c e s s . Write^ r i le S h a r e . W rite);p » new FileBin2(); p.Input 0 / p . SaveData(fwr); fwr.Close 0 ; break;case ”2": Consoie.WriteLine ("Read dâtâ from f i l e ” ); Filestream fr new F ileS tream (fiien am e, PileMode.Open,
F ileA ccess .R ead , r i leS h a re .R ea đ )/ p »,new FileBin2(); p,ReađData(fr)r p. Show(>; break;case ” 3" : continue;
}
H K ề t quầ:
MENU
1. Nhap du lleu2. Doc va xem
1 1 1
3. Thoat
Nhap so 1 - 3 de lua chon: 1 Save daĩa to file Nhap ten: Hoa Nhap tuoi; 22 Nhap luong: 1000
MENU
1. Nhap du líeu2. Doc va xem3. Thoat
Nhap so 1 - 3 de lua chon: 2 Read data from file Ten: Hoa; Tuoi; 22 Luong: 1000Việc ghi/đọc bằng file nhị phân có thể ử>ụt hiện cho một mảng đối
íuọng. Mỗi đối tuỵng lại bao gồm nhiểu kiểu dữ liệu thành phần khác nhau.
Ví dụ 8.6. Viết chutữìg trinh để lưu dử iiệu vào file. using System; using System. 10; c la s s FileBin3
,íp rivâte str in g nâine; p riva te in t age; p rivate double salary; public FileBin3()
age « 0 ;
1 1 2
salary * 0 ;t
public voíd Inputo
IC o n s o l e . W r i t e c * \ n H h a p t e n : ' * ) ;
name = Console.ReadLine 0 ;Cofisole,Write (”Tuoi: '*);age = Int32.Parse(Consoie.ReâdLine());Console,Write Luong: *');Sâlary = Double.Pârse(Conscle.ReadLine0 ) ;
}p u b l i c v o i d S h o w ( )
(Console.M riteLineDoc du iieu tu Console.MriteLine ("Ten ” -*-najne+” ; Tuoi:" ; Console. WriteLine("Luong: "+salâry);
)p u b l i c v o i d S a v e D â t a ( r ỉ i e S t r e a m
BinaryVĩriter wf = new BinarỵWriter ( f i l e l ) ; w f . W r i t e < n a m e ) ;
wf .Vírite <âge); w f.W rite(salary);
í \ p u b l i c v o i d R e a đ D a t a ( F i l e S t r e a m f i l e l )
{BinaryReader r f * new BinarỵReader ( f i l e l ) ; name = rf.ReadString0 ; age = rf.R eadlnt32();S â l a r ỵ « r f • R e a d D o u b l e { > ;
113
c lâ ss T estr ile
s t a t i c void Main (stringC ] args)
in t n;Ccnsole.VíriteTNhap n * n » Iĩìt32.Parse(Console^ReadLine());FileBiiì3 [] p = new FileBin3[ n) ; str ing filename » ”c:\\Data.đat**;Con$ole.WriteLineCGhi du l ie u vao f i i e ” );FileStream fwr * new FileStream(filename, FileMode.Create,
FileAccess,Write/ FileShare.writ e ) ;fo r ( in t i * 0 ; i < n; i++)
{i] * new FileBin3 ();
Ịi i) ,Input 0 ;f( i] .SaveData (fwr);
1
fwr.Close () ///--------------------------------------------------------------------
Console,WriteLine{’* Doc du l íe u tu f i l e ” );FileBin3 [ ] p i “ new FileBini^ n] ;rileStream fr = new FileStream(filename, rileMode.Open,
PileAccess.Read, r ileShâre. Read);fo r ( in t i * 0 ; i < n; i++)
{pK i) “ new FileBín3(); pl[ i} .ReadĐata(fr); pl[ i] .Show() ;
}Console. ReadLine ();
})
1 L l Ậ P ' n ề ề i . . H O M114
^ ^ K ểt quả:
Nhap n = 2 Ghi du lieu vao fìle Nhap ten: Mai Tuoi: 22 Luong: 1000 Nhap ten: Ha Tuoi: 35 Luong: 2000 Doc du lieu tu fìle Ten: Mai: Tuoi: 22 Luong: 1000 Doc du lieu tu fileTen; Ha; Tuoi; 32 Luong; 2000
G v i dụ 8.7. Xây dựng một menu để thụt hiện các thao tác: Nhập, liệt kê, xoá, sửa. tim kiêm, bổ sung.
using System; //Consoie.Application c la ss personiprivate s tr in g narne; private long ID; private in t age;//--------------------------------------------------------------------
Public personO
name = ;ĨD = 0; age = 0 ;
/ / ......... ...... ............................................... .............. ......
115
public s ta t ic in t n;public person (] p = new person' 1 0 0 ] ;/ / ------ ------------------------------ --------------------------pubĩic void InputO
Ifo r ( in t i = 0 ; i < n; Ì++)
(p( i] = new personO ;Console .WriteLine ("person { 0) " , i ) ;Console.VỉriteLine ("Enter name: "); p( i] .name = Console.ReadLine 0 ;Console.WriteLine("Enter ID: ");p( iỊ .ID = Int64 .Parse (Console.ReadLíne 0 ) ;Console.KriteLine("Enter age: ");p; i] .age = Int32. Parse (Console.ReađLine {)) ;
ì}/ / ------------------------------------- --------------------------pidDlic void Show()
tfo r ( in t i * 0 ; i < n;CcnsOÌe.WEiteLine("Name:{ 0) ; ID:{ 1} ; age: {2}", F<i].nairae,
p{ i] .ID, ri i] .age) ;
1------------------------------------------------------------------public void SearchNameO
(str ing namel;Consoie.VIrite ("Enter nante to search: ” ); namel “ Console.ReadLine(); fo r ( in t i * 0 ; i < n; i++)
{i f (String.Ccsnpare (namel, F( i] .name) ** 0)
116
Console.VỉriteLine ("Name; f CỊ ; ID: ( l } ; a g e : 12}", p[ i] .naine, p{ ij .ID, p[ i] .age);
})//------------------------------------ ----------------------------
public void SearchlDO ilong id l;Console.Write("Enter ID to search: ” ); id l = Int64. Parse{Consoie.ReadLine()); fo r ( ir t i = Ũ; i < n; i++){i f (ídl “= p( i] . ID)Consoie .VỈriteLine (" Narre: {0} ; ID: I 1} ; age : {2}",
pl i ỉ . na ĩ re , p [ i ] , I D , p ( i ] . a g e ) ;)}/ / --------------------------------------- ------------ ............ -public void DeleteO
{long id l;Console.Write("Enter ID to search: "); id l = Int64. Parse(Console.ReadLine()); fo r ( in t i = 0; i < n; Ì++I
{i f (idl == FÍ il -ID){Console.VỉriteLine (" Name:i 0} ; ID:{ 1) ; age: {2}", p( i] .name,
p. i] .ID, p( i) .age) ; w h ile (i < n)
{i) = p( i+ i] ;
i++;
1 1 7
n = n - i ;
/ / ------------------------------------- ------------------- ---public void E d ito {str in g namel;Console.W rite("Enter name to search: ” ); namel * Console.ReadLine(); fo r ( in t i = 0 ; i < n; i++){i f (String.Ccxnpare (namel,p( ij .name) == 0) íConsole.VíriteLine {" Narae: ( 0 ) ; ID: {1} ; age: {2) ",
Pí i] .name, p [ i ] . I D , p [ i ] . a g e ) ;Console.KriteLine {" person { 0) ” , i) ;Console.WriteLine("Enter name: ” );p{ i] . name “ Console. ReaoLine () ;Console.KriteLinerEnter ID: '•);p( i] . 1 0 * Int64 .ParseíConsole.ReadLine {)) ;Console.WriteLine(”Enter age: ");p( i) .age - Int32.Parse(Console.ReadLine {)) ;
}/ / --------------------------------------public void AppenđO Ip( nl “ new personO ;Console.WriteLine C’ Enter name: ” ); fị n] .name * Console.ReadLine 0 ;
118
Console.VíriteLine(”Bnter ID: ” );fị nì .ID » Int64,Pârse{Console.R6ddLine{));Console.WriteLineTEnter age: ");p( n] ,age ® Int32.Parse (Console.ReađLineO );n * n 4* 1 ;
)/ / - ....... ............. ................................ ........................public s t a t i c void MainO (person per * new personO; int choice = 0 ; do
(Console. WriteLine r* MENU ” );Console.WriteLine(" 1. Input D ata’M; Console-VíriteLiner 2. L ist A ll **);Console. WriteLine r 3• Edit (Name) ");Console.write L in er 4. Search Name "); Console.WriteLine(" 5, Search ID " )/ Console.WriteLine(" 6 , Delete Console.WriteLine(** 7, Append");C o n s o le .W r ite L in e 8 . Exit **);C onsole.H riter Bnter Choice:")/ chcice ■ Int32.Parse(Console.R€âdLỉnê()); switch(choice)
{case 1: Console.Write("Enter niiinber o f persons: '*);
n » Int32.Parse(Console.ReadLine());per.Input 0 ;break; case 2: per.Show();break; case 3: p er .E d it0 ;bredk; case 4: per .SearchKaine 0 ;break;
119
case 5: per.Searchlùd ;break;case 6 : p er .D e le te ( ) /break;
t
case 7: ger.Append0 ;break; Câse 8: continue;}}w hile(choíce != 8 );
//
^ ^ K ế t quá sau khi chạy chương trình được biểu diễn trên hình 8.3.
« C : \ C o l l e c C # 0 6 \ C S h a r p 0 4 \Ent^r Age :
HENUt . ỉnput Oata2. Lict All3. £cỉit (Nam«)^. S^arch Nône5 s^arch ID
ĩ . Append8 Exit
Ent^r Choice : 2Ndmp :Nga ; 1 0 . 11 1 . I 9 e : 26
Mai 10 222 : 25tình ; 10 333 r ^99 : 28
MENU1 Input Data2 List Pi lJ tdLt (Nâm«) S^drch
5. s«?arch 10
7 í pp ndô ExW
Ent«r Choic« •
Hình 8.3
Vi dụ 8.8. Ví dụ này đuục coi là một bài tập dài trong cuốn Lập trình c # từ cơ bản đến nâng cao. Yẻu cầu của bài tập này như sau;
Công ty tmyền thông ABC giữ vai trò quan trọng trong sự phát triển
1 2 0
vé công nghiệp điện thoại cùa khu vụt. Yêu cầu bạn phải phát triển một hệ thống thông tin để quản lý bằng máy tính vể điện thoại nhằm cung cấp cho khách hàng sự hỗ trỢ những thông tin cần thiết-
Các yêu cầu đặt ra như sau:
1. Tạo một lcfp phone để lưu các dữ tiệu sau:
Phone number
Pullname
Address
No Of Line
Type
Orgdnizaíion
2. Dử liệu này cần phải được:
a) Khcfi tạo nhờ hàm tạo (constructor)
b} Truy cập dữ liệu nhờ sử dụng thuộc tính (properties)
3. Lớp phone phải có phương thức để lưu đối tượng nhờ iớp PiieStream.
4. Tạo một lcfp phone book để lưu toàn bộ lớp phone vào trong một mảng.
5. Trong lớp phone book phải sửdụng Indexer để sao cho ta có thể truy cập vào tCíng phần tử của mảng phone.
6. Ngưcí sử dụng phải thựt hiện đưỢc các chủt năng sau:
a) Add New (thêm bản ghi mới)
b) Edií (sửa đổi một bản ghi)
c) Delete {xoá một bản ghi)
d) Tim một bằn ghi trong mảng phone {tìm theo tên và tìm theo sốđiện thoại)
e) Hiển thị các số đ ện thoại khẩn cấp
Duứi đây liệt kê toàn bộ chương trình của bài tập dài nêu trên./* ProgrartBning using c# - Examples ' Project 1: Telephone inquirỵ system
121
• In c ld ss PhoneBook: an array c f phcnes i s implemented by an ArrayList instance
* F i le I/O: binarỵ f i l e , FileStrea-Tj i s processed with BinaryWriter/BinaryReader
*/ưsing Systein; using System. 10; using System -Ccllections; c la s s Phone
private ulcng phoneNumber; privâte s tr in g fullName; p rivate s tr in g adđress; p rivate in t noOfLíne/ p rivâte s tr in g type;; p rivate s tr in g organization;public Phonelụiong phoneNumber, s tr in g fuilNâme, s tr in g
adđress, in t noOíLine, s tr ỉn g type, strir.g organizâtion){this.phoneNunổDer » phcneN imber; this,fullN am e = fullName; this^address * ađdress/ t h i 3 .no0 fLine “ noOfLine; this^type =*■ type; th is .o rg a n iea tio n « organi2 â‘.ion;
1
public PhoneO: t h is (0/ 0, {}public ulong ĩ^oneNumber {get{ return phoneNun*iber;) setí phoneNumber » value;l }pubỉic s tr in g FuliName
n.dị wỀmi.JtíM122
uet{ return íullKame;} seti fullKame « value;)} > p u b l i c S ũ r i n g A t í d r e i ^ s
get{ return th is.âdđress;} set{ address = value;))public in t noOíLineígetỉ return noOfLine;) se tí noOfLine = value;)
}p u b l i c s t r i n g T ype
{oetị return type;} set{ type = value;i )pubiic s tr in g Organization {get( return orgânization;) se ti cr^aní2 ation = value;}}publÌc void Inputíỉ {Console.Write r Phone nisTử>er:phoneNumber * ƯInt64.Parse<Console.ReađLineO);Console,Write r Full name: '•) ;fullName « Consolế.ReadLineO;Console. Write í” Address: ” ) / address * Console. ReadLine();Console.Write(”No o f i in e : ,noOfLine « Inr32.ParsetConsole.ReadLine()); Console.Vírite("Tỵpe: ");
1 2 3
type * Console.ReadLine();Console.Write (”Orgânization: ) ;organizâtion « Console.ReadLine ();)public void DisplayO {//Console.WriteLíne(ToString {)) /Console,WriteLine rTelephone Nurrber:\t{ 0, ••40} Lines:
ị 1, 5]**, phoneNuiTìber, noOfLine) ;Console-WriteLine {" Name/0 rgani2 aticn :\t" +fullName+ " / "
+organization);Console .VíriteLine (*'Address:\ t \ t” + address};Console.VỉriteLine ( * ' T y p e : \ t \ t \ + type) ;)public override str in g ToStringO {Return (String.Format (’* Phone: { 0) \nName: { ỉ}\nAddress:
{ 2) \nLine: { 3} \n T ^ e : { 4} \nOrg: ( 5} phoneNumber, fullName, addresố, noOíLine, type, organ ization));
)/ /p u b l ic voíd Save(FileStream fs) public void Sdve{BinaryWriter bw) l//Bm«^ryWriter bw * new fìinaryWriter ( f s ) ;bw.Write (phoneNumber) /bw.Write (fullName) ;bw.Write (address);bw. Vlrite (noOfLineị;bw.Write (type);bw.Write (organiĩation) // / b w . C l o s e 0 ;
public void Load(Bi^arỵReader br){
124
phoneNumber s? br. ReadUInt64 (); fullName = b r . ReadString (); address * br.Readstring0 ; noOíLine = br.Readlnt320 ; type * br.ReadString0 ; organixation » br .ReadStringO ;
c la ss PhoneBook
ArrayList data * new ArraỵListO;//dynamic array of obiects public Phone thist in t i] / / indexer {get(i f ( ( - 1 < i) && (i < data.Count))return (Phone)data[ i] ;e ls ethrow new InđexOutOíRangeException (" Index out of range**)# }set(i f ((-1 < i) &ỉt (i < data.Count))/ / changé a phonedata( i] « Vâlue;e l s e i f (i “ dâta.Count)/ / adđ new phone data.Add(value); e ls ethrow new IndexOutOíRangeException("Index out of range” ); \1
public void ClearO
1 2 5
data .C ỉear();}pubiic voià D e le te í in t index){i f ( (-1 < index) && (ìndex < dâta.Count))
data.P.einoveAt (index);Console.WriteLine r Done" );)e ls ethrow new InđexOutOfRangeException(**Nothing to Q elete"); )public void E d it ( in t i^^dex) fi f I (-1 < Index) 6 «. (index < đata.Count)) ịth isl index] .D isp layO ; thisỊ index} . Input 0 ;Cons3le.W riteLiner Done" i !)e ls ethroM new InđexOutOfRangeExceptionC*Nothing to e d i t ”);)public void Seârch{string nane){in t found * 0 ;intí ] indexArray - r>ew intí data.Count] ;/ / s tore indexes o f phones that / / matches the search condition in t j » Ũ;fo r ( in t i “ 0; i < c^ta.Count; ++i)
i f (th i^ ij .FullName.ToUpper() “ name.ToUpperI))
1 2 6
•••+found/indexArraií j++] = i;
i f (íour.d > 0 )(Ccnsole. /.'riteLine r Pound Dhcne ( s ) ; { CỊ , ícunđ); for (int k “ 0 ; k < found; ++k){Console.Vt’r i te L in e r* Index of the phcne i n f o : í 0} ” ,
n d Q y . h r ĩ a y i k ] ) ;
Console.WriteLine (this[ indexArray[ k]] .ToString ( ) ) ;
el$€Ccnsole. WriteLine (*• Not f ound ĩ**);}public void Searchíulong phoneK*anữ5er){fcr (int i * 0; i < data.Count; ' •»‘1) ỉi f (this( i3 •PhoneNumber *•» chcReNưrò>er)(Console/W riteLinerinđex of the phone in fo : i j ;Console.VíriteLine {this( i) . ToSt,ring( ) ) ;return;
Ccnsole.WriteLine {” Not found!" );
)public in t Countíqei { return data.Count; 1
)//-------------------------------------------------
c ld ss App
{s t a t i c PhoneBook l i s t = new PhoneBookO; public s t a t i c in t MâinO (whiie(true){in t’ choice = MenuO; switch (choice){case 1: / / Ađd new PhoneAddO;breâk;case 2: / / Edit#a Phone EditO ;Console. ReadLine (); break;case 3: / / Delete a Phohe Delete ();Console .BeađLine (); break;Câse 4: // Seârch a Phone Search()/Console. ReadLine()/ breâk;Câse 5: // Display PhoneBookDisplayO ?break;case 6 : / / Save to f i l eSave ();bredk;
1 2 8
case 7: / / Load from f i l eLoad ();break;Câse 8 : / / Displaỵ Emergency Nurfủ:)ersEmergencyNumbers ()/breâk;case 9: / / Exỉt progranì return ũ;
s t a t i c in t MenuO IConsole.WriteLine ("\n\ MENU ==5=»«=»=«$=;=:=»') ;Console.WriteLine (** 1. Add a Phone" );Console.WriteLine (" 2. Edit a Phone’' );Console.WriteLine r* 3. De le te d Phone" );Console. VíriteLine ự* 4. Search d Phone" );Console.WriteLine (** 5, Display PhoneBook” );Consòle .WriteLine 6 . Save to Console.WriteLine r 7. Load from file" );Console.WriteLine ("8 . Display Emergency Numbers"); Consoie.writeLine C’ 9* Exit” ) ; in t ch = 0 ;while ( (ch < 1 ) II {ch > ^))(try ' iConsoỉe.VíriterVnEnter ỵour choice: "); ch * Int32. Parse (Console.ReadLine ()} ;1
catchicontinue;
1 2 9
return ch;1
s t a t ic in t inđex » - i ; s tâ t ic void AddO {booi next * true; vchile (next){Console .WriteLine {’* Enter Phone in fc ;Phone phonê » new Phone {);phone. Input 0 ;l i s t í ++index] =» phone;Console.Write (** Do yo\j vrant to continue? (y/ n) : '*);str ing choice * Console,ReadLine ();i f (choice.Toưpper0 "V” )next “ true;e is e next » fa lse ;
s t a t ic void DỉsplayO
fcr (int i * 0; i < list .C ou n t; '♦‘+Ì)(l i s t ị i] .Đisplây {) ;Console. ReadLine ();)ìs td t ic voiđ SearchO {Console, Write r Search by Name ữr PhoneNunử er (N/P)? ; ' ) ; str ing s e le c t * Console.ReadLineO; i f (se lec t .Toưpper (> “ "K")
130 . ^ .n i Ạ p ĩ ỉ é ặ ề i . M C ã
Console. Write ('* Enter Name: **); str ing name * Consoie.ReadLine0 ;1 i s t .Search {nanie);t
e lseIConsole. Write (" Enter Phone Nuraber:ulong t e l - UInt64. Parse(Console.ReadLỉne());l i s t .S e a r c h ( t e l ) ; .)1
s t a t i c void EditO{Console. Write ("XnEnter index of Phone to e d it : ” ); in t i = Ĩnt32. Parse (Console. ReadLine {)); i i s t . E d i t ( i );1
s t a t ic void DeleteO {Consoỉe.Mrite ("\nEnter index of Phone to đ e le te : '*); in t i = Int32 . Parse (Console. ReadLine ()); l i s t .D e L e te ( í ) /}s t â t i c void SaveO iConscie. Write (*’\nEnter f i i e name: "); str in g fileName * Console.ReadLine0 ; i f (F ile .E x ists(fileN am e))File* Delete(fileNam e);//remove pre*stored f i l e i f anyrileStream fs = new FiÌeStreâíTi(fileName, rileMode.Appenđ,
FileAccess.Write, FileSharevWrite);BinarỵWriter bw ® new BinaryW riter(fsì;
1 3 1
for (int i = 0; i < list.C ount; ++i) listl i} .Save (bw) ; bw.Close(); f s . Cl os e ( >;)s t a t i c void LoadO {Console.Write ("\nZnter f i l e naine: " > ; s tr in g fileName = Console.ReadLíneO ; i f (P ile .E x ists(fileN am e)) ll i s t .C le a r O ;FileStream f s =■ new FileStreajn(fileNarae, FíleMode.Open,
F ileA ccess . Read, FileShare. Bead);BinaryReader br = new BinaryReađer(fs); in t i = - 1 ;while(br.PeekChar() > -1) / / not end of f i l e {Phone phone = new Phone(); phone.Load(br);l i s t í t + Ỉ Ị « phone; }br.Closeí);£s.C lose 0 ỉ ■}e ls ethrow new TlleNotroundException there i s no £ i l e :
f i leN a m e);
s t ậ t i c voíd EmetgencyNurnbersO,,{Console.Mriteliine C' P olice i 113") ỉ ■Console.writeL in e(” Police: 114")/Console.WriteLine c* Police: 115")!}}
132
Sau khi biên địch và chạy chương trình, ta có kết quả như trên hình 8-4. Khi đó. chọn một yêu cầu tưcíig ứrtg vcrt một phím số để cung cấp dịch vụ cần thiết. Ví dụ:
- Chọn số 1 để nhập số liệu.
- Chọn số 5 để hiển íhị dữ liệu.
~ Để lưu số liệu vào ổ đĩa cífrig. gô số 6 vcrt File nâme: nn 1 .dat.
- Khi chạy lại chương ừinh, gõ số 7 và gọi tập tin nằm mặc đính trong thư mục chứa chưcíng trình. Các bạn có thể gô đưdừig dẫn cho tập tin. C :\n n l.d a t và khi đọc tập tin này cũng phải có đường dẫn.
■ C : \g e n e t ic 0 6 \B a ita p d a iG e n \B a ita p d a iG e n \b in \D e b . . .1 1
L ÊX
Do ỊjOU uant t o continue’ (y/nj.n A[í~
! tìdd s Phone 112 Edit â Phone 13 a Phone■* Search a Phone ' 1 1 *5 Displây PhoneBoũi-
i t?. Ssưe tc f i lsì Load from f i le3 Diỉpiày Emsrgency Mjiiiberủ5 ixH 1
ĩnter yo iir choice- 5■ piephon? Nusiber. ySSHŨi-Ũtl 3'ianc/ũrganiration Phaíi cong Kgo / Dh 8ach khũS Ha noi■í;idrFi3 Giap bât Hă no iĨỊipe: Khong uu t iín ỉ
MuBbcr. ‘iiíl9‘(28ỉ65't32 L in íi- 5' í â - í / O r ạ â n i r a t i o n - . PbôJi Bao ưan / I8H ịa ứ đ r ậ iS E n g len đ
1
Type; Uu t i « n 1n t
Hình 8.4
133
ChươNq 9. Chuồi k ỷ Tự (sTR ÌN q)
xử !ý chuối trong các ngôn ngữ lập trinh là hết sứt cần thiết. Trong có nhiều hám (phưtfng ửiức) thư viện để thực hiện việc xử lý chuỗi
tự. Sau đây ta S€ xét một số phương thức cơ bản.
9.1. PHƯƠNG THỨC STRING.FORMAT()
Phương thức này cho phép ta định dạng một chuỗi kết hợp nhiều dạng khác nhau.
t 5 v í d ụ 9.1.using Systern; c la ss STRl
s t a t i c voiđ Main (str in gt] args)
t
in t X = 15;str in g s l = s tr in g . Format (" {0} X { 1} = { 2)", X , 3, x*3); str in g s2 = String.Format("Ngay g io hien hanh: { ũ)",
DateTứrte.Koví);ConsoÌe.WriteLine("{ 0)\r\n { 1)" , sl, s2); Console.ReadLineO ?
}}
H / í ế t quả;
1 5 x 3 - 4 5 Ngay gio hien hanh: 8/15/2Ũ07 2:35:45 PM
9 .^ PHƯƠNG THỪC CONCATO
Phương thúc này cho phép nối các chuỗi vcrt nhau thành một chuỗi lớn hơn.
9.2.using System;
1 3 4
sc a t ic void Main(stringí 1 args)
ị
str ing s l = "Hello” ; str ing s 2 = "worldCor.sole.WriteLine (String.concat (sl ," , s2) ) ;Console. ReadLine();
c la s s STB2
S iK ế t quá: Hello wor!d !
9.3. PHƯƠNG THỨC JOIN()
t ?
Phuyng thứt này cho phép chèn một chuỗi con vào giữã các chuỗi nhỏ.
Vi dụ 9.3.using System; c la ss STR3
s ta t ic void Main(strinẹí ] args)
s t r i n g [ ] s l = { " H e ĩ l o " , ” a n d " , "welcoiT te” , " t o " , " y o u ” } ;
s t r i n g s ^= " -----
fo r ( in t i = 0; i < sl.Length; i++)Console.Write("Console.WriteLine 0 ỉConsole. W riteLine(String.Join(s2, s l ) ); Console.ReadLinet);
I}
H K ế f quá:
Hello and welcome to you Heiio— and— welcome— to— you
135
9.4. PHƯƠNG THỬC INSERT{)
Ta có thể chèn một chuỗi con vào vị trí n của một chuỗi đã cho.
t 5 w d ụ 9.4. ậ
using System; c la ss STR4
1s t a t ic voiđ Main (striDi^ ] args)
Istr in g s l = "Once a time";Consolfe. WriteLine (" s l : "+sl ) ;C onsole .W riteL ine(sl.Insert(4, " upon ") ) ;Console. ReadLine();})
quá; s1: Once a time Once upon a time
9.5. PHƯƠNG THỨC COPYTO()
Nếu có một chuỗi s l = "Hello beautiíui world!", s2 = "Viet nam", khi thụ t hiện câu lệnh: sl.CopyTo(6, s2, 0, 4) trong đó 6 là vi ừí bắt đẳu Mch các phần tử của chuỗi s l, 0 là vậ trí đầu tiên để copy chuỗi mcfi vào.4 là độ dài chuỗi cắn copy vào.
l5 \ / , 'd ụ 9.5.usíng System; c lass STR5
ís t a t i c voi'd M ain(strinự] args)
ístr in g s l “ "Hello b eau tifu l vrorld!” ;char n s 2 = I ' V , ’ i *, ' e ' , ' t ' , ' ’n' , ' a' , 'm») ;C o n so le .W riteL in es l: '•+sl);
1 3 6
Console. WriteLine(mchar); sl.CopyTo(6 , s2, 0, 4);/ / 6 lã v ị t r í đẩu của chuỗi cán tr ích ra/ / 0 là v ị t r í đầu của chuỗi mới/ /4 là độ dài "beau"Console-WriteLine("s2: "+s2);Consoie,WriteLine C’s l : "+sl ) ;Console-ReadLine 0 ;
S i K ế í quả :
s1: Hello beautiíul vvorld ! s2: Viet nam beau nam s1: Hello beautiíul vvorid !
9.6. PHƯƠNG THỨC TRIMSTART(), TRỈMEND(), TRIMQPhương thút TrimSíartO cho phép cắt bỏ ký tự trắng ở đầu chuỗi.
Phưcừig thức TrimEndO cho phép cắt bỏ tự trắng ở cuối chuỗi.
Phưc^g thức TrimO cho phép cắt bỏ ký tự trắng ở hai đầu chuỗi.
c5 Ví dụ 9.6.using System; c la s s STR6
s t a t i c void Main(strin^ 3 ârgs){str in g s l « Big **; / / c o hai dau cach hai benConsole .WriteLine (" Heiloí 0} Worlđ*, s l ) ;s tr in g s2 « s l.T rim S tart0 ; / / c a t bo dau cach dau chuoiConsole .WriteLine (" Heilo( 0} Worlđ: ", s 2 ) ;s2 - s l . TrimEnd (); / / c a t bo dau cach cuoi chuoiConsole .WriteLine ự* Hello{ 0} World: ", s 2 ) ;
18.L7RỈM1...NCA .
137
s2 “ s l .TrimO; / / c a t bo cac dâu cach ca hai phia cua chuoi Console.WriteLine (” Hello( 0} World: s2) ;Console.ReadLine ();«))
S kể'í quá;Hello Big World // có cả 2 dấu cách hai bên HetloBig Wor1d //cắt bỏ các dấu cách đầu (bên trái) Heỉlo BigVVorld // cắt bỏ các dấu cách cuối (bên phải) HelloBigVVorld // cát bỏ cả 2 dấu cách đầu và cuối {hai bên)
9.7. PHƯƠNG THỨC REMOVEO, PADLEFT{), PADRIGHTQ
Phương thíte RemoveO cho phép cắt bỏ các phần tử của chuỗi từ vị trí m và có độ dài n.
Phương thứt PadLeítO cho phép điển một ký tự mcí vào phía trái mộỉ chuỗi đã cho để lấp đầy n ký tự cửa chuỗi (bao gồm cả tự mé^).
Phương thức PadRÌghtO cho phép điển một ký tự mcS vào phía phải một chuỗi đâ cho để lấp đầy n ký tự của chuỗi (bao gồm cả ký tự mtì).
l5 ự íd ụ 9.7.using System;c la ss STR7
{s t a t i c void M ain(strin^} args)
Istr ln g s l ■ "Hello B eautifu l World";Console.W riteLine(sl); str in g s2 ■ sl.Remove(5,10);Console.WriteLine(s2); s2 - sl.PadLeft(30,Console.WriteLine{s2)? s2 - sl.PadR ightO O ,'*');Console.MriteLine(s2);
1381É. U Ậ P'm ÌN K..M CB
Console. ReadLine(};
)}
iS/<è'í quả:
Hello Beautiíul VVorld Hello VVodd •**’ **“ *Hello Beautitul VVortd Hello Beautitul VVorld"” * " * '
9.8. PHƯƠNG THỨC s o SÁNH CÁC CHUỖI KÝ TựPhương thức String.Compare(sl,s2); cho kết quả trả về ià một số
nguyên n. Nếu s l > s2 thì n > 0. Nếu s l > s2 ửii n < 0. Nếu s l > s2 thìn = 0 .
Phưcíng thú t sl.CompareTo(s2) cũng trả về kết quả giống như phưcrtig thức String.Compare(sl, s2).
Phương thức String.CompareOrdinaKsl, s2); cũng giống hai phương thút trên.
Phưcmg thửc String.Equals{sl, s2); trả vể giá ừị írue nếu hai chuỗi s l ® s2 , trả vể giá trị false nếu hai chuỗi s l và s2 khác nhau.
S ự í đ ụ 9.8 .. using System;
c la s s STR8
Is t a t i c void Mâin (stringt ] args)
{str in g s l » Worlđ!” ;str in g s2 « "Hello World!**; str in g s3 «« WDRLDÌ";str in g s4 * "helLo worĩđỉ**; in t n l, n2, n3, n4;n l = String,ConỊ>are ( s l , s2); / / s l * s2; n ĩ - 0
n2 « String,Cc«ĩẸ»are ( s l , s3); / / s l < s3; n2 « -1
1 3 9
n3 “ String.CortẸìaíe ( s l , s4); / / s l > s4; n3 = 1 n4 = String.CcmpareOrđinal ( s ĩ , "heilo Vỉorlđ?” );
/ / s l < s4; n4 = -32Console.WrìteLine(”nl ="+nl+"; n2 = ”+n2); Consoie.WriteLine(”n3 = "+n3+"; n4 - Console.MriteLine(String.CompareOrđinal(sl, s3>); Console.M riteLine(String.Equals(sl, s3) ) ;Console.WriteLine(String.Equais (s l , s 2 ) );Console.WriteLine(sl.CompareTo (s2) );Console.ReadLineO ;
)ì
S iK ế í quá:
n1 =0; n2 = -1 n 3 = 1 : n 4 = -32 32PalseTrue0
9.9. PHƯƠNG THỨC XÁC ĐỊNH CHUỖl CON ĐẦU VÀ CUỐI
Đổi thành chữ hoa và chữ thuởng.
Cho các chuổi s l = "Hello World";
s2 - "Hello": s3 - '^Vorld":
Phương thứt sl.StartsWith(s2); cho phép ta so sánh chuỗi s2 với từ đầu tiên củâ chuồi s l. Nếu chựng bằng nhau sẽ trả v | giá trị true. Nếu chúng khác nhau sẽ trả về giá trị false.
Phương thức sl.ToUpperO; sẻ đổi toàn bộ ký tự của chuỗi s l thành ký tự hoa.
Phương thút sl.ToLo\A«rO; sẽ đổi toàn bộ ký tự của chuỗi s l ứiành
1 4 0
ký tự thường.
c 5 Vỉ dụ 9.9.using System; c la s s STR9
{s t a t i c void M ain(strin^] args)
s tr in g s l = "Helio Woriđ"; str in g s 2 = "Hello**; str in g s3 == "Worlđ' ;Consoie .MriteLine ( s ĩ .StartsW ith{s2)); Consolô.WriteLine{sl.EndsWith(s2));Console.WriteLine ( s l .StartsWith ( s3) );Console .WriteLine .EadsWith(s3));Console.WriteLine(sl .ToUpper {)) ;Console ;WriteLine ( s l .ToLover ());Console. ReađLine ();
)
H /< ế f quổ:s ► ».
True Faise False True HELLO WORLD hello vvorld
9.10. PHƯƠNG THỨC XÁC Đ ỊN H V Ị TRÍ KÝ T ự TRONG CHUỎIĨndex0f()/ LastlndexOí0 .
Cho chuỗi s l = "Helio World";
Phương tíiức sl.IndexOf(’o'); cho ta biết ký tự ‘o’ đầu tiên trong chuỗi s l có vị trí n (tính vị trí đều tiên là 0).
141
HiUơng thút sl.LastlndexOf(T): cho ta biết ký tự ‘1’ cuối cùng của chuỗi s l có vị ừí m.
Ví dụ 9.10.using System; c la ss STRIO
{s t a t ic void Main(string[ ] args)
{str ing s l = "Hello Worlcf*;Consoĩe.VíriteLine (" Vi t r i ky tu o: " + s l . IndexOf ( ' o ' )) ; Console.WriteLine("Vi t r i 1: ”sl.LastlndexOĩ (' 1 ' ) ) ; Consoie.ReadLineO ;
^ ^ K ế t quà:
Vi tri ky tu o: 4 Vỉ tri t: 9Sau đãy lầ một ví dụ kết hí;:^ nhiểu hàm xử lý chuổi để tách một
chuỗi có dấu \ và dấu chấm (.) ứiành các mẩu có chứt năng khác nhau.
Ví dụ 9.11. using System;c la s s STRll
(s t a t i c void Main(stringt ] args)
{Console.WriteLine("Enter str ing to parse"); str ing s * Consọle.ReadLineO; str in g Drive = s.SubstringíO ,s.IndexO í("\\") ) ; s t r in g Path = s.Remove{s.LastIndexOf ) ,
s.Lengths.LastInđexO f (0"\") ) /s tr in g filename = s.Substring(s.LastlndexOí(Ễ"\")+1); string extension = filename.Substring(filename.Inde>aDf ;
1 4 2 >
Console.VỉriceLine C'Drive: f0,15) Path: { 1)\nFilename {2,12} Extension: { 3} " , Drive, Path, f ilenam e,extension);
Console. BeadLine() ;
^ ^ K ếí quả;
Enter string to parse c:\CS0807\Data\file1 ,dat Drive: c Path; c:\CS080AData Piiename: file1.dat Extension; daỉ
1 4 3
ChươNq 10. MULTITHREADINC (Đa luồNq)Luồng (threađ) là trình tự thụt hiện trong chươíig trinh. Tất cả các
chương trinh c # cho đến nay chỉ có một điểm vào (entry poiní) - hàm MainQ. Việc thựt hiện chương trình được bắt đáu vái câu lệnh đầu tiên của hàm MainO và tiếp tục cho tctí iúc phương thút đưỢc trả vể. Cấu trúc chương trình kiểu như thế này rất h(Ị^ lý cho những chii^ng trình trong đó chỉ có một trình tự thựt hiện xác định sẵn.
Khi một chương trình cần đọtì một cái gi đó xảy ra, chẳng hạn nhập ứìông tin vào, downIoad tập tin từ Internet thi toàn bộ chương trình phải chờ cho tới khi công việc đó xong xuôi rồi mctì tiếp tục chạy đưỢc. Chương trinh đift?c phân nhánh thành các chương trình con, chúng được gọi là luồng (thread).
Tuy nhiên thông thifờng một chutmg trình cần thụt hiện nhiều việc đồng thời, ví dụ. khi khởi động trình duyệt Internet Explorer flE) cần phải thực hiện ít nhất ba nhiệm vụ sau:
- Lấy dữ liệu cho trang đưa về từ E.
- Trinh bày ừang.
- Xem xét đối với bất kỳ đầu vào nào của ngưctì sử dụng và có thể chl ra rằng ngưỂtì sử dụng muốn lE làm thứ gì khác nữa.
Tinh huống tưbng tự có thể áp dụng cho bắt cứ tntòng hợp nào mà chương trình ứiụt hiện một vài việc, đổng ứictí lúc này vẫn hiển ửiị hộp thoại cho phép bạn cơ hội để huỷ bỏ nhiệm vụ hiện hầnh.
Một chương trìhh khi chạy có thể phải làm nhiểu việc đổng Hiểu ứĩuật ngữ "đồng ửỉờí" không phải là ngay cùng một th<M điểm (one
moment) mà là một khoảng thcrt gian hữu hạn. Ý tưởng về luồng (thread) có nghĩa là thụt hiện nhiều việc cùng khoảng thời gian có sự phân định tùhg mẩu thời gian nhỏ cho từhg việc C’time slice” hay là "íor a short of periođ of time"). Thông thường một máy tính chỉ có một vi xử lý và nó cũng chì làm đuọc một việc b một thời điểm nhất định. Việc một máy túih- một vi xử lý làm nhiều việc ngay lập tứt, đồng thcrt là điều vô lý, không tưởng. Chút năng "đa nhiệm" (multitasking) cũng là một cách mà luồng
144
thiít thi. Hiện nay do công nghệ phát triển của các vi xử lý nhiểu lõi (ví dụ chip vi xử lý "core 2 dua” thì tốc độ thực hiện chutttỉg trình tăng lên đáng kể và ý tưởng về "multithread" càng phát huy mạnh mẽ, Thread đã được hệ điều hành Windows áp dụng từ phiên bản Windows 9X.
Thread đưỢc quản lý bcfi lớp Thread khi thụt hiện khai báo; using System.Threading;
Sau đày ta sẽ cho một ví dụ về thread-
Ví dụ 10.1.using System;using System.Threading;c la s s ThreadApp(public s t a t i c voiđ ThreadMethodl()
trỵ
(Console.WriteLine("Threadl bat dau khoi dong"); Console.WriteLine(”Threadl dem tu 0 den 5."); fo r ( in t i = 0 ; i < 6 ; i++)(Console.WriteLine("I = i 0 , 2 } " , i ) ;Thread.Sieep(20);))catch(Exceptíon e)
1)
Console.WriteLine(”Threađl da hoan thanh.");
t/ / ----------------------------------------------- --------Public static voiđ ThreadMethod2()
try
145
{Console-KriteLine("Thread2 bat dau khci dong” ); Console.KriteLine("Thread2 đem tu 6 den l i . " ) ; for<ir.t j = 6 ; j < 1 2 ; J++)
{ConsQÌe.WriteLine("\t J = ( 0 , 6 ) ” , j ) ;Th read. s ie e p (20);
}Console.WriteLine{"Thread2 da hoan thanh.");
}catch(Exception e)
{)}//-...... ........................................ ...... ........... -
public s t a t ic void Main(string t ) args)
{ThreadStart wl = new ThreadStart(ThreadMethodl); Threadstart w2 = new ThreadStart(ThreadMethod2); Console.WriteLine{"Phuong thuc Maín tao ra cac Thread"); Thrêad t l = new Thread(wl);Thread t2 = new Threađ(w2); t l .P r io r i t y “ ThreadPriority.Highest; t2 .P r io r i ty “ ThreadPriority.Low est; t l . S t a r t O ; t 2 . s t a r t 0 ;Console. ReadLine();
i )
S iK ế í quórPhuong thuc Main tao cac Thread Threadl bat dau khoi dong Threadl dem tu 0 den 5.
1 = 0 Thread2 bat đau khoi dong Thread2 dem tu 6 den 11.J = 6 I = 1 J = 7 1 = 2
J = 8I = 3 J = 9 1=4 J = 10
1 = 5 J= 11Threadl da hoan thanh. Thread2 da hoan thanh.
Trong ví dụ trên, các đối tưcffig w l và w2 được khai báo là các đối tượng của lớp ThreadStart. Các đối tuợng t l và t2 được khai báo là các đối tượng của lớp Thread.
Phương thút Start{) dùng để khởi động các (tói tượng.
Phương thứt Thread.SIeep(20); để tạo thcrt gian frễ giũầ cốc Threadl và Thread2. Nếu tăng th<M gian từ 20 lên 1000 thi quá trinh diễn ra khá chậm (Isec) và ta có thể nhìn thấy kết quả biến đổi chậm trên màn hình. Nếu ta giảm từ 20 xuống 1 thi quá trình thay đổi rất nhanh và phương thứt Thread2 có thể bắt đầu sau vài bước tính toán của Threadl.
Bây giờ nếu ta không sử dụng phưcrtig thức Thread.Sleep{20); và bỏ qua câu lệnh vAi tiên:
t l .P r io r i t y =-ThreadPriority.Highest; t2 .P r io r ity = ThreadPriority.Lowest;
Khi đó ta sẽ có kết quả khác vcft kết quả của ví dụ 1.
1 4 7
Õ Ví dụ 10.2.* • using System;
using System.Threading;
class ThreadApp
tp u b lic s ta t ic vo id ThreadMethodl()
t r y
C onsole .W riteL ine("Threadl b a t dau khoi d o n g .");
Console.V íriteLine ("Threadl dem tu 0 den 5 .” ) ;
f o r ( in t i = 0; i < 6; i++)
íC onsole.V ỉriteLine (" I * { 0 ,2 1 " , i ) ;^
ịcatch(Exception e)
íìC onsole .W riteL ine("Threadl da hoan th a n h ." );
/ / ---------------- -— -------------------
p u b lic s t a t ic vo id ThreađMethod20
{t r y
{Console.W rìteLine("Th]fead2 b â t dau Jchoi d o n g .");
C onsole .W riteL ine(” Thread2 dem tu 6 den 11 .” ) ;
f o r ( in t 3 = 6 ; 5 < 1 2 ; j++)
{C o n s o le .W r ite L in e r \t J “ {0 ,6 ) " , j ) ;
} .
C onsole .W riteL ine(” Threaíi2 da hoan thanh.” ) ;
148
)catch (Exception e)
{1),/ —--------- ------------------------------------------------ ---------------------------p u b lic s ta t ic vo id M a in (s tr in g [ ]a rg s )
(T h read start wl = new Threadstart(ThreadM ethod l);
T h read start w2 = new ThreadStart(ThreadM ethod2);
Console.W rite L in e (" Phuong thuc Main tao ra cac Thread");
Thread t l = new Thread(w l);
Thread t2 = new Thread(w2);
/ / t l . P r i o r i t y = T h re a d P rio ritỵ .H íg h e s t;
/Z t 2 . P r io r i ty = Th read P rio rity .L o w est;
t l . s t a r t 0 ;
t 2 . s t a r t ( ) ;Console. ReadLine( ) ;
ỉ }
q u á :
Phuong thuc Maỉn tao cac Thread
Threadl bat dau khoi dong,
ĩhreadl dem tu 0 den 5.
1 = 0
1=1
1 = 2
1 = 3
Thread2 bat dau khoi dong.
7hread2 dem tu 6 den 11.
J = 6 J= 7
149
J = 8J = 9J= 10J = 11
Thread2 da hoan thanh.
1 = 41 = 5
Threadl đa hoan thanh./ / --------------------------------------------
ở hai ví dụ trên, hai phưcừig thức được sử dụng đều là các phương thííc static. Chương trình trên chuầ phải là chương trình theo phong cách hướng đối tUỢng. Sau đây ta sẽ nêu lẽn chương trình sử dụng Thread viết hoàn toàn theo phong cách hướng đối tượng.
c ? Vi dụ ỉ 0.3.usiĩig System;
using System.Threading;
c lass ThreadOOP
p u b lic vo id ThieađM ethodl()
lỊry
Ccnsol€.VvriteLine{” ?hreadl ba t dau khoi dong."-)/ C o nso le .W riteL ine(*'Threadl đem tu 0 den 5 .'*» /
* f o r U n t i » 0; i < 6; i++)
{C o n s o le .W r ite L in e n « { 0 ,2 } * ', i ) ;
Th read .S leep(20 );
)}catch(Exception e)
i)
150
Console.W riteL ine (’* Threadl da hoan th a n h ." );
)/ / ------------------------- -----------------------------------------------------p u b lic vc id ThreadMethod2 {)
í
t r y
{C o n so le -M titeL in e ("Thread2 b a t dau khoi dong .");
C onsoie,W riteL ine{” Threađ2 dem tu 6 den 1 1 .” ) ;
f o r ( in t j * 6; j < 12; j++ )
(C onsole-V íriteL ine(” \ t j= (0 ,6 ) " ò ) /
Th read .S leep (20 );
)Console.W riteLine {**Thread2 da hoan thanh.” ) ;
1
catch{Exception e)
/ / --------------------------------------------
p tib lic s ta t ic vo id M â in ís tr in g t la rg s )
íThreaciDOP ob * new ThreadDOPO;
ThreadStart wl » new ThreadS târt (ob.ThreâdMethodl) ;
Threađstart w2 « new T h rea đ s ta rt (ob.ThreađMethod2);
Console.W riteLine (" Phuong thuc Main tao ra cac Threacf*) ;
Thread t l » new T h read (w l);
Thread t2 new Thread(w2);
t l . P r i o r i t y * T h re a d P rio rity .H ig h e s t/
t 2 .P r io r i t y * Th reađ P rio rity .L o w est;
t l . s t a r t 0 ;
t 2 .^ t a r t 0 ;
151
Console.ReadLine();
iKết quà:
Phuong thuc Main tao cac Thread
Threadl bat đau khoi dong.
Theardl dem tu 0 đen 5.
1 = 0Thread2 bat dau khoi dong.
Theard2 dem tu 6 den 11.'
J = 6
I = 1 J = 7 1 = 2 J = 8
1 = 3 J = 9
1 = 4
J = 10 1 = 5 J = 11Threadl da hoan thanh.
Thread2 da hoan thanh.
ư í dụ 1 0 .4 . Sau đây ta sẽ trình bày một ví dụ về việc sử dụng Thread để tính toán các biểu thúc toán học.
Fx = 2.x.cos(15.x)
Gx = T.x^^S.sinílS.x) .
Hx = 7-x^3.tan(15.x)using System;
using System .Threading;
152
class ThreadCal
(p u b lic v c id Fx()
i
f o r ( in t i = -1 0 ; i < 16; i++ )
iC o n s o le .W r ite L in e (” Fx = { 0 : 0 . 0 0 , 2 } ” /
2 * i * M ath .C os (15* i * M a t h . P I /1 8 0 ) ) ;
T h rea d .S le ep (20 );
)C o n s o le .W rite L in e rT h re a d l da hoan th a n h ." );
}/ / ------------- ------ ---------------
p u b lic vo id Gx()
{ .
f o r ( in t i = -1 0 ; i < 16; i+ + )
{Console.W riteL ine("G x “ { 0 : 0 .0 0 ,6 ) " ,
7«i*M a th .P o w (i,3 )*M a th .S in (1 5 * i*M â th .P I/1 8 0 )) ;
T h rea d .S le ep (20 );
}Console. W riteL in e (” Thread2 đa hoan thỄưih.” ) ;
}Ị Ị ------------------------------------------------------------------------------------------------------------------
Public void Hx()
f o r { in t i = -1 0 ; i < 16; i+ + )
\
C o nso le .W riteL ine(’*Hx ■ í 0 :0 . 00,2} " ,2 * i*M a th .T a n (1 5 * i*M a th ,P I/1 8 0 )) ;
T h re ad .S le e p (2 0 );
}C onsole.W riteL ine("Thread3 da hoan th a n h ." ) ;
2D.L^TrtNH...NCA153
-----------------------------------------
p u b lic s tâ t ic vo id MainO
{ThreadCal ob = new ThreađC alO /
ThreađStart f l “ new T h re a d S ta rt(o b .F x );
ThreadStart g l = new T h reađ S tart(o b .G x);
ThreadStart h l = new T h re a d s ta rt(o b .H x );
ConsoIe.W riteLine("Ham Main tao ra cac Thread") ;
Thread t l = new T h re a d (f l) ;
Thread t2 “ new T h re a d (g l);
Thread t3 * new T h re a d (h ĩ);
t l . S t a r t O ;
t 2 . s ta r t 0 í
t S .S ta r tO ;
Console. ReađLine( ) ;
l}
S x ế í quâ:Ham Maln tao ra cac Thread
Fx= 17.322
Gx = -35000.026
Hx = -11.552
Fx= 12.732
Gx = -32475.296
Hx = -18.002
Thread2 đa hoan thanh.Threadl da hoan thanh,
Thread3 da hoan thanh.
154
ChươNq 11. Lập TRÌNh WINDOW S với c #Cũng như bộ MS Visual Studio 6.0, đối với bộ MS Visuẽd Studio 7.0
hoặc 8 .0 (chính là bộ Visual Studio.NET) đều lấy lập trinh Windows làm trung tâm. Có hai phulơng pháp chính cho việc lập trinh Windows:
- Sử dụng các câu lệnh trong khai báo.
- Sử dụng các biểu tư<; g theo kiếu kéo - thả (Controls).
n . l . LẬP TRÌNH VVINDOVVSTHEOKIỂU KHAI BÁO
Ví dụ 11.1. Tạo một củ& sổ có hai nút nhấn vdtí nhàn Print và Clear. Khi chưcfrig trình chạy, ta chưa nhấn chuột vào nút nào cả, bên phải sẽ hiến thị dòng chữ: "Message goes here ". Nếu ta nhấn chuột vào nút Print, bên phải sẽ hiển thị "Hi there", còn nếu nhài vào nút Clear sẽ xoá dòng: ”Hi there”. Cửa sổ khi chạy chưdng trình như sau đây.
t l B u t t o n . i9m
Print Ctear Hi there
Hĩnh 11.1
Đây là mã chuơng trình./* A p r in t button p r in ts a message.
• A c le a r button erases the message.
• We use a Label to ho ld the message.
• /uslng System/
using System.Drawing;
155
using System.Windows.Forms;
' p u b iic c iass ButtonPress: Forrn
Iỉ ! C reate the Controls
p r iv a te ButtOTi p r in t = new B u tto n O ; //N o te 1
p r iv a te Button c le a r = new B u tto n O ;
private Label message * new LabelO; p u b lic ButtonPress(í
!/ / Captions
Text - "B utton Press";
p r in t .T e x t = " P r in t" ; / /N o te 2
c le a r .T e x t * "C ỉe a r" ;
nessage.Text = "Message goes h e re " ;
/7 Sizes
S ize * new S iz e (3 0 0 ,2 c 0 ); '
message.Size « new S ize(m essage.PrẻferređW idth, m essage.P reíerredH eight); / /N o te 3
//L o c ả tio n s
p r in t .L o c a tio n “ neví P o in í Ỉ2 0 ,3 0 ) ; //N o te 4
c le a r.L o c a tio n .» new ?oint(3Ô + p r in t .W id th , 3 0 );
//Notife 5 ,message. Locạtion - new P o in t(40 + p r in t .V ỉid th +
c le a r.W id th , 30);
//N o te 6
/M d đ them to the fonn
C o n tro ls .A d d (p rin t); //^k>te 7
C o n tro ls .A d d (c le a r);
Controls.Add(m essage);
/ / T e i l the C lic k events which methods to c a l l
p ríftt.C X ic k + “ new EvéntH andler(1>irint_C lick);
ứ le a r .C lic k ’f » new E v ep tH an d le r{C lear_C lick );
}
156
//m ethod to make the P r in t bu tton work
p ro te c teđ v c id P r in t_ C lic k (Object sender, EventArgs e)
{/ /N o te 9inessage.Text = "H i there" ;
1
/ / method to make the C lear bu tton work
p ro te c ted vo id C le a r_ C lic k (O b je c t sender, EventArgs e)
{message.Text =
) .................................................................................../ / -----------------------------------------------------------------------------------------
sta td c v o ia MainO
A pplication.Run{new ButtonPress o ) ;
)ỉ
Phán tích chương trinh.
Đầu chưcmg trình ta phải khai báo các tệp tiêu đề: using System;
using System.Đrawing;
using ?ysteffi.Windows.Forms;
Sau đó đến việc íinh nghĩa lớp ButtonPress, íhửa kế lớp Form.
Trong lớp này đinh nghĩa 3 biến: nứt nhấn Print và nứt nhấn ơ ear thuộc iớp Button; nhãn message thuộc lớp Label.
p r iv a te Buttữn p r in t * new Button 0 Ị
p r iv a te Button c le a r * new Butt.onỉ-);
p r iv a te Lábel nressage = new L a b e lO ;
Hàm tạo của (constructor) khcrt tạo tên và gán giá trị cho các đối tượng này.
p u b lic B uttonPress{)
ỉ }
157
Trong hàm này cũng xác định kích thiíớc cho nhãn và vị trí các nút.
Để c h o Ị ^ é p nhấn nút Print rồi hiển ứìị th ôn g (fiệp, ta phải (ÍỊnh
nghĩa phương thút:p ro tec ted v o id P r in t_ C iic k (O b je c t sender, EventArgs e)
{message.Text - "H i th e re ";
}
Đ ể cho phép nhấn nút Print rổi hiển thị thông điệp, ta phải định nghĩa phưcừig thút;
pro tec ted vo id C le a r_ C lỉc k (O b je c t sender, EventArgs e)
{message.Text -
1
Trong hàm constructor còn khcrt tạo cho sự kiện nhấn nút; p r in t .C lic k + “ new E v e n tH a n d le r(P rin t_ C iic k );
c le a r .C lic k + “ new E ven tH a n d le r(C lea r_C iick );
Cuối cùng ta phải định nghĩa hàm MainO như bất kỳ chiA:ftig trình c** nào nhưhg với cáu lệnh chỉ riêng cho chiícỉng trình Windows.
s t a t ỉè v o id MainO
{Application.Run(new ButtonPress( ) ) ;
}
Qua ví dụ \ãia trình bày, để thụt hiện một vài chứt năng đơn giần như vậy mà ta cũng phải viết mă chương trình tutttig đối phút tạp.
Bây giờ ta sẽ trình bày phương pháp lập trừih Windows dụầ vào các biểu tượng kéo - thả (sử dụng Wữarđ).
11.2. LẬP TRÌNH WỈNDOWS THEO ĐlỀU KHIỄN THƯ VIỆN
Để tạo giao diện Windows, ta thực hiện các bựớc sau;
Start MS Visual Studio .NET
Chọn File Chọn New Project
Trên hừứi 11.3, chọn Vísual c # p^roị^ trong Project Types. chọn
158
Windows Application trong Templates Name. ta đặt tên: WinCalculate. Trong Location. chọn thư mục tùy ý. ví dụ CSjoshiba. Nhắn phím OK.
Từ đó ta có một cửa sổ trống.
S v í dự 11.2. Để tạo ra một giao diện theo yêu cầu trong cửa sổ trống
này ví dụ ửiLte hiện việc tính toán của hai số theo các phép tính số học: c ộ n g , trừ, nhân, ch ia lấy phần n gu yên và chìa lấy phần dư.
Xây dựng giao diện như hình 11.4, ta kéo các aều khiển tương íửig Ò hình 11.2 vào và sắp xếp theo
yêu cầu người sử dụng. Wirtdows For...Với ví dụ trên ta cố 4 Textbox; 4 Label; 2 Button; Poiní^
A Label5 RadioButton. A UnkLabel
Khi nhặp vào 2 Textbox trái và phải các số của Button
các toán hạng. Sau đó chọn một một nút RadioButton ^ MaỉnMenu và nhắn vào nút Calculate. Kết quả trong Textbox p OTeckBox
Expression sẽ hiện lên biểu thứt. chẳng hạn 5 /4 và
trong Textbox Result sẽ hiển thị 1.25. PictureBox
Để viết mã lệnh chương trình ta nhấn đúp vào
nút Calculate và sẽ có phương thút. Listìoxp r iv a te vo id b u tC a l_ C lick (o b je c t sender, u CheckedUstBox
__ _ iỀ ComboBoxSystem. EventArgs e) — Ũ s M e w
{ %: TreeVi^doubie lo - 0, ro - Ũ, tes ^ 0 ; ^TobControl^
lo = d o u b le .P a rs e (tx t lo .T e x t); ' General
ro = d o u b l e . Parse ( tx tro -T e x t) í, Hình 11 2
if(radAdd.Checked)
{res = adđ do , T O ) i
tx te x p .T e x t - ỉo .T o S tr in g (} + ’■ + " > ro .T o S tr in g 0
)e ls e i f (radSub.Checked)
159
res - subdo , ro );
txtexp.Text - lo.ToStringO + " - " + ro.ToStringO;
)
else if (radMul.Checkeđ)(res - m u l( lo ,ro );
txtexp.Text - lo.ToStringO + ’■ • * ' + ro.ToStringO ;)
else if(radDiv.Checkeđ){res - đ ỉv d o , ro );
txtexp.Text “ lo.ToString{) + '• / ” + roiToStringO ;
}else
{
res * re m ílo ,ro ) ;
txtexp.Text » lo .T o S tr in g O + " % " + ro.ToStringO;
}
tx t re su ì t .T e x t «• res.ToStringO ;ỉ
Muốn thoát khỏi chương Wnh, ta nhấn đúp vào nút Quií và viết mã chiíong trình rất đơn giản:
p riv a te voiđ b u tQ u it jr iic k (ctoject sender, System.EventArgs e)I
th is .C lò s é O ;
}
180
New P ro jec t
Proj«t Tvpe$:-I Vi9uà' BâSc Pro)ects -ỉ V/I5uei c# Pro;ects -íVisuôỉ)» Pro)ect5
' -I V(wa' c*+ Prọj«os-I Setup «nd 0«ploym«nt Proj€Cts
• - I OỬ>€f Prc;«u ' - t Studio Solutiorks
Téiìplat«:
ỉWindỡws CldỉS \Vlndo '5
Appiỉcaton Librdry Con tro,..
■>Smart ASP HET ASP-NET
D«vrce A... v»«b App... VVeb Serv.ce
•?SCO MCT
erfd(«
▼ Brovvse...
riame: VVìnCalcưlete
Locâtion: C:\CS_t05hfba
Aữd to Solution • Ciồse Soiutioriỉew Sộlưtỉon Ndme; Wir>Calculate directofy fòr Soiưtion
Pro)ect wil! be cr«At«d dt C:\CS_toshibo\WỉnColculAte\WinCalcul4tc.
J
ILess OK Cancel Help
Hình 11.3
Trong phương thút.b u tC â l_ C lic k (o b je c t sender, Sỵstem.EventArgs e)
{ )CÓ sử dựng các h àm được định nghĩa n h ư sau:
p r iv a te double add(double o p l, double op2)
re tu rn opl + op2;
)p r iv a te double sub(double o p l, double op2)
{
re tu rn opl -o p 2 ;
p r iv a te đouble rauKđouble o p l, double op2)
{re tu rn op l • op2;
ĩi.LẠp'né*i..NCA161
)p r iv a te double d iv (do ub le o p l, double op2)
{re tu rn opl / op2;
p r iv a te double rem(double o p l, double op2)
{re ta rn opl % op2;
)
Các hàm trên có kiểu double và iệnh retum{opl + op2). Phép tính đối V(S biểu ửiức o p l và op2 có thể ịà +. *, / , %.
Caicuiation
CotciẩsỉẬ
ồptímioi
•Ađđtion
^ -Sublraction
' Muftrphc«iiOft
^ /Ofv«>oo
'* Remỏinríar
r> opửfârx1
'ỉ
Qưtt
'1.:5
Hình 11.4
Trong bảng Tool Controi có khá nhiều công cụ điểu khiển.
Ta lần ìượt xét một số control điển hinh trong các vỉ dụ sau đây.
Ví dụ 11.3. Sử dụng các Textbox, Lisíbox và Button để tạo giao diện tính biểu thífc a.x^^s + b.x'^2 + c vói các hệ số a, b, c dương.
Nhấn nút Caículate để tính giá trị biểu ửiứt và hiển thị các hệ số cũng như kết quả ở các Textbox và trong Listbox. Xem hình 11.5.
162Í1-LẠí TR*#4,..NCjB
CdC thuộc tính của các điểu khiển:T e x tb c x l: Name: tbA
Textbox2: tbB
Textbox3: tbc
7^xtbox4: tbx
Textbcx 5: tbR esiỉlt
Đảt thuốc t ín h ReadOnlỵ:TrueJ
l is t B c x l : IbD isp lay
b u t to n i: b tC al
Để viết mã !ệnh cho chương trinh, tử giao diện ta nhấn đúp vào nủt Calculate và có tnẵ lệnh cho phương thút:
p r iv a te vo id b tC â l_ C lick ỉo b iec t sender, System.EventArgs e)
như đã liệt kẽ dưới đây.
Ngoài ra. ta còn định nghĩa một phuyng thút:p r iv a te Double Câi (double a, do’jb le b, doubie c, double X)
(return a* Math-Pow(X,3)+b'Math.Pow <x,2)+c;
[SQuestion 2
'3 •x“2-
• 32
CQỈCUldỉ«
Hình 11.5
163
Mã chương trinh của Vì dụ 11.3 như sau:
using System;
using System.Drawing;
using S ystem .C ollections;
using System.ComponentModei;
using System.Mindcvs• Porms;
using System,Data;
namesỆìace Exam_Question_2
Ip u b lic c lass Pomìl: System.Wir:dcws.Forms.Form
{o r iv a te System,Winđows.Forms.Textbox tbA,
p r iv â te System,Windows.Fcrms.Textbcx tbB
p r iv a te System.Windows.Forms.Textbox tbc
private Systeir..Wind0ws.F0rms.Textb0ỉ< tbResult; p r iv a te System.Windows.rcrms.Textbcx tbX;
p r iv a te System,Windows.Forms.Lcibei la b e l l
p r iv a te System.Wíndows.Forms.Label lab e l2
p r iv a te Sỵstem.Windows.Forins.Label lab e l3
p r iv a te System.Windows.Forms.Label lab e i4
private System.Windows.Fonns.ListBox IbDisplâv;
p rivace Sỵstem.Windows.Fprms.Button b tC a l/
private System.Windows,Forms.GroupBox groupBoxl; p r iv a te SysteiTì.Windows.Forms.GroupBox groupBox2;
p r iv a te System.ComponentMcdel.Container ccmponents “ n u ll,
p u b lic Forml{)
{I n i t i a l i 2eCompcnent( ) ;
}p ro tec ted o verrid e vo id Disposôíbool d isposing)
i
164
if (d is p o s in g )
{i f (components != n u ll)
1
components. Dispose 0 ;
f1base .D isp ose(d ispo s ing );
1
[ STAThread]
s t a t ic vo id MainO
(A p p lica tio n .R u n (new ro rrn lO );
)p r iv a te Double CaKdouble a , doubĩe b, doubie c , doiable x)
{re tu rn a^Math.Povííx, 3) + b*M ath .Pow (x,2) + c;
}p r iv a te vo id b tC a l_ C lic k (o b je c t sender, Sỵstem.EventArgs e)
(t r y
{doxible a = D oub le .P arse(tbA .Text) ;
double b = D o u b le .P a rs e (tb B .T e x t);
double c = Doiáỉle. Parse (tb C .T ext) ;
đoiible X = Double. Parse (tb X .T e x t) ;
i f (a > 0 && b > 0 && c > 0)
{tb R e s u lt.T e x t “ C a l(a , b , c , x ) .T o S tr in g 0 ;
s t r in g D isp laỵ = tbA .T extV ’ * ("+ tb X .T ex t+ " ''3) + "+t±)B.Text+" * ('•+tbX.Text+" ^2) + '‘ +tbC .Text+’' = " + C a l(a , b, c, x > .T o S tr in g () ;
165
IbDisplaỵ.Iteiiis.Add(Display);
}else
MessageBox.Show("a, b , c must be ia rg e r than 0 ");
)catch(Exception ex)
{MessageBox.Show(” E rro rs : ’’ +ex.I'íessage) ;
)
}))
Sau khi chạy chương trình và nhập số liệu vào các Tcxtbox rồi nhấn nút Calculate ta có kết quả như trên hình 11.5.
Ví dụ ĩ 1.4. Xây diửig một giao diện có các control: 1 HScollBar. 3 VScrollBar, 1 Texíbox, 2 Button, 4 Label như frên hình 11.6.
Khi xác đinh ứìuộc ữìh ta cần đặt giá ừi max = 50 và giá ứi min = -50 .
Các thuộc tính của các điểu khiển:
1. Textboxl: name: tb D is p la y .
2 . B u tto n l: b tC a lc u la te
3. Button2: b tE x it
4. L ab e ll
5. Label2
6. LabeI3
7. Label4
Ib lA
Ib lB
Ib lC
Ib lX
8. H S co llB arl: sbx
9. V S c ro llB a rl: sbA
10. V S cro llB ar2; sbB
11. VScro llB arS: sbC
166
iâCalcutate r:7iì 8* 15 b--22 c*15
>•-
Ex/t
Hĩnh ì 1.6.
using System;
using System.Drawing;
using System ^Collections/
using Svstem.ComDonentMođel;
u s in g Systenì.windov;s.ForTriS; using System.Data/
namespace Exain_Que£tion_3
p u b lic c iass Form l: System.Windows .rorĩTìs .Fonĩì
(p r iv d te Sy3t;em.Windows.Forms.GroupBox groupBoxl;
p r iv a te System.Windows.Forms.GroupBox groupBox2;
p r iv a te System.Windows.rorms,Button b tC a lc u la te ;
p r iv â te System.Windows. Pcrm s.VScrollBar sbA
p r iv â te Syst€m.Windows.Forms.VScrollBar sbB
p r iv â te System.Windows.Forms.VScrollBar sbC
p r iv a te System.Windows.Forms. HScrollBar sbx
p r iv â te System.Windows. Forms. Label Ib lA
p r iv â te System.Windows.Forms, Label Ib lB
p rivace System.VíindoKs.rorms.Label Ib iC
167
p r iv a te System.Windows.Porms. Label Ib lX ;
p r iv a te System.Windows.Fonns.Textbox tbD isp lây ;
p r iv a te System.Windows.Forĩns.Button b tE x it;
p r iv a te S y s te r. ComponentKodel. Container
components = n u ll;
p u b ĩic PormlO
(I n i t i a l i 2eComponer.t ( ) ;
1p ro tec ted o verrid e vo id Dispose(bool disposing)
í
i f (dispcsing)
(i f (components !® n u ll)
íccmponents- Dispose{ );
)}base.D ispose(d isposing );
}#.region Windows Form Designer generated code
lendreg ion
[ STAThread]
s t â t ic vo id MâinO
A pplication .R un (new F o rm lO );
)p r iv a te double c a l ( in t a, in t b , in t c , i n t X )
{re tu rn (a*M ath.Pow {x,7 )+b*M ath.Pow(x,3 ) + c );
)private void btCalculate_Click(<±>ject sender, Systan.EventArgs e)
168
(in t a =» sbA.Value;
i n t b = sbB.Value;
in t c = sbC.Value,-
i n t X = sbX.Value;tb D is p la y .T e x t = a .T o S tr in g ()+" * " + x -T o S tr in g O +"'■T'+'• +
’■ +b .To S trin g ( )+ " * ’’ +x .T oS tring 0 +" '3" +" + c .T o S trin g () +■' = " + c a l(a , b, c , x) .To S trin gO ;
I
p r iv â te vo id Forml__Load(object sender, System.EventArgs e)
IIb iA .T e x t = "a = " +sbA .V alue.ToS tring0 ;
Ib lB .T e x t = "b = ‘'-tsbB .V alue.ToS tringO ;
Ib lC .T e x t = ” c = ■'+sbC.Value.ToStringO ;
Ib ỉX .T e x t = "x = '•+sbX .V alue .To3tringO ;
)p r iv â te vo id sbA _S cro ll(ob ject sender,
System.Windows. Forms. ScrollEventArgs e)
Ib lA .T e x t = "a = "+ sb A .V a lu e .T o S trin g 0 ;
1p r iv â te v o id s b B _ S c ro ll(o b je c t sender,
System .W indows. Forms. S c ro llE ve n tA rg s e)
{ib lB .T e x t = "b = *'+sbB .V alue.ToS tring<);
}p r iv a te v o id s b C _ S c ro ll(o b je c t sender,
System .W indows. Forms. S c ro llE ve n tA rg s e)
{Ib lC .T e x t = "c = "+ s b C .V a lu e .T o S trin g {);
I
p r iv a te v o id s b X _ S c ro ĩl(o b je c t sender,System . Windows . Fornis. S c ro liE v e n tA rg s e)
169
{Ib lX .T e x t = "X = "+ s b X .V a lu e .T o S trin g O ;
}p riv a te void b tE x it_ C lic k (o b je c t sender, System.EventArgs e)
Close ( ) ;
))I
Ví dụ 11.5. Sau đây ta sẽ trình bày một ví dụ về giao diện nhập dữ liệu từ các Textbox và thực hiện các nhiệm vụ:
- Nhấn vào nút Add, dừ liệu từ các Textbox sẽ điíỢc chuyển sang
Listbox-
- Nhấn nút Ciear để xoá thông tin trong các Textbox.
Trước hêi ta phải chọn một hàng (bản ghi) bất kỳ trong Listbox, sau đó nhấn nút Remove, bản ghi vítì chọn sẻ bị xoá khỏi Listbox.
- Thoát khỏi chương trình, nhấn nút Exit.
Giao diện được trình bày như hình 11.7.
Các thuộc tính điều khiển như sau;
1. Textboxl: Name tbName
2. Textbox2 tbAge
3. L ab e ỉl IbName
4. Label2 IbAge
5. l is tB o x l g iữ nguyên
6. b u tto n l butAdd
7. button2 butRemove
8. button3 b u tc le a r
9. button4 b u tE x it
a.LẬPTlriNH..NCB
t a p o r m l
Name
|Van
Age
!3C
Nanie Ha .Age 25 Nôme Môi . Age 32 Name Nga . Age 29 Name Von , Age 30
Add Remove Clear Exit
Hình 11.7
Mã chương trinh cùa ví dụ trên được trình bày như sau,using System;
using System.Drawỉng;
using S ystem .C ollections;
using System,ComponentModel;
using System.Window5. Foms;
using System.Data;
namespace wini4DpListBox
í/ / / <summary>
/ / / Suímary d e s c rip tio n fo r Forml.
ỉ I I </sunsnary>
public class Forml: System.Windows. Forms. Form
p r iv a te System.Windcws. ronns .Label IbHame;
p r iv a te System,Windows.Forms,Listbox l is tB o x l;
p r iv a te System.Windows.Foms.Textbox tbName;
p r iv a te System,Windows.Forms.Label IbAge;
171
p r iv a te System.Windows. Forms.Textbox tbAge;
p r iv a te System,Windows,Forms.Button butAdd;
p r iv â te System.Windows.Forms.Button butRemove;
p r iv a te System.Windows. Fontis *Button b u tc ie a r;
p r iv a te System.W indows.Fom s.Button b u tE x it;
I I I <summary>
I I I Required designer variable.
I I I </summary>
private System.ComponentModel,Container components « null;
p u b iic Form l()
{//R e q u ire d fo r Windows Form Designer support
In itia lizeC o m p o n e n t 0 ;
//TODO: Add'any co n stru c to r code a f te r
//InítializeCoiTìponent call
}// <5urTĩTvary>/ / Clean up anỵ resources being used.
/ / </summarỵ>
p ro te c ted o v e rrid e v o id D ispose(bool đ isposing)
if(đ is p o s in g )
I i f (corrponents !* n u l l )
components. Dispose ( ) ;
bâse, D isp o se(d isp o s in g );
)I I I <sưmmary>
I I I The main e n try p c in t fo r th e a p p lic a tio n
172
/ / / </sumniary>
( STAThread]
s t a t ic vo ic MainO
{A pplication.R un(new F o rm l());
}p r iv a te vo íd butAdđ_Click(object sender, System.EventArgs e)
s tr in g s l » '*Naine: '*+tbNam e,Text+'\‘ Age: " +tbA ge.Text; l is tB o x l . Item s. Add (s l) ;
)p riv a te void tutR«ove_Click(d:>j€Ct sender, SystOT.EventArgs e)
{l is tB o x l . Items .RemoveAt ( l is tB o x l . S e le c te d ln d e x );
)p riv â te void b u tE x it^ C lick (o b jec t sender, System.EventArgs e)
{Close ( ) ;
)p riv â te void butC lear_C lick(object sender, System.EVentArgs e)
(tbNmae.Text “
tbAge.Clear 0;
S v í dụ 11.6. Hãy xây dựhg một giao diện Windows để tính số ngày và số chủ nhật nếu nhập ngày/ứiáng/năm từ điều khiển dateTimePickerl (ngày bắt đầu) đến ngày/ửiáng/năm trong điều khiển dateTimePicker2 (ngày kết thúc).
Giao diện biểu diễn trên hình 11.8.
173
Các thuộc tính cfiểu khiển như sau:1. Labell:Name s ta r t Dâte
2. Lâbel2 End Date
3. LabeI3 số ngày Ibnumday
A. Label4 sổ ngầy chủ nhát Ibnumsunday
5. b u tto n l Show(Text); butShow (naine)
6. button2 E x it (T e x t); b u tE x it (nanie)
7. dateTim ePickerl
8. dateTirĩíePlcker2
Trong phương thút:
p u b lic vo iđ butShow_Click(object sender, System.EventArgs e)
í )
Có sử dụng lớp TừneSpan để lính số ngày giũa hai mốc thcrt gian:TiiTìeSpan t * DateTime, Parse (đateTim €Picker2.
Value.ToS hortD âteS tring ị ) ) * DateTime. Parse (d â teT im eP ic ke rl. Value,ToShortD ateS tring ( ) ) ;
using System;
using System.Drawing;
174
usiny S ystem .C ollections;
using Sỵsteni.ComponentModel;
using System.Winđows.Forms;
'js ing .'"ystem. Data;
namespace CaiendarP icker
I
p u b lic c lass Forml: System.Windows.Forms. Form
{p r iv a te System.Windows.Forms.Label la b e i l ;
p r iv a te System.Windows.Forms.Label la b e l2 ;
p r iv a te System.Windows.Forĩns.DâteTinìePicker dateTiroePickerl;
p r iv a te System.Winđcws.Forms.DateTimePicker dateTimePicker2;
p r iv a te Sỵstem.Windows.Forms.Label Ibnumday;
p r iv â te System.v-:indows, Forms .Label Ibnumsunday/
p r iv a te System.Windows.Forms.Button b u tE x it/
p r iv a te System.Windcws. Forms. Button butShow;
p r iv a te System.CoĩTiponentModel.Container components ® n u ll;
p u b lic Form l()
In it ia liie C o m p o n e n t0 ;
}p ro tec ted o v e rrid e v o id D ispose(bool disposing)
i
if(d is p o s in g )
(i f (components != n u li)
ícomponents.Dispose( ) ;
)}b ase .D isp ose(d ispo s ing );
ì
175
tre g io n Windows Form Designer generated code
[ STAThreađ]
s t a t ic vo id MainO
{A p plica tio n .R u n {new F o rm l());
)p riv a te void b u tE x it_C lick (o b jec t sender, System.EventArgs e)
{th is .C lo s e {);
)p riv a te vo id butShow_Click(òbject sender/ System.EventArgs e)
{TimeSpan t » DateTime.Parse (dateTin ìeP icker2.Value.
ToShortD ateString ( ) ) - DateTime. Parse (dateT im eP ickerl .V a lu e . ToS hortD ateS tring0 ) ;
DateTime ts ® DateTiir.e,Parse (đ a te T im e P ic k e rl.T e x t);
in t numSundaỵ * 0;
i f (ts .D ayO fW eek.ToString() = * "Sunday*')
numSunđay++;
f o r { in t i ® 0; i < t.D a y s ; i++ )
íts - ts.AddDays(1 .0 ) ;
i f (ts .DayOfWeek. ToS tring () “ "Sunday*^}
nuinSunday++;
1
Ibnumday.Text * "So ngay * " + t . D ays.ToStringO ;
Ibnumsunday. Text = "So Chu nhat * ” +iìum Sundaỵ.ToString();
}
ựị áụ 11,7. Đây ià một ví dụ đặc biệt có nhiệm vụ phải íạo mộí class, ví dụ có tên là "cStrX" trong đó định nghía hai phưcfrig thức:
176
Phương thứt thứ nhất dùng để cắt từ đầu tiên của một chuỗi. Ví dụ có chuỗi nhập vào: s l = "Ha noi Viet Nam" thi sau khi phương thức này hoạt động, ta chỉ thu đuợc chuỗi con: "noi Vlet Nam".
Phương thửc thứ hai dùng để cắt từ cuối cùng của chuỗi. Ví dụ chuỗi s l , sau khi phương thứt này hoạt động, ta thu được chuỗi nhỏ: "Ha noiViet",
Trên hình 11.9, sau khi nhập Textboxl: "Ha noi Viet Nam",
Sau đó nhấn nút CutLastWord, ở Textbox2 hiển thị; "Ha noi Viet". Từ cuối cùng "Nam'' đã bị cắt (S.
Example ...
(ÌHaTĩcM Nem
Ho noi Viet
CutFirstWord CưtL8$ỉWord
Hình 11.9
E)ộ dài chuỗi bắt buộc phải lớn hơn 10.
Các bước tạo giao diện và thuộc tính cắc dều khiển như sau.
1. Textboxl
2 . Textbo>{2
3. B u tto n l: CutFirstW ord (T e x t); btnCutFirstW ord (Name) '
4 . B utton2: CutLastVíorđ (T e x t) ; btnCutLastVíord (Name)
Sau khi thiết lập xong giao diện, ta mở cCfâ sổ code và chọnsubmenu: Project Add Class (hình 11.10).
23.kẠP7m H.. NCA177
'• w »no ,'-_ i3« _w • M icrosort Visuai Lf .N t i [đe iign) - F on n l.cs
pT0j«c: Ễui>a Ồf9ỉq ĨGQts ỈVư«o>« h«p
Ẫ A90VV.()9ow( om. í ĩ • â • B f l f Ađd Ịnhệfrt«t hm .. • Ạ
Tf>** Ặ > J Add>j5rCoftĩr9l.. , F o m ỉ^
OỉpboệrtRmg I Ad(5h»w ití4C«r» ..
Or«*9f L AdjCfir«cncrK..
Povnr H MdOm...- AđđỈỆMỆ.. CW*5 't-A
AOS ỉt if t It«n. Sn
Exdk»đ«FrQnPr9ỉ«t ;■ SpicwA:|Fiì«
^OJMl AũC c%m.. Ad3'A’ệb rtnce ĩe.ỆiUePnyữ
* At»t.WPTOp«ês...
V*|IWI *%fiflrr 3 X^ íữiC«íí5Wofs C< 3 itsr»eivỉ»T.8vt( ♦ «
,*Scỉưton ^ Mas: ♦ :'WiMi.F.Uit_w
- A » co
: A&ỉenbiyỉn^ csr' C$7X.«ĩ orrnl.cs
rt’«n iỴiitL &vtcU:;i <1
\9'.\ Bw; t.\ .08 *j:iit '.:r\i
»3 X
è ' t v . % K to & ưx ĩ 11«
. s ta r t; ' « Wnd n .
ỉP*roí» ê:,ri.1.01‘í o.
Hình 11.10
Sau đó ta có CÙ& sổ mcí (hình 11.11). ừong Textbox có nhãn Name,
ta đặt tôn: cSírX rồi nhấn nút Open và gò các dông lệnh như mã lệnh sau.
Trong mã ]ệnh chubng hinh này, ta đính nghĩa hai phuơng thút;
p u b lic s t r in g C utF irstW ord() { )
pubỉic str in g CutLastWord{) { }
ChiAiừig trình chi tiết đưọc trình bày sau đây:
178
Add New item - W ind_F_Ust_W
' J LôCâi Pro’ect Items
An «mpty clasỉ on
cS?X,c$
using System;
p u b iic c iass cStrX
(p r iv a te s tr in g s t r ;
p u b lic 'cStrXO
s t r * ;
/ /
Tempac ; n i.
W fn^vs ciess Co*npo»>eit Pôrm Cass
I sVự s« fC ô W i Déta ^©rm ^ t ô S e t
Wizard
XMi. Pl€ÃxVl
kvna
éCd0< ^ỉ«
C u s to n HTM L Pàge ỉnhcrit«d ^
Osen Cdncel H«ip
Hình 11.n
p u b lic vo id In i t ( s t r in g ss)
s t r = ss;
/ /p u b lic s tr in g C utF irstW ord()
I
179
s t r * s t r ,T r im S ta rt ( ) ;
in t pos * s t r . IndexO f( ' ’ ) ;
i f (pos > 0)
re tu rn s tr .S u b s tr in g (p o s ).T r im S ta rt 0 ;
else
re tu rn s tring .E m pty;
* /s tr in g s l = ;
i T ì t i * 0;
i • s tr .In d e x O f r '•) + 1;
s l « str.R em ove( 0 , i ) ;
r e t u r n ( s l ) ;
)p u b lic s t r in g CutLastWord ()
{/ * s t r ® s tr ,T r im E n d {);
in t pos * s tr .L a s tIn d e x O f(* * ) ;
i f (pos > 0 )
re tu rn s tr .S u b s tr in g (0 , pos).Trim End{);
e lse
re tu rn s t r ;
* /s tr in g s l ;
i n t i • 0;
i * s t r .LastIndexO f C’ * ');
s l * s tr.R e m o v e (i, s tr.L e n g th - i ) ;
re tu rn s ĩ ;
Khi viết xong mã lệnh như đâ liệt kẽ ờ trên, ta quay trở về Windows Form như hinh 11.9. Bây giờ ta viết tiếp mă lệnh cho cửa sổ này nhờ việc nhấn đúp vào nứt CutFirstWord và nút CutLasíVVord như ở dưdí đây.
180
using System;
using System.Drawing;
using S ystem .C o llec tíon s;
using System•ComponentMođel;
using System.Windows. Forms;
usíng System.Data;
public ciass Forml: System. Windows .FonriS •Form
(private Sỵstein.Windows. Forms .Textbũx Textboxl;
p r iv â te System.Winđows• Forms.TextboK Textbox2;
p r iv a te System.Winđows .Form's .B uttôn btnCutFir'stW ord;
p r iv a te System.Windows.Forms.Button btnCutLastWord;
p r iv a te System.ComponentModei.Container components =« n u ĩ l ;
p u b lic Form l()
(In it ia liz e C o r Ị5 o n e n t 0 ;
}p ro te c te d o v e rriđ e vo iđ Dispo^e(bool đisposing)
i f (d is p o s in g )
{if(com ponents n u il)
{c o ữ ĩ p Q n e n t s . D i sposê ( ) ;
base. Dispose (d isp o s in g );
)Ire g io n Winđows Form Designer generated cođe
[ STAThreađì
s t a t ic v o id MainO
181
A pplicâtion .R un(new F o rm l( ) ) ;
}/ / -------- ------------------------------------
p r iv a te v o id b tn C u tF irs tW o rd _ C lic k (o b ^ e c t sen d er, System .EventA rgs e)
íi f (T e x tb o x l.T e x t.L e n g th < 10)
íMessageBox.Show(” Do d a i chuoi b a t buoc lon hon 10!” ) ;
re tu rn ;
)e lse
{cStrX ms = new c S trX { ) ;
m s .In it { T e x tb o x l.T e x t) ;
Textbox2. Text = m s .C u tF irs tW o rd ();
í
1/ / ------------------------------- ---------- --
p r iv a te v o id b tn C u tL a s tW o rđ _ C lic k (o b je c t sen d er, System .EventA rgs e)
Ii f (T e x tb o x l.T e x t.L e n g th < 10)
(MessageBox. Showỉ"Length must not iess than 1 0 !" ) ;
re tu rn ;
}e lse
{cStrX ms “ new c S trX O ;
m s .In it (T e x tb o x l.T e x t ) /
Textbox2. Text = ms. CutLastVỉord ( ) ;
)
182
Vi' dụ lỉ.OTrong Windows Form, ta có thể xây đựhg chite/ng trình để xử lý chuỗi. Hãy nhập một chuỗi vào Textbox. Sau đó nhấn vào nút Process. trong các Textbox sẽ hiển thị:
- Số lượng các dấu cách {space bar).
- Số lượng các nguyên âm a.
- Số lượng các nguyên âm e.
- Số iưtmg các nguyên ám i.
- SỐ lượng các nguyên àm o.
- Số lượng các nguyên âm u.
• Hiển thị các ký tựđâ lọc bỏ tất cả các nguyồn âm.
- Hiển thị chuỗi ký tự yÁíò nhập theo chữ in hoa.
- Đẳo ngược các kỷ tự từ cuối lên đau.
Thuộc tính các điều khiển:1. L a b e li: In p u t S tr in g (nhâp chuỗi)
2 . L a b e ll: W ithout vowel (không c6 nguyên âm)
3. Lab€l3: ToUpper Case (chữ in hoa)
4 . Label4; Reverse (đảo ngược các ký tự của chuỗi)
5. LabelS: space
6. Label6: a
7. Lâbel7 ĩ e
8 . LabelS; i
9. Label9: o
10. LabellO : u
11. T e x tb o x l: tB in p u t
12. Textbox2: tBW ithout
13. Textbcx3: tBupper
14. Textbcx4: tBRev
15. TextboxS: tBsp
183
16. Textboxô: tBa
17. Textbox7: tBe
18. TextboxS: tB i
19. Textbox9: tBo
20 . TextboxlO: tBu
21 . Button: P ro c e s s (te x t); butProcess (Name)
Giao diện đưỢc tạo ra như hình 11.12.
tsporm lInpvt Stnng
Ha noỉ Hue Soi gon Prỡcess
WlthootVowel Space 4H f>H Sgn
To ư ^ rC s s ea 2e 1
HANOIHiJESAIGON 1 2
0 2
nogisS eoH(Of) dH^ .
Hình 11.12
Khi viỗlt mà lệnh chương trinh, ta cần phải khai báo tệp tlẻu để:using S y s ta n .T e x t. RegularExpressions; *
Có như vậy trong chubng trình ta ĩDỚi sử dụng được Icfp Regex.
Sau đây ỉà toàn bộ mã chiítftig trinh của ví dụ trên.using System;
using System. Dravíing;
using S ys tem .èo liec tio n s;
using System.ConponentModel;
usá;ng Systen>.Windows.FonTis;
ISA
using System .Text.RegưlarExpressions;
using System.Data;
namespace W indowsApplicationl5
{p u b ỉic c la s s Formi: System.Windows.Fonns.Form
{p r iv a te System.Windows .Fom s .Label lâ b e l ĩ
p r iv a te System.Windows. Forms. Lâbel lâb e l2
p r iv a te System.Windows.Forms.Label Ĩâ b e i3
p r iv a te System.Windows. Form s.Label lab e i4
p r iv a te System.Windows.Forms.Label la b e is
p r iv â te System.Windows.Forms.Labei la b e iẹ
p r iv a te System.Windows. Foriĩìs .Label la b e l7
p r iv â te Systenì.Winđows,Foritìs.Label la b e is
p r iv a te Sỵstem.Windows.Forms.Labei la b e l9
p r iv a te System.Windows. Forms.Label la b e llO ;
p r iv â te System.Windows.Porms.Button butProcess;
p r iv a te System.Window3,Forms.Tex;tbox tB in p u t;
p r iv a te System•WindoWs.Forms.Textbox tBRev;
p r iv a te System.Window5.Fonns.Textbox tBW ithout;
p r iv a te System.Windows*Forms.Textbox tB i5>ựer;
p r iv a te System.Windows.Fonns.Textbox tBsp;
p r iv a te Systern*Window6*Forms.Textbox tBa;
p r iv a te System.Windows.Fomis-Textbox tBe;
p r iv â te System.Windows .Forms. Textbox tB i;
p r Ịv a te Sỵsteiĩi.WirKỈows ,Fornìs .TextboK tBo?
p r iv a te System.Windows.Forms.Textbox tBu;
p r iv a te System,ComponentModel.Container components = n u l l ;
p u b lic ro rm lO
(I n i t i a i i 2eCompohent( ) ;
iiL Ạ p ifỉm ..ìic 'A185
p ro te c ted o v e rrid e v o id D ísposeíbool disposing)
{ìf (d is p o s in g )
{i f (components != n u ll)
{components. D ispose( ) ;
base. D ispose(d isposing);
)[ STAThreađj
s t a t ic vo id MainO
A p p lic a tío n .Run(new Form l( ) ) ;
/ /
p r iv a te s tr in g s';
p r iv a te in t myNurrử3erOfAEIOU(string a)
íRegex l e t t =*new Regex(a,R egexồptions.IgnoreC ase);
re tu rn le tt.M a tc h e s (s ).C o u n t;
1/ y ------------------- — -------------------
p r ív a te in t myNumberOíSpace0
{Regex l é t t =• new Regex {” " );
re tu rn le tt .M a tc h ẹ s (s) .Covint;
1/ / -----------------------------------------
»
p r iv a te s t r in g myToupperO
ị
2iLẠrTniMi...rKB
s tc in g s l = s ;
s l = s l . ToUppet( ) ;
re tu rn s l;
}/ /
p r iv a te s tr in g m yFilterAEIOƯ ()
ís tr in g s l = s;
s l = s l.R e p la c e C a " ,’” ')
s i = s l.R e p ^ a c e re " ," " )
r l = s l .R e p la c e r i " , ’” ’ )
s l = s l .R e p la c e r o " / '" )
s l = s l.R e p la c e C u " ,”" )
s l = s l.R e p la c e {"A " /” ')
s l = s l.R ep iace
s l = s l .R e p ia c e r i" ," " )
s l = s l.R e p la c e rO ” , ”" )
s l “ s l.P e p la c e r ư " ," " )
re tu rn s l;
/ /p r iv a te s tr in g Reverseí)
{s tr in g s l = ;
f o r ( in t i = s.Length - 1 ; i >“ 0; i — )
s l “ s l + s[ i ] ;
re tu rn s l ;
)/ /private void butProẹess^Click (<A>ject sender, System.EventArgs e)
187
s « tB in p u t.T e x t;
tB a . Text = mỵNumberOíAEIOU â” ) . To S trin g ( ) ;
tB e .T ex t = myNumberOfAEIOU{’*e" ) .T o S tr in g 0 ;
tB i.T ộ x t = mỵNumberOfAEIOU r i" ) -T cS trin g 0 ;
tB o .T ext “ myNumberOíAEIOUo” ) .T o S trin g O ;
tB u .Text = myNumberOíAEIOUí” ư*) .T o S tr in g () /
tB sp .Text * rayNumberOfSpace{) .T o S tx in g ( ) ;
tBVíithout .T e x t * myPilterAEIOU 0 ;
tBRev.Text * R everseO ;
tBupper.Text » myToupper();
}
1
)
S v í dụ 11.9. Hãy tạo giao diện như hình 11.13. Nhập một chuỗi ký
tự vào Textbox. Sau đó nhấn nút Process ta có kết quả hiển thị trong các
Tẹxtbox còn lại^vcrt các yêu cầu như sau;
- Đếm số từ trong chuỗi vừa nhập.
- Đếm số ký tự viết hoa (in hoa).
- Cắt từ đầu chuỗi.
• Cắt từ cuối chuỗi.
- Cắt các tự ở vị trí lẻ.
- Cắt các ký tự ở vị trí chẳn.
- Thay thế các ký tự lẻ bằng đấu cách.
- Thay thế các ký tự ở vị frí chẵn bằng dấu cách.
Mã lệnh chương trinh điA?c liệt kê dưới đây.
Ví dụ 11.9 cũng có thể xem là một bài tập dài. Các bạn có thể xây
dựhg giao diện như hinh 11.13. Sau đó tự tìm hiểu mã lệnh đã liệt kê để
có thể làm iại từ đầu.
188
Couri wvd numbH CmCtìor Odl
iZo<irị capirai \M nuribec [2
C u tf rsl vrjfd
Cui Oìar £y»r
[nc4\rietneT
Hộrtnm
Repểỡce c hột Ođd H_ 'õ _ u n_ni
C\M la ỉl Dvord -♦tì noiV*®1 R ep ỉù ce CÍầ«i E V€fi ® n I V _ a
PracHS Exd
Hình 11.Ì3
using System;
□sing System.Drawing;
using S ystem .C o llection s;
using System.ComponentModel;
using System.Windows.Forms/
using System.Data;
namespace process_string
{p u b lic c lass Porrol: Systerĩì,Windows.ForTns.Form
p r iv a te System.Windows.Forms.Label la b e l l ;
p r iv â te System.Wỉndows.Forms.Textbox tx t in p u t;
p r iv a te System.Windows.Forms.Label la b e l2 ;
p r iv â te System.Wỉndows.Fonns.Label lâ b e l3 ;
p r iv a te Sỵstem.Windows.ForĩĩìS.Label la b e l4 ;
p r iv a te System.Windows.Form5.Label la b e lS ;
p r iv a te System.Windows.Forms.Textbox txtcw n;
p r iv a te System.Windows.Foms.Textbox tx tc c ln ;
189
p r iv a te System*W£adows.Fonns*Textbox tx tc fw ;
p r iv a te System.Winđows. Forn\s.TextlDx tx tc lv ;
p r iv a te System.W indows,Forms.Label la b e l6
private Sỵstem.Windows.ForTĩìS.Labei label7
p r iv a te System.Winđows. Form s.Label la b e is
p r iv a te System.Windows. Form s.Lâbel la b e is
p r iv a te Sỵstem.W indows.Fonns.Button butProcess;
p r iv a te Sỵstem.W indows.Forms.Button b u tE x it;
p r iv â te System.Windows, Form s.Textbox tx tc c o ;
p r iv a te System.Windows. Fom s .Textbox tx trc o ;
p r iv a te System.Windows,Fornis-Textbox tx t r c e ;
p r iv a te System.Windows. rorm s.Textbox tx tc c e ;
p r iv a te System.ComponentModel-Container components = n u l l ;
p u b lic Form l()
In it iâ liz e C o m p o n e n t( ) ;
}s t â t i c ‘ v o id M ainO
(A p p lica tio n .R u n (new F o m l { ) ) ;
)int i “ 0;p riv a te vo id b u tE x it_ C lic k (o b je c t sender, System.£ventArgs e)
{th is X lo s e 0 /
)priva te VDid butProcess_Click(<á3ject sender, System.EventẰrgs e)
{i n t cwn “ 0;
i n t cc ln “ 0 /
s t r in g s in p u t » tx t in p u t .T e x t ,T r im ( ) /
sinput * Standard(sinput);
190
fo r ( i » 0; i < s in p u t .Length;
{i f (sinputí i} ' *)
(cwn++;
}í f (char-IsU pper (sinput( i) ))
{ccln++;
tx tcw n .T ext » c w n .T o S tr in g ();
tx *""c ln .T ext * c c j.n .T o S trin g ( ) ;
tx tc fw .T e x t » c u t_ f irs t_ w o rd (s in p u t) ;
tx tc lu .T e x c * c u t_ ia s t_ w o rd (s in p u t);
tx tc c o .T e x t ® cu t_char_od cH sin pu t);
tx tc c e .T e x t * c u t_ c h a r_ e v e n (s in p u t);
tx trc o .T e x t « re p lâ c e _ c h a r_ o d d (s in p u t);
tx trc e .T e x t « replace_char_^even (s in p u t ) ;
)private string Standard(string sinput)
(fo r ( i =» 0; i < s in p u t. Length/ i+ + )
i f (sinputl i] “ ' *)
i f (sinput( í+1] “ * ’ ) t
{s inp ut = sinput.RernoveCi + 1, 1 );
í - - ;
re tu rn s inp ut;
191
}p r iv a te s tr in g c u t_ f irs t_ w o rd {s tr in g s)
{i * S.lndex0f(" " ) + 1;
scfw « s.Remove( 0 , i ) ;
return scfw;
}p r iv a te s tr in g c u t_ la s t_ w o rd (s trin g s)
ís tr in g sclw ®
i =» s , L a s t I n đ e x O f ” ) ;
sclw * s.Remove(i, S-Length - i);
retư rn sclw;
1
p r iv a te s tr in g cut_char_od d{string s)
{s tr in g scoc « "” ; / /s a v e a i l even char
i = 0;
fo r ( i » i + 1; ỉ < s .Length; i+ ® 2)
3COC+ = sí i ] ;
re tu rn scoc;
1
p r iv a te s t r in g c u t_ch ar_even (s trin g s)
ỉs t r i n g sG êc =
f o r ( i * 0; i < s .Length; i+ ** 2)
{scec.+ » ^ i] ;
}re tu m scec/
}p r iv a te s t r ỉn g rep lace_ch ar_o dđ {s trin g s
192
s tr in g srco = ;
charl ] s l = s.TcCharArray ( ) ; .
f o r ( i “ 0; f < s l.L e n g th ; i++>
ii f ( i % 2 != 0)
{sl[ i) =
1
srco+ = sl[ i) ;
1re tu rn srco;
Ip rivace s tr in g rep lace_ch ar_even(s tring s)
Ichâii ) s l = s.ToCharArraỵO ;
s tr in g srce =
f o r ( i = 0; i < s l.L e n g th ; i++)
\
i f ( i % 2 *= 0)
sĩ[ i] =
srcÊ-r = sl[ i j ;
}re tu rn scc©;
2S.LẬP'’mk*4...MCA193
ChươNq 12. Đồ hoẠ TRONq WiNdow5Đ6 hoạ trong Windows khá phong phú. ỏ đây ta f hỉ xét một vấn đề
đơn giản nhất là vẽ đồ thị các đưòng cong, các hình, tô màu các hình và viết chữ lổng vào trong hình vẽ.
Khi thực hiện vè đồ thị trong môi trường Windows của c^ . đầu mồi chương trình ta phải thêm vào các tệp tiêu đề:
using System?
using System.Drawing;
using System.Drawing.Drawing2D,•
using System .Drawing.Text;
Ngoài ra còn các tệp tiêu đề có sẵn khi ta tạo Windows Form.
12.1. VẺ ĐỒ THỈ CÁC H ÌN H VÀ CÁC ĐƯỜNG CONG
Các đồ thị có thể vẽ trong Panel đặt ở ừong Form.
Nhấn đúp vào Panel này ta có phương thút sau: p r iv a te vo id p a n e ll_ P a in t(o b je c t sender,
System. Wí ndovỉs. Forms. PaintEventArgs e )
ì 1Công cụ chủ yếu để vỗ hình trong Winđows ià sử dụng các phưcỉng
thúc thuộc lc ) Pen (bút vẻ).
Khai báo bút vẽ:Pen penl = new Pen{Color. DarkGreen,3 );
Trong đó màu đưỂftig cong được chọn tùy ý theo mã' màu thư viện khi ta gỗ dấu chấm sau từ Color; số 3 thể hiên độ dày của nét vẻ-
Trong một chương trình muốn thay đổi màu ta chỉ cần viết; p e n l.C o lo r = Color.Red;
Các toạ độ điểm cần vỗ luôn luôn phải là số nguyên. Nếu khi tính toán ta có số float hoặc double, ta cần phải chuyển kiểu về số nguyên.
Các phiwng thứt ứĩư viện để vẽ các đường cong và hình khác nhau được ừình bày điển hình sau đây.
ỈS.LẠ|>TMW...NCA194
1. Vẽ đường thẳng từ điếm có toạ độ (xl, y l) đến điểm (x2. y2);e.G raphics.D raw Line(penl, x l , y l , x2, y2 );
2. Vẽ hình chữ nhật vctì toạ độ điểm góc trên trái (xl. y l) và toạ độ điểm góc dưới phải (x2, y2):
e . G raphics. DrawRectangle (pe i.:, x l , y l , x2, y2);
3. Vẽ hinh Eliipse có tâm (xl. yl), bán trục đúhg h, bán trục ngang W:e .G ra p h ics .D raw E llip se íp en l, x l , y l , K, h );
4- Vẻ đường tròn giống như vẽ đường Ellipse nhưng chỉ cần cho giá trị bán trục đứng bằng giá trị bán trục ngang w * h;
5. Vẽ cung cong theo hình Hiipse (hình tròn)e.G raphics.Draw Arc(penl, x l , y l , x2, y2, startAng, e dAng);
Trong đó (xl. y l) !à điểm góc trên trái, (x2. y2) là điểm góc duớl phải của hinh chữ nhật để cung tròn nội tiếp bên trong hình chữ nhật này
Khi viết câu lệnh:e .Graphics.ĐravíArc (pen l, 0, 0, 100, 150, 0, 360);
Trong đố hinh chữ nhật cỏ íoạ độ (xl = 0. y l = 0, X? = 100, y2 = 15Ò). góc đầu startAngle 0, góc cuối endAngle = 360. Cung lúc này đã ừở thành một đuàig EUipse dẹt.
Vi dụ 12 .1V ẽ đổ thị các đưcíng cong hinh y l = 50.Sin(x), hinh y2 = 50.Cos(x) và tống của chúng y3 = y l + y2.
tBForm1 ‘m
Hĩnh 12.1
195
Sau khi chạy chương trình, ta có giao diện như hình 12.1. Đổ thị cỏ ba đường cong dạng sin, cos và tổng của hai đường.
Mã lệnh chương trình được liệt kê như sau; using System;
using System.Drawing;
using System.Drawing.Drawlng20/
using System. Dravíing.Text;
using System .C o llections/
using System.ComponentModel;
using System.Wlndows. Forms/
using System,Data;
namespace G raphicl
{p u b lic c la s s Forml: System. Windows. Forms. Form
{p r iv a te System.Windows.Forms. Panel p a n e ll;
p r iv a te System,CoiTponentModel .C on ta in er coĩỉiponents = n u li;
p u b lic Forml<)
{In itia lize C o m p o n e n t( } /
I
p ro tec ted o v e rrid e vo id Dispose(bool đ isposing)
{i f (disposing)
{i f (components != n u ll)
conponents. D ispose( ) ;
)} J
base.D ispose(d isposing );
)
196
tre g io n Windows Form Designer generated code
p r iv a te vo id In it ia liz e C o n p o n e n t0
1
th is .p a n e l l » new System .W indows.rorm s.Panel{ );
th is .S uspendLayout{ ) ;
th is .p a n e ll .Locatxon “ new System .Oravíing.Point (0, 0 );
th is .p a n e ll .Nâme = * 'p a n e ll" ;
t h is .p a n e l l .S i2 e = new System ,Draw ing.S ize(528r 320);
th is .p a n e ll.T a b ln d e x * 0;
th is .o a n e l l . P a in t new System.Windows. Farms. P a in tE v e n tH a n d le r(th is .p a n e il_ P a in t) /
th is .A u to S ca leB aseS i2e * new System .D raw ing .s ize(6, 15);
th is .C l ie n ts iz e » new System .Drawing*Si2e (536, 330);
th is .C o n tro ls .A đ d (th is .p a n e ll);
this.Nanie « **rormỉ” ;
th is .T e x t » ” Form r ;
th is .ResumeLayout ( f a ls e ) ;
‘ ) ẹ
#endregion
/ / / <sunưnary>
I I I The main e n try p o in t fo r th e a p p lic a tio n
/ / / </summary>
[ STAThread)
s tâ t ic v o id M âinO
(A p p lic a tio n • Run (new ro rm lO );
)/ / ----------------------------------J............. ............................................. ^-----------
p r iv a te v o id p a n e il_ P a in t (o b je c t sender,System. Windows. Forms. PaintEventArgs e)
{Pen penl = new P e n (C o lo r.R e d /2 );
dcuble n y l = new đouble{ 1001] ;
197
fo r ( in t i * 0; i < 1001; i++ )
yl[ i] * SO^Math.SiníMâth.PI* i / 1 8 0 ) ;
fo r ( in t i “ 0; i < 1000; i++ )
e . G raphics. DrawLine (penl^ i , 150 “ ( i n t ) y i í i l # (i+1)# 150- ( in t )y l [ i+ ỉ ] ) ;
p e n l,C o lo r * Color^DarkGreen;
double [ ] y2 * new double{ 1001] ;
f o r ( in t i « 0; i < 1001; i++)
y2[ i] = 50 *M ath .C o s (M ath .P I*i/18 0 ) ;
f o r ( in t i » 0; i < 1000; i++ )
e . Graphics .DrawLine (pen l, i , 150 - { i n t ) y 2 [ i 3 , ( i+ 1 ) , 150
- Í in t )y 2 [ i+1] ) ; ,
p e n l.C o lc r - Color.DarkM agenta/
double ( ].y3 = new doubleí lOOỈ] ;
fo r ( in t i “ 0; i < 1001; i++)
y3l i] - yl[ 1] ^ ỵ2[ i] ; for(int i * Ũ; i < 1000; Ỉ++)
e.G raphics .DrawLine (pen l, i , 150 - { in t)y 3 [ i] , ( Í+ D / 150
- ( in t ) y3( i+1] ) ;
12.2. VẼ CÁC HÌNH CÓ MÀU T ổ ĐẬM VÀ HIÊN THỊ STRINGI I
Khác vcrt bút vẽ Pen đã xét ở trên, để tỏ màu các hinh và hiển thị chuỗi ký lên màn hình, ta phải sử dụng lớp Brush.
- Khai báo chổi vẽ nhờ câu lệnh;Brush b r = new S o lid B ru s h (C o lo r.B lu e );
E)ối số trong hàm là biến chỉ màu ẹắc.
- Muốn thay đổi màu ta viết như sau:br = new S o lid B ru sh (C o lo r.L iợ h tG reen );
- Để chọn được font chữ, kích thước chữ, kiểu {đậm. nghiêng,...) ta
198
có câu lệnh;Font f l = new Fo nt{k iểu fo n t chữ, s iz e , F o n tS tỵ le );
Trong đó kiểu font chữ được chọn khá phong phú;
PontSíỵle ỉà Bold. Italic, ưnderỉine.
Ví đụ:Pont f l = new Font {"C o u rrie r new*', 15, Fo n tS tỵ le .B o lđ ) ;
- Viết chữ lên màn hinh ta sử dụng câu lệnh khai báo dinh dạng: StringForm at fo rm a tl = new S tr in g F o m a t 0 ;
- Chữ viết ữieo hướng nằm ngang:form atl.FonratFĩags = StringForm atFlags.D irectionRightToLeft;
- Chữ viết theo hướng ữiẩng đứng:f o rm a tl. Fom atF lags = S tr in g F o rm a tF la g s .D ire c tio n V e rtic a l;
- Lệnh ứiực hiện việc hiển thị lên màn hình dòng chữ (String):e .G ra p h ic s . D raw S tring (" s tr in g le n man h in h ", f l , b r , x l ,
ỵ l , fo rm a tl);
Trong đó:
f l : biến font;
br; biến chổi vẽ;
x l . y l: íoạ độ điểm đạt chữ đểu tiên của string;
íormatl: h ii^ g chữ (nằm ngang, hoặc thẳng đứhg).
\Jị dụ 12.2. Xây dựng giao diện để vẽ lên màn hình một hình Ellipse tô đậm, một hình chữ nhật tô đậm, ba dòng chữ (hai nằm ngang và một thẳng đúhg à các vị trí khác nhau).
Đ ể thiết kế giao diện, ta kéo điều khiển "Panel" vào củồ sổ Form và dãn rộng đến một mút phù hợp. Tiếp âểxì, ta nhấn đúp chuột vào Panel và viết chưcftig ừình, với nội dung phương thút:
p r iv a te v o id p a n e ll_ P a in t(o b je c t senđer,
'Sỵstem .HindovỉS.rorm s.PáintEventArgs e)
{ 1Sau khị chạy chương trình, ta có giao diện nhưírên hình 12.2.
199
fflForm1
Ve do thi
Dai hoc Đach Khoa Ha noi
Hình 12.2
Toàn bộ mă lệnh chương trình được liệt kẽ dư<M đây. using System;
using System.Drawing/
using System. Drawing.Drawing2D;
using System .Drawing,Text;
using S ystem ,C ollections;
using SystemXOTiponentMođel;
using System.Windows,Forms;
using System.Data;
nâinespace Graphics
íp i^ l ic c lass F o m l: System.Windows.Foms,Form
(p r iv a te System.Winđows.Formâ.Panel p a n e ll;
/ / / <summarỵ>
I I I Required designer v a r ia b le
/ / / </suimary>
200
p r iv a te System.Corr,poneritMode 1 .Corìtâiner components - n u l l ;
p u b lic Form l()
{• InitializeCCTĩiooner)t { ) ;
!p ro te c ted c verrid e void Dispose(booi d isposing)
{ỉf (d is p o s in g )
{i f (components != n u ll)
components.Đispose{);
}base.Dispose (d isposing );
)#reg ion Winđows Form Designer generated code
p r iv a te vo iđ In itia lizeC om ponent ()
{th is .p a n e i l = new System.Windows.Forrr,s. Panel ( ) ;
t h i s • SuspendLâyout() ;
th is .p a n e ll.L o c a tio n = new S ystem .D raw ing ,P o in tí0, 0 ) ;
th is .p an e ll.N a in e « "p a n e ll" ;
t h i s .p a n e l l . s ịg ễ = n§w §y§têmiDrâv/ỉng:§i2ê (528 320)/ th is .p a n e l l .Tâblndex ũ;
f t h is .p a n e l l . Paint += newSystem.Windows. Forms. PâintEventHandler ( th is .p â n e ll_ P â in t ) ;
th is.AutoScaleBaseSize * new System. D raw in g .s ize (6, 15) ;
th Ì5 -C lie n tS iz e = new System .Drawing.Size (536/ 330);
th is .C o n tro is .A d d íth is .p a n e ỉl) ;
this.Nam e = "rorm l";
th is • Text = Porml" ;
th is .RestuneLayout ( fa ls e ) ;
2 0 1
)#endregion
[ STAThread]
s t a t ic v o id K ainO
(A p p lic a tio n .Run {new F o m l( ) ') ;
}/ / ------------- -------- -------------------------- -----------------------------------------p r iv a te v o id paneíl^^Paint (o b je c t sender,
System.Windows. Form s.PaintEventArgs e)
{Pen penl = new P en (C o ĩor.R ed ,2 ) ;
e.G raphics.D raw A rc (p e n l,0 ,0 ,1 0 0 ,1 5 0 ,0 , 36D);
Brush b r = new S o lid B ru s h (C o lo r .B iu e );
Font f l = new F o n t{"C o u rr ie r new" , 1 5 , F o n tS ty le .3 o ld ) ;
e .G ra p h ic s . F i l l E l l i p s e ( b r , 5 0 ,5 0 ,1 0 0 ,5 0 ) ;
b r = new S o lid B ru s h (C o ĩo r. L ig h tG re e n );
e .G ra p h ic s .F illR e c ta n g le (b r , 150 ,150 , 5 0 ,4 0 );
b r= new S o iid B ru s h (C o lo r. DarkG reen);
e .G ra p h ic s .D raw S trin g ("V e do t h i " , f l , b r , 200,50) ;
b r “ new S o liđ B ru s h (C o lo r .B lu e );
S tringForm at fo rm a tl « new S tr in g F o rm a t0 ;
fo r m a t l . FonnatFlags = S trin g F o rm a tF ,la g s .D ire c tio n R ig h tT o L e ft;
e .G rap h ic s .D ra w S trin g ("D H Bach Khoa Ha n o i" , f l , b r , 400, 200/ fo r m a t l) ;
b r = new S o iid B ru s h (C o lo r .V io ie t) ; *
'fo rm atl.F orm atF lags = S tr in g F o rm a tF la g s .D ire c tio n V e rtic a l;
e .G ra p h ic s .D ra w S trin g C G e n e tic -S ing apo re " , f l v b r , 400,20, fo r m á t l ) ;
- ì ■'
202
Cũng giống như các phương thút mẫu {thư viện) để vẽ cho các hình khdc nhau, ở đây ta sẻ liệt kê một sổ phương thút chủ yếu cho việc tô màu các hình đậm.
1.Tô màu hình Ellip>se:e .G ra p h ic s .F il lE lip s e (b r , x l , y l , w, h );
2. Tô màu hình chữ nhật:e .G ra p h ic s .F illR e c ta n g le (b r, x l , ỵ l , x2, y 2 );
3. Tô màu mọt cung hình qiạt:e .G ra p h ic s .F il lP ie (b r , x l , y l , x2 , y2, s ta rtA n g , endAng);
Các phương tíiút khác ta có ứiể nhỉn thấy khi gõ vào câu lệnhe .G ra p h ic s .F il l
Sau dấu chấm, tâ sẽ thấy hàng loạt các hàm có liệt kỗ các đối số.
Vì dụ 12.3. Tạo một Windows Form để vẽ một hinh lục giác có cck:
cạnh là giá trị thay đổi lấy từ Trackbar. Khi dịch chuyển con tníợt Trackbar, hình dạng của lục giác sẽ thay đổi theo giá tri của Trackbar,
E D raw H e x a g o n
n o
>
Hình 12.3
203
using System;
using System.Drawing;
using S ystem .C ollections;
U5ing System.CorĩìponentModel; using System•Windows. rorms;
using System.Data;
namespace draw_Hexagon
(I I I <summarỵ>
/ / / Suinmary d e s c r ip tio n fo r rcnnl
/// </summary>p u b lic c lass Forml: Sỵstem-Windows. Forms.Form
{p r iv a te System• W ind0W 5 .Forins. Panei p a n e ll;
p r iv a te System.Windows.Forms.Trackbar T rac k b a rl;
p r iv a te System.Winđows.Forms,Label Ib lv a lu e ;
p r iv a te System.ComponentModel.Container components = n u ll;
p u b iic Fonnl{)
{In itla lize C o ;r^ o n e n t 0 ;
}p ro te c teđ o v e rrid e vo id Dispose(bool d isposiiig )
{if (d is p o s in g )
(í i f (coirponents !*■ n u l l ) -
{components • Dispose ( ) ;
1 ỉ1 ' : base.Dispcse (d is p o s in g );
) :#region Windows Form D esigner-generated code
I I I <su im ary>
204
/ / / Required method fo r Designer support - do not modify
/ / / the contents o f th is method w ith
/ / the code e đ ito r .
I I I </summary>priva-.e v c id In itiâ lỉeeC orrtponent ()
(th is .p a n e il = new System-Windows .Form s.Panel ( ) ;
th is .T ra c k b a r l * new System.Víindows-Forms.Trac>±>ar ( ) ;
t h is . Ib lv a lu e = new System,Windows.Fomìs.Label 0 /
( (System,ComponentModel. IS u p p o r t In it ia liz e >( th ls .T râ c k b a r l) ) ,B e g in In i t ( ) /
t h : 3 .SuspendLayout( ) ;
/ // / p a n e il
/ /th is .p a n e ll.L o c a t io n = new System .D raw ing.P oin t(19, 9 );
th is .p a n e ll.N a m e = "p a n e ll” ;th is .p a n e l l .S iz e » new System ,D raw ing.S ize(413, 303);
th is .p a n e ll.T a b ln d e x * 0;
/ // / T rackbarl
/ /th is .Tracìcbarl.D ock Sỵstem.Windows.Fonns.DockStyle.Bottom;
th is .T ra c k b a rl.L o c â tỉo n » new System .Draw ing.Point(0, 352);
th i3.Trackbarl.M axim um ■ 20;
th is -T rackb arl,N am e “ ” T ra c k b a rF ;th is .T ra c k b a r l.S iz e * new System .Draw ing*Si2e(451, 69);
th is .T ra c k b a rl.T a b ln d e x = 1;
t h is .T r a c k b a r ĩ . S c r o l i + * new S y s te m .E v e n tH a n d le r (th is . T r a c k b a r l_ S c r o l l ) /
/ / Ib lv a lu eth is -lb ív a lu e .L o c a tio n « new System .Drâwing.Point(106, 305);
th is . lb lv a lu e .Name * '* Ib lv a lu e " ;
th is , lb lv a lu e .S Ì2 6 * new System .Draw ing.S ize (96, 2 7 );
206
th is .lb lv a lu e .T a b ln d e x » 2 ;
/ / Forml
th is .A utoScaleB aseS ize * new S ystem .D raw in g .S ize (6 , 15);
th is .C lie n tS iz e * new S ystem .D raw in g .S ize<451, 4 2 i ) ;
th is .C o n tro ls .A d đ (th is , Ib lv a lu e ) ;
th is .C o n tro ls .A d d (th is .T rà c k b a r l) ;
th is .C o n tro ls .A d đ (th is .p a n e ll) /
this.Name = **Fonr.l*';
th is .T e x t * Draw Hexagon” ;
( (System.ComponentMcdel, IS u p p o r t In i t ia l i2e)( th is .T ra c k b a r l) ) .E n d ĩn it (>;
th is .R esu m eL ayo u t(fa lse );
}tendregion
I I I <summary>
/ / / The main ô n try p o in t f c r th e â p p lic a t io n
I I I </,summary>
[ STAThread]
s ta t ic vo iđ M a i n ị }
{Application-Run(new Form l0 ) /
)p r iv â te v o id T ra c k b a r l_ S c ro ll(o b je c t sender/
System.EventArgs e)
{Graphics g * p a n e ll.C re a te G ra p h ic s 0 ;p a n e ll• R efresh ( ) ;
ín t n * T ra c k b a rl.V a lu e *10;
g ,T ran s lâ teT ran sfo rm {p an e ll • W iđ th /2 ,p a n e ll •H e ig h t /2 ) ;
Pen p » new P en(C olor.R ed,5 );
. Pointt ] po » { new P o in t(-n , 0 ) / new P o in t ( -n /2 / n / 2 ) , new P o in t(n /2 , n /2 ) , new P o in t(n , 0 ) , new P o in t (n /2 , - n /2 ) í new P o in t(-n /2 , - n /2 ) , new P o in t(-n , 0 ) ) ;
g •DrawCurve(p, PC / 0 . OOF);
206
Ib lv a lu e .T e x t * n .T o S tr in g O ;
dụ Ỉ2 A . Sử dụng Trackbar để thay đổi qiá trị. in t. a = TracK barl .V a lu e ;
Đại lượng a được đưa vào làm tham số cho một vài hàm tính toán: yl[ i] *< 5 ũ )*M a th .S in ( i* '3 .1 4 1 5 9 /1 8 0 *a ) ;
Khi con tniỢt thay đổi thì giá frị a thay đổi và đồng thời đồ thị cũng thay đổi theo. Các bạn có ứiể so sánh hai cách viết chương trình gần giống nhau của ví dụ 12 .3 và ví dụ 12.4.
Trong vá dụ 12.3. chúng ta viết hàm tiếp cho (fiểu khiểnTrackbar. còn ừong ví dụ 1 2 .4 ta lại viết hàm:
p r iv a te v o id Forn il_P ain t (o b je c t sender,
System.Windows. Forms. PaintEventArgs e)
I }
Hỉnh 12.4
Đồ thị của vn dụ này đưỢc hiển thị ở hinh 12.4.
Toàn bộ mâ lệnh chutíng trinh được liệt kê sau đây.
207
using System; using System.Orawirg; using System.Coilections; using System.ComponentModel; using System.Windows. Forrns; using System.Data; namespâce WindowsAppDrawinậ {public class Fornìĩ: System.Windows.Forms.Form
r
private System.Windows.Forms.Trackbar Trsckbarl/ private System.ComponentModel-.Container components = null; public Forml{)
InitiâlizeCocnponent 0;protected override void Disposeíbool disposing)
i£(disposing){ií (components != null)( :coit^onents.Dispose 0; , .ỉ .1
bâse.Disposê(disposing);} '
#rạgion Windows Fonn Designer generated code privâte void lnitializeConỊ>onent(){this.Trackbarl * new Syẩtồm.Windows .Forms.Trackbar ();<{System.ComponentMod6l*ĩSuppoỉrtlnitiôlize) (this.Trackbarl
)).Beginlnit 0 ;t h i s . SuspendLayout( ) ;
208
// Trackbarlthís.Trackbarl.Location * new System.Drawing.Point(72, 8);this.Trackbarl.Mâximum » 20;this.Trackbar 1 .Nanie * Trackbarl” ;this .Trâckbarl. size « new Systerĩì.Drawing.Size (304, 56); this.Trackbarl.Tablndex * 0;this.Trackbarl.Scroll+ » new
Sys tem,EventHandler íthis.Trackbârl_Scroll);// ForTTilthis .AutoScaleBaseSize * new System. Dravíing. Size (5, 13); this.Clientsize = new this.Controls.Addlthis.Trac)cbarl); System. Drawing.SiZ€ (480, 372) ; this.Name * "rcnr:!"; this.Text * *'rorTTìĩ” ; this.Paínt + * new
System.Window.Forms.PaintEventHanđler(this.Fonnl_Pâint);((System.ComponentModel.ISupportInitialize)
(this.Trackbarl)).Endlnit();this.ResumeLayout(false);}lendregion ( STAThreađ] static void MâinO (Application .Run (new Forml());}private void Forml_Paint(object senđer,
Sỵstem.Winứows. Forms- PaintEvéntArgs e){int a * Trackbarl.Value;Pen penl » new Pen(Color.Red,6);e.Graphics. DravíLine (penl, 80'+ a*15, 80, 80 + ồ* 15 100); double [ 3 yl “ new double( lOOOỊ ;
2 0 9ỉ 7.ì Ạp i i 4n k ..n c a
double [ ] y2 * new doubleỊ 1000] / double [ ] y3 » new double( 1C"'0] ; for(int i * 0; i < 1000; Ì4- + ) ylt i] = (50)*Mach.Sin(i*3.14159/18C*a); penl =* new Pen (Color,Blue, 2); for(inti i * 0; i < 999; i++)e.Graphics• DrawLine i, 200 - (int)yl[ij, i+1, 200 -
(int)yl[ 1+1] );for(int i * 0/ i < 1000; -• + ){y2[ i] = (50)^Math.Cos{i*3.14159/180*a); y3[ i] = yl[ i] + y2ị i} ;}penĩ *= new Pen (Color .Red, 2); for(int i » 0/ i < 999; i++)e.Graphics,DrawLine (penl, i, 200 - (Ỉnt)y2[i]/ i + ỉ, 200
- (int)y2[ i+11 );penl « new Pen(Color.DarkMagentâ, 2); for(int i * 0; i < 999; i++)e.Graphics.DrawLine(penl, 200 - (int)ỵ3[ i] , i + 1, 200
- (int)y3 i+1] );//Brush brl = new SolidBrush(Color.LightSeaGreen);//e.Graphics.rillEllipse(brl, 100, 100, 50 + a, 50 + a);)privíitê voỉd Trackbarl_Scroll (object 'sender,
System.EventArgs e)IInvalidate();}
I
)
zr.LẠp-n«kM..NCA2 1 0
ChươNq 17. L ậ p TRÌNh c ơ sỏ dữ liệuĐể quản trị c ơ sở dữ liệu (CSDL)', ờ đáy ta phải hiểu là CSDL được
xây dựng trong hai môi trưởng thông đụng. Đ ó là m ôi trưởng Access vàmôi trường SQL (môi trưởng Oracle cũng rất hiệu quả nhưtig trong khuôn khổ cuốn sách này không thể trình bày được, vì chuơng trình để quản trị CSDL bẳng Oracle rất đồ sộ).
Trong chương này ta sẽ tìm hiểu về cách kết nối CSDL trong môi trUờng Access 2000 vcí ngôn ngữ lập trình c ^ .
Có hai cách để chưtftig trình truy cập vào CSDL Access:
- Viết chưcíìg trình trong Console Application.
- Viết chưcsig trình trong Windows Application.
Trước hết. ta cần tạo bảng dữ liệu trong Access 2000 (hoặc có thể Access 97. 2003 2005).
13.1. T Ạ O C ơ SỞ D Ữ LIỆ U TRONG ACCESS 2000
Giả sử có bảng dữ ỉiệu như hình 13.3.
1. Khétì động Access 2000. ' iă có cửa s ổ như hình 13.1. Chọn tên CSDL là "data.mdb".
2. Chọn Create Tởble In Design View —» ta có cOte sổ như trên hình13.2.
3. Lần lượt nhập các tniờng vào các hàng của hình 13.2:
- CustomeriD
- CompanyName
- ContactName
- Phone
Kiểu biến (Data Type) có thể chọn ciự& vào thự t tế, nhiừig ở đây ta chọn kiểu Text.
4. Từ hình 13.2, ta chọn khoá chính (Primary Key) cho tniờng CustomerlD.
5. Đóng (Ciose) hình 13.2 và ta cần phải lưu tên bảng dữ iiệu (data
211
ídble) với tên: " tblCustomer "
6. Từhirth,13.1. nhấn đúp vào tên bảng íblCustomer, ta sẽ có bảng như hình 13.3. Sau đó trên tiíhg hàng ta nhập dữ liệu vào các cột.
Hoàn tất cóng việc, ta đóng chương trình Access lại.
ýr Sau khi tạo tệp dữ liệu data.mdb, ta sè chép sang thư mục của chưcmg trình c # (không nên để trong My DcKument).
f i id a t a : D a t a B a s e ( A c c . . . E j['
^ Qu.., -3 For...
Ị “ Rep.. Pag..,
Groups
i^ Q p e n Ạ^D esign ,3 N ew >< I Vrr c>b je<±s
ị ^ Tab..
2esìgn v3New 5< I Vr-|ĩ3ĩỊTftw C reate ta b ie in D esign vievv ^ C reate tab le by usĩng wizard •ẩi C reate ta b le by entering data
ứ > lC u s to m e rs
Hình 13.1
Comp«nyfidmeCortàơHamt
Beld PropertKs
I
Hình 13.2
2 1 2
■ tblCustomers : Table
► n n r222 333 ORAC
m __R e c o rđ : ì i
CMC Hoa bmh Microsotl FPT
HaUaiHongLien
12344564455667
1 I ► 11 Ĩ L l S Of 4
Htnh 13.3
13.2. XÂY DỰNG CHƯCÍNG TR ÌN H
APPLIC ATIO N
Vi d ụ 1 3 .1 . Trước hết ta thẻm tệp tiẽu đềusing System.Data.OleDb; vào đẩu chương trinh,
using System; using System.Data; using System.Data.OleDb; narnespace CSDL
TRONG CONSOLE
class Clas5il Ibtatic OleDbConnection con; statỉc vold Mainístring; ] args){string s » ;do
Console. WriteLine r — Customer Management— '*); Console, WriteLine (** i. Insert new customer^’); Console.WriteLine (”2. Display custOTier**); Console.MriteLineC* 3. Display custc^rs đataset” ); Console. WriteLiné 4. Delete with Commaiìđ*} ;
2 1 3
Console.WriteLine r 5. E)elete with DatâSet” ); Console.VíriteLine (*‘ 6. Quít*') ; s Consoie.ReađLine (); switch (s)
Câse ”1": InsertData (); break; case ”2’*; DisplayO ;break; case •'3**: DisplayWithDataSet <> /break; case "4” : DeleteWithCommand();break; case ”5’*: DeleteWithDataSet 0 /break;)
)while (s !="6");)//--------------------------------------- ------static void ConnectO {ôtring strConString * 0**F;ovider =
Microsoft. Jet .OleDb. 4.0; Data Source»=. A . .\data.mdb*' 7con * new 01ett>Connection(strConString); con.Open();}//----------------------------------------------
stâtic voiđ InsertData 0
Console^VíriteLine("Enter information:Console.Write (”Customer ID: **); string CustlD » Console^ReadLineO;Consoie.Write("Company Name: ”); stríng CompName » Console.ReadLineO; Console.Write("Contact Name: ^); string ContName “ Console.ReadLineO; Console.Write(’• Phone:
2 1 4
string Phone * Console.ReadLine(>; connecc ();OleDbCommanđ cmd * new OleDbCommandC* INSERT I*NTO
tblCustOĩTters (CustomerIđ, CompanyNâme, ContactName, enone)• VALƯES {*** + CustlD + CoĩĩipName + + ContName +” ', + Phone + " • )•', con) ;
OleDbCommand cmd “ new OleDbCommand(string.rormatINSERT INTO tólCustomers (Customerld,CompanyName,ContactName,Phone) VALƯES (*{0)\ M U * # M2}*, •{3}’)". CustlD, CoiĩipName, ContNarne, Phone) , con);
OleDbCommand cmd - new OleDbCommand("INSERT INTO tblCustomers (CustomerId,CompanyName,ContactName,Phone) VALƯES
cmd.Pârâmeters.Addí" ễCustld*’, CustlD); cmd. Parameters.Ađd (” 0Compnârrie" , CompNaine); crrid, Pârameters,Add (*' ỄContName** ContName); cmd. Parameters.Add ự* Sphone’* , Phone); ínt n =* cmd.ExecuteNonQuery ();Ccnsole. WriteLine (” ( 0} record inserted" , n); con-CloseO;)
static void DispiaỵO {Connect();CieDbCommand cmd - new OleDbCommand SELECT * FROM
tblCustomers" , con);OleDbDataReader dtr * cmd.ExecuteReader0;Console. WriteLine ("\-- Customer List — \n”);while (dtr.ReacìO){
Ccnsole.WriteLinerí 0, -5}\t{l, -12}\t<2, -15)\tf3, -10}”, dtr( ** Customerld**] I dtrí **CompanyName”) , dtrỉ 'ContactNamê**3 » dt.r{"Phone”j );
215
}Console.WriteLine ("-- E n d ----\n\n");dtr.Close 0; con.Close 0 ;1//-----------------------------------------------------static void DisplaỵVíithDataSet (){Connect ();OleDbDa-taAdapter da = new OleDbbataAdapter (" SELECT * FROM
tblCustcroers" , con);DataSet ds = new DataSetO; da.Fill(ds, ”tblCustomers");DataTable ttal = ds.Tablesí "tblCustomers"] ;Console.MriteLine("\n-- Customer L i s t--- \n");for (int i = 0; i < tbliRovs.Count; i++){
Console.MriteLine (’’{ 0, -5)\t{l, -12}\tí2, -15)\t{3, -10)", tbl.Rows[ il [ "Customerld"] , tbl.Row^ i] [ "CompanyName”] , tbl.Rows[ i] [ "ContactName”] , tbl.Rows[ i] [ "Phone"] ) ;
Console.MriteLine ("-- E n d ----\n\n");con.Close ();
/ / ------------------------------------------------------------------------------------------------------------------------------------------
static void DeleteWith.Comntand()(Console.Sỉrite ("Enter custoiner Id to delete: "); string Custld ® Console.ReadLineO;Connect{ ) ;
OleDbCoíiưnand and “ new Oiel&Comrnand C' DELETE FROM tblCustomers PíHERE Customerld = + Custld + " , con);
int n = cmđ.ExecuteNonQuery{);
2 1 6 -
•)
Console-WriteLine (*M 0) records deleted successfully*', n); con,Close();1
/ 7 ----------- ----------- ---------------------------------------------------------------------------------
static void DeleteWithDataSet ()
Connect();OieDbDataAdapter da = new OleDbDataAdapter r SELECT * FROM
tblCustomer , con);OleDbCommnndBuilder cb = new OleDbCommandBuilđer (da) ;dâ. InsertCommanđ « cto.-GeỊtIn5er,tCornm3od();da. UpdâteCommand * cb. GetUpdateCommand () ;đa.DeleteCommand « cb.GetDeleteCommand();DatâSet ds » new DatâSetO;da.Fili(ds, " tbiCustomers”);DatâTâble tbl « ds,TâblesítblCustomers’*} ;Console.Vírite (** Enter customer Id to delete: *')»string Custld » Console^ReađLine()/for (int i * 0; i < tbl .Rows .Count; i++>(if (Custld tbl-Rows[ i] [ ”Cu5tomerIƠ‘] .ToStringO)(tbl.Rows( i] .DeleteO; break;)
}đa .Update (ds# •^tblCustomers*') ; con.Close 0;Console.WriteLine (** Deiete succesíuliy" );}
2|.uỊ«PtWH...MCA 2 1 7
Sau khi biên dịch và chạy chương trình ta có kết quả như cf hình13.4. Từ Menu, vì CSDL đã có sẵn trong Access nên chọn số 2, ta đã có kết quả như trên hình 13.4.
2 ũic-plòy cưotom^r3 Oioplay customerc MÌth d a tâ ^ e t
D e le te u i t h Comnỉônd5 O e lộ tẹ With ũôtaSet ô, Quit 2
uc tO M io r L ic-
333 t Hong 4455^67ORhC FPT L\pn1 ì 1 CMC Hô222 Moa r»inh Ka IS55 L© T’naoh Hoar><5 ■ rsSGGS
----- ----Cu?tO(nộr MâríôqemộntI n . p r t nẹ-í c<j^>ĩontệrDiz-piơ\ị CsiòtotnerD i ĩ p l a y c u i t o i ĩ i ộ r w i t h da t ò^e tOq ì p ì q wi t h Com»)dndDel€»ce with DâtaSetQu\t
H ình U .4
Bằng cách chọn lần iượt các mục trong Menu, ta có kết quả tưcừỉg ứng. Khi đóng chương trinh c # , nếu m ở CSDL trong môi triíỉrtig Access, ta có thông tin dữ liệu hoàn toàn nhất quán.
13.3. XÂY DỰNG CHƯƠNG TR ÌN H TRONG W INDO W S
APPLICATIO N
dụ 1 3 .2 . Yêu cầu đặt ra là hãy xây dụvig một giao điện Windows như hỉnh 13.5, để quản trị CSĐL là một bảng như đã liệt kê trong Daíagrid.
2 1 8a.i4i<>'nàNH..NCs
ỌÌForm1 1 3
Product Management
ProAictiD
Proíuct
Ur«c«!
m
;ĩ.vi
Unỉs Produced
Tctdlcdst íor DroứudTũlâỉcosl íor«li Prodưci
;22
3CCC
i24TO
P^oducỉiD ProductNđ ưnctCosĩ UrtiProdưc To(fi>C«{lapíc^ noo 15700
222 Viác 20) :2 2000?33 Ttvi 3Ộ0 22 3000•U4 c«s«ỉte SO r 1000
- I ^ * ;►
it:c
I ' ^
Aiỉ(jn«w £dư Deỉef9 $9ve ^rn«l Producad
PmsI « » Last
SI«MCosf
Exỉt
Hình 13.5^
Các thuộc tính của các đỉẻu khiển:1. Labell: Product Management2. Label2: Product ID3. Lâbel3: Product Name4. LahelA: Unit Cost5. LâbelS: Units Produced *6. Label6: Totâl cost for each product7. Label7: Total cost for all Products8. Datagrídl: dg9. Textboxl; txtPId 10- Textbox2: txtName ỉ 1. Textbox3: txtưcost12. Textbox4: txtUpro
2 1 9
13. TextboxS: txtTotalA14. Textfaox6: txtTotalE15. Buttonl: Add New; btnAdd16. Button2: Edit; btnEdit17. ButtonS: Delete; btnDel18. Button4: Save; btnSave19. ButtonS: Final Produced; btnPinal20. Button6: Show Cost; btnCost21. Button7: First; btnFirst22. ButtonS: « ; btnPrev23. Button9: » ; btnNext24. ButtonlQ; Last; btnLast25. Buttonll: Exit; btnExitCơ sở dữ liệu được xây dụửig trong mõi írường Access 2000, giống
như ví dụ trẽn, xem hỉnh 13.6. Tên cơ sở dữ liệu data.mdb.
Bảng dữ liệu có tên tblProducts.
Sau khi đâ chọn khoá chính {primary key) là ProducíID. ía tiến hành nhập dữ liệu cho các bản ghi.
Đ ể viết m ã lệnh cho chưcírig trình, ta cần phải khai báo tệp tiêu đề cho việc kết nối dữ liệu,
using System.Data.OleDb; *d a t a : D a l a b a s e ( A c c e s s 2 Ữ O O f ì l e f o r m a t )
1 ' ĩ t ì p e n í ị 1
1 Ồ b ĩ ^ c t s t a b i « í n D e s l g n v ỉ d v v 1 t t ỉ C r ^ a t e b y ư s l n g W i 2 9 r d í 4 Ú C r e « r t :« t a b i e b ỹ e r ì t e ĩ iT x Q d a f ó 1
•»
ii
ỉ
11 i i i ỉ 1
1
. S P Q u e r .
1 2 P o r m s
R e p o . , .
P a g e s
M a a * o s
ã ^ o i i p s
:jỀà F a v o . . .
Hỉnh 13.6
2 2 0
■ tblỉN-ochiCts: Table
ProđuctíD ProductName UnrtCost Ị UnitProduced► ú Laptop 1100 '17
222 Vtd&o 200 103?3 T-VI 300 10
' 1444 Casette 50 20
0 0[ Record M 1 JU I Đ S o f 4 1
H ình 13,7
Sau đây là toàn bộ chương trinh để quản trị c ơ sà dữ liệu.
Thao tác các điều khiển írên giao diện.
ỉ. Nhập dữ liệu: Nhấn nút Add New trên hình 13.5, các Textbox được xoá sạch. Sau đó ta nhập dữ ỉiệu lần lưc^ vào các Textbox. Cuối cùng ta nhấn nút Save.
2. Sửa đổi dử liệu; Chọn một bản ghi trong Datagrid. nhấn nút Edií. Rồi tiến hành sửct đổi. Chú ý trưèmg ProductlD không đưỢc sửa. Cuối cùng nhấn nút Save.
3. Muốn xoé một bản ghi trong CSDL, ta chọn một bản ghi trong Datagrid và nhấn nút Delete. Sau đó nhấn nút Save.
4. Khi ía đã nhập được 4 trưcừig ProđuctlD, ProductName, ưnitCost, UnitProduced, ta nhấn nút Show Cost và nhấn nút Rnal Produced ta sẽ nhìn ứiấy kết quả tinh toán trong hai Texíbox còn lại.
5. Trờ vé bản ghi đầu tiên, nhấn nút Rrsí; về bản ghi cuối cùng nhấn níit Last; Về bản ghi tnỉỳc. nhấn n ứ « và bản ghi sau nhấn n ú t» .
6. Thoát khỏi chưcừig trinh, nhấn nút Exit.
Toàn bộ mã chưcíng trình iiệt kê sau đáy.
usiHg System;using System,Drawing/using System.Collections;using System.CoraponentModel;using Sỵstern.Windows.Foríns;using System.Data;
2 2 1
using System.Data-OleDb; namespâce CSDLCODE{static void MainO •{Application,Run (new Forml 0 );1
OleDbConnection conn;OleDbDataAdapter da;DataSet ds; //Bien dataSetli
ặ
Ị Ị --------------------------------------------------------------------------------------------------------------------------------------------------------------
plTÌvate vơid F®rml_Load (object sender^ System.EventArgs' e)
conn = new OleDbConnection (@” Provider =Microsoít, Jet.OI|<a5.4,0; Data Source=, A . Adata.mdy’);
da = new OleEtoĐataAdapter r SELECT * FPOM tblProductố*, conn);OleDbCommandBuilder cb = new OieDbCoiTimandBuilder (dâ);da.InsertCcsĩimanđ = db.GetlnsertCcMĩimandO;da. DeleteCommand “ dD. GetI3eleteCorniTtônd ();da. UpdâteCoitmand * cb. GetỰpdateCorransnd ();ds « new DataSet();đd.Fiií (ds, ’* tblProducts” ) / -tđg.DataSource * ds;dg,DataMemt?er « ”tblProducts" ;txtPĩd. DataBinđings .Mdr Text" ị ás , ” tblPr<xlucts. Pro^uctlđ’) ; txtRíame. DatâBindíngs.Adá f' Test", dSf ” tblPrcxỊiCts. ProdiCtKame?') ; txtu<x»st. DataBindings.Adđ ự' Text", ds, ” tbiProducts - ưnitCost” ) / tỉitupco • DataBindings. Add ĩ ' Text” , cầs tblProđucts .lÃiitProđuceđ*); }//----------------------------------------------------privâte void'btnFirst_Ciick((á:)ject sender, Syst^.EventArgs e) {this.BinđỉngContextí ds, ” tblProducts**j .Position = 0;
2 2 2
tí
/ / — ............................ ........................ ............... ..................... —.......... -private void bcnprey_ciick(0bject sender, System.EventArgs e)(this.BindingContextí ds, "tblProducts") .Position— ;1
l Ị --------------------------------------------------------------------------- -----------
private voíd btnNext_Click(object sender, System.EventArgs e) \
t h i s . B i n d i n g C o n t e x t l d s , " t b l P r o d u c t s " ) . P o s i t i o n + + ;
)/ / ---------------------------------------------------------------------------------
private void btnLõSt_Click(object sender, System.EventArgs e) (BindingContext( ds, '■ tbiProducts"] .Position *
t h i s . B i n d i n g C o n t e x t [ đ s , " t b l P r o d u c t s ” ] . C o u n t - I ;
1/ / --------------------------------------------------------------------------------------
private void btriAdd_Click<object serđer, System.Ever.tArgs e)I
this.BindingContextí ds, "tblProducts"] .AddNew{);1n ----------------------------------------- ---------private void btnDel Click(object sender, System.EvertArgs e) IB i n d i n g C o n t e x t ỉ d s , " t b l P r o d u ơ t s ” ] . R e m o v e A t ( t h i s .
B i n d i n g C o n t e x t í d s , " t b l P r o d u c t s " ] . P ó s i t í o n ) ;
!/ / ---------------------------------------------------------------------------------------
private void btnSave_Ciick(object sender, Sỵstan.EventArgs e)I
3indingContext[ ds, "tblProđucts”] .EndCurrentEdit(); d a . U p d a t e ( d s , ” t b l P r o d u c t s " ) ;
2 2 3
)/ / ---------------------------------------------------------------------------------------------------------------------------------
private void btnExit_Click[object senđer, System.EventArgs e)Ithis.Close 0;
/ /private void btnFinal_Click(object sender,
System.EventÃrgs e){DataTable tbl = ds.Tablesí"tblPrọđucts"] ; for (int i = 0; i < tbl.Rows.Count; i++){int upro;int.Parse(tbl.Rows( i] ( "UnitProduced") .ToStringO ) ; tbi.Rows{ í] I "UnitProduced"] = upro + 12;}}/ / ----------------------------- --------------------------------------------------------p r i v a t e v o i d b t n S h o w C Q S t _ C l i c k ( o b j e c t s e n d e t ,
System.EventArgs e)íDataTable tbl “ ds.Table^"tblProducts"] ; tbl.Columns.AdđC' TotalCost") ; double TotalA = 0;for íint i * 0; i < tbi.Rovís.Count; i++)(doi±)le ƯCost * double.Parse(tbl.Row^ i]["UnitCost"] .ToStringO); int - int.Parsettbl.Rcws( i] [ "UnitProduceđ'] .ToStringO); double TotalE “ UCost • upro; tbỊ.Rows[ il [ "TotalCost"] =• TotalE;TotalA+ - TotalE;}
2 2 4
txtTotalA.Text = TotaiA^ToString0;txtTotâlE. DataEindings.Acid c* Text” , d s , tblProđucts.T o t a l C o s e ');
13.4. CHƯƠNG TR ÌN H Q U ẢN t r ị CSDL s ử d ụ n g W I2AR D
ở mục trẽn ta đã thực hiện chương trinh quản^rị cơ sở dừ !iệu trong
môi trường Access 2000 bằng cách viết mã chương trình, ơ đáy ta sẻ xét bằng một ví dụ vể quản trị CSDL bằng cách kéo ửiả và kết nối CSDL bằng Wizard.
Khi chạy chương trình ta được giao diện như hình 13.10.
CSỌL được lặp trong Access 2000 với tệp dữ liệu person.mdb đặt trong thư mục QLPerson của c # trong ổ đĩa c.
p « rs o n ; D a t ã ^ ^ (Ã c c c » s 2 0 0 0 f ì l e f< K in ạ t)
. . á Q p e n i » ^ D e s i g n J3 í i e v v ^ iX £
O b J e c t s i 'ă j O e a t e t a b í e ( n D e s í g n v i e w
\ j T a b í e s l Ặ 9 - « a t e t a b Ị e b y u s i n g v v iz ạ r d ' --------------' ‘ỂJ < _ r e a te t a b l e b y e n t e t i n g d a t a
_3Id
.3
R e p o . . .
PagesMaaosMod...
GroupsF a v o . . .
Hình 13.6
Tên bảng dữ liệu tblperson trong hình 13.8 và có nội dung như trên hình 13.9.
225» .L Ạ iP T n N K ..N C A
D Name Age Salary111 Tuyet 22 1000
► 222 Nha 34 999333 Ha 29 1500444 ^ Ptiiíong • 32 2500555
éThuy 43 4000
* 0 0Record: H i 2 > ► i g 0 f5
Hình 13.9
Giao diện hỉnh 13.10 vctì các điều khiển có thuộc tính như sau1, Lâbell: text: Personnel Management2 . Label2:.ID 3« Lâbel3: Nâme4. Lâbel4: Age5. LabelS: Salary6. Textboxl: tboxID7 . Textbox2: tboxName8. Textbox3: tboxAge9. Textbox4: tboxSalary10. Buttpnl: Adđ (text)7 btnAdd (name)iĩ, ButtonS: updâte (text); btnUpdate (name)12. ButtonS: Delete (text); btnDelete (name)13. Button4: Save (text); btnSave (name)14. ButtonS: Begin (text); btnBeg (name)15* Button6: Prev (text); btnPrev (name)16. Buttoiì7: Next (text); btnNext (name) ỉ ? . B u t t o n S í E n d ( t e x t ) ; b t n E n d (nam e)
18. Bùtton9: Exit (text); btnExit (name)19. Datdgridl (name^
2 2 6
SForm 1
ID
Name
Personne! Manaaement^ Age
Salory
22 Add
Tuyet occUpdaíe
ữelete
Save
ExrtBegin Prev End
^ dataSetl 1 ^ oleDbDataAdapterl • oleDbConnecCionl
Hình 13.10
Kết nối CSDL:
Kéo điều khiển oleDbDataAdapterl vào giao diện như hừih 13.11.
Chọn Tab Provider -> Microsoft Jet 4.0 OLE DB Provider -> Next-»0K.
Ta có tiếp cùa sổ như hình 13-12. Tại nút ... . ta chọn thư mục C:\QLPersonO\person.mdb và nhấn nút Test Connection và có kết quả Succeded. Nhấn tiếp nút OK ta nhận được oleDbConnectionl ờ dưtífi hình 13.10.
- Để tạo Datasetl. ấn chuột phải vào oleDbDataAdapterl dưóí hinh
13-10. ta có cCte sổ mcfi như hình 13.13. ở đây ta chọn:
Generate Dataset, ta nhận được cOte sổ mớỉ hình 13.14.
Sau đó nhấn nút OK, phía dưért hình 13.10 ta thấy thêm D atase tll.
■ Để điển dữ liệu vào dataGrid, từ hinh 13.3, ta chọn Preview Data. Và ta cỏ cửa sổ mcrt hình 13.15.
2 2 7
Nhấn nút PillDataset ở ngay trong hinh 13.15. tại CỦ& sổ Result, ía nhin thấy toàn bộ dữ liệu trong bảng tblperson được hiển thị.
Bây giờ ta cần phải thụt hiện việc hiển ứìị dữ liệu trong bảng tblperson ở trên D atagridl. ,
D a t a ư n k P r o p « r t t e s
I CDfln«cfeOfi ỉ AữvemsỉM I AII &»toct t H ĩ 9Qte you CQOẠMỈO ôli oè PÌivyHÝ)
C t6 P rovK Ỉ« 'OCE wCk ^ ro v *d » f .'60LE >&Pi«viO«r
! Mic*5*cf J«| ĩ 5* 06 í»*ov^
f c f c ù c « f t O l , E C € P > c v l ơ « / f 0 ' D # ir í# * -* :MCTO«ot<X£ DGPicvidelo* DT9P6CS«9»&O L E D 6 •‘•c te ' f o ' k a đ A n n ọ 5 w v MtvcÃct Oie Ptcvidr lo> inttmM ru:»i»‘w%Ị lioTVCliOLC c*6 Ptco»de» fo« OC*BC
MiCY9Kt OLE DE ỡ<«c 9JỈMictSMlỉ 6lE 06 PiovK>«< ỉw 0*«e>«Mio««ofiOlE PirÀd9r«e<0ut^aK s»»>ctMiac«cf OLE c>s Pf9viđ*< tò' SOL 5*rv*r M<pSr«c4 (XE S«T>c4« PtỡnO L E D & P ỉ« T . id e r t e f M ìtr ó s o A > i » c t o r y
MwW4«« ^HAtM
OK CBnC«<
à n ổ u p i ỉ s t e d « t d .
o r dớd a <ỡnriẠctiori ề ctiỀ
C o o n ^ itH ^ n
< Ũ9Ck Heìữ >
Hình 13.11
Bấm chọn Daíagridl trẽn hình 13.10. Chọn Property của điều khiển này (nhấn chuột phải). Trong cửa sổ hình 13.16, tại hàng Datasource, chọn Daíasetl. tại hàng Datamember. chọn tên bảng tblperson.
- Liên kết giCte cấc Textbox VÓI các cột trong DataGrìd. Nhấn chuột trái (single cỉick) vào TextboxID. Sau đó chọn DataBinding trong Property của Textbox này. M ở hàng Text và nhấn chuột vào tên tBoxID. Cũng làm động tác tưc#ng tự vcfi các Textbox còn lại: tboxName, tboxAge, tboxSalary.
Save toàn bộ chưcmg trình và biên dịch.
2 2 8
iD Data Link PropertiesP t G v i ơ v C o o f t © c t » o n I A â v a n c ^ d j A ỉ i
Sceafy the fcllcwing 10 cor>n«ctto ACC99S ƠBia T S e ỉ ỉ ỉ c ỉ OT e n t e r e d f i ! d & a « e n a m e
|C \QLPeison .u«r9Cn mdo
2 Entsi in ỉ o ư n o i i< ? n ỈO i o ọ o n t o t h e d e l d b o ^
u $ e ( n a ro «
r --------------------|7 6 i9rtK p a 9s w c r đ p * A l i c w S 8v ir i9 ; : ô B 9M0 t đ
T » « C o n n » c t » o n
OK Concet H%|p
Hình ỉ 3.12
Bây giở ta viết mã lệnh cho chưtừig trình.
Tại một điềm bất kỳ trong Fom) (không được trỏ vào bất kỳ điều khiển nào), nhấn đúp chuột trái, ta có phuưng thút;
private void Forml_Load(object sender, System.EventArgs e){try {oleDbDataAdapterl.Fill(dataSetll,"tblperson");)catch (ExceptỊon ex){MessageBox.Shovííex.Message);
229
^ oMX)DataAdapt^^' 2] V ỉew C ode
ConA gure D ata A d aptei
G enerate D atdset...
.tm
«đed • c t\v ri.r.đcv^» \i Ịi, Aded * c i \ v i r .đ c v í i
?-Ẽesaen. exe * h
t j
Previevv D a ta ...
Cut Copỵ
X QeleteI
e£* PLoperties
Hình 13.13
G e n e ra te D a tase t
Generate a datase^ that inckides the specìffed tebks
Choose a đataset:
^ Existmg:
(9 New: {ữdtdSetỉ
Choose vvhích t<É>)e(s) to add to the dataset:
V tblperson (oỉ^bDaCdAdapterl)
^ Ađd tU s dMaset co th« desỉọner.
OK Cancei Help
Hình 13.14
230
B DoU Addptef Prev\ew
Data adâpt«fs:
loèObDdtàAddptrl U d a p tẽ f Name oã taT yp v i# e
ĩ a r ^ đata$«:
[õCpí ĩo n D a iaS ítl
ResiAs:
Ib tp c rs o n : 5 Ro«v(s)
Datds?c 97«: byte$ (0.6 ìQs)
10 Name Aạe Saỉsy
m T uy« 22 ỈŨOO
227 Nhô 34 999
333 Ha 29 1500
Ptỉưong 32 2S00
'555 T hư / A3
ơear Ow Heỉp
Hĩnh 13.15
PrupenicsdateOrldỉ
Ĩ C S i f
S y s t e m . W n id o vvs . F o m iS . D a td C
^B <O ynamK:Propertjes^ a
(D d C a B in d m ạ s )(Advanced)
DoCđM embn DâcaSource 7 ©bleS tyles Tag
s rytỹtíựtầ(t>iarf\eỳ L o c k # đ M o d r f le r«
(Nớn ) t b l p « r s o n d a t a S e t l 1 ( C o l l e c t i o n )
d a t a G r i d lPateef>rlvac«
Câpti onVts tbỉ« T njeCotumnMead«rsViSíb Tnié’ ParentRov/sLdbítStv Soth Par entRo w$ Vísibte T fu« È to « v H e d d é r s V ỉ s ^ l e T i y e
A ư t o P o r m ^
Taa
Hình 13.16
2 3 1
9 F o r m l
Personnel Msnôồémenĩặ - - -
Pịtrt N«M tnú
t
ÂđđLipd«t«EM«
Sxrt
%a d v D i ^ i Ấ ứ è V ^ I ' % Ỉ ^ * c « 0 ' « i ^ t i 0 n 1 ^ Ở X s S e ĩ ỉ
<ỈK>k 1 D VVẩHloirvs f o n « 5 , ỉ - W * ' »
ii i‘ L“J VVoidsVi«p T rg r
3® iD y iít'ĩitP> C 'i
s
»*a«s * S I ' ' ’^ r ẳ ỉ* * r ữ ~ ~ » i : ĩ < . t ì \ t ' . ỉ ' , t
*s»tt Ị t : ' * . ; ỉĩVĩ. i ; » » ĩ í V ? s a * ■ i « .
3 (DKửd)F>^ỉỉ)fAỉk‘«T.*; ( .■11?'
■B ■
ịbOKÌOL»ĩ^>í
sCdưỉ«Waiiủ<il)0ii
3Tùp,
Ootk h.ne9 1>0, 4 ãa ỈÉ ỉt 3UC' :2
T«xt
Hình 13.17
Vi' d ụ ĩ 3 .3 .V iế ị chương trình quản tr ị CSDL sử dụng Wizard
Sau đáy là toàn bộ mã iệnh chương trinh, usíng Systera; using Systerâ.Draving; using System.Collections; using Sỵstèm.ConponentModel; uslng Systero.WinđovíSiFormsí using S y s t m . D a t a ;
using System.Data.Odbc; namespace QLPerson {/// <si2mma£iC’///‘Surrenary đescription ,for rórtĩú./ / / </suOTmarỵ>
pubiic class Fotml: Systein.Winđows.ForTnê.Form { [ STAThreacC
2 3 2
3 t ‘ t i c v o i d M a i n O»
Aopl ication. Run (new Eorml 0 );\f//------- --------------------------------------------privâte void rorml_Load(object sender, System.EventArgs e) •
thi3.oieDbDâtaAdapterl.Fil1{dataSetll/"tblperson");}/ /----------------------------------------------------privâce void btnciose^ciickícte^^ect sender, System. EventArgs e>ỉ
this.CloseO ;1/ ------ ---------------- ---- ------------------------private void btnAdd_Clic}c(object sender, System.EventArgs e)/this.BindingContextí datâSetll/'cblperson”] -AddNewO;
//------ --- -----------------------------------------private void btnExitClickíob^ect sender,System.EventArgs e
this.BindingContext[ dataSetll/'tblperson”] .EndCurrentEdit 0;
t h í s • o L e D b D a t a A d a p t e r l . u p d a t e ( d a t a S e t l l , ** t b l p e r s o n * * ) ;
íI
, Ị -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
private void button3_Click<object sender, System. EventArgs e)i
this. BindingContext[ dataSetll/* tblperson”] .RemoveAt(this.BindingContextí d^taSetll,
tbloerson*'] . Position) /
9LẠptvwi.j<ica # 2 3 3
//-----------------------------------------private void btnUpdate_CXick (object sender/
System.EventArgs e)
string id * tboxID.Text;int n_rcw * BindingContext[ dataSetll/* tblperson”] .Count; int i * 0;for(i =0; i < n_row; i++)(if(id ** dataGridlí i,0] ♦ToStringO){this.BindingContextí dataSet 11,tblperson**] .Position ® i;dataGridl.Select(i);b r e a k ;
if(i “ n_row)
MessageSox.Show(”Not found the recorđ !**);)) '/ /----------------------------------------------------private void btnBeg_Click(òbject sender, System.EventArgs e) (this.BindingContextl dataSetll,'*tblperson”l .Position » 0;
//..... .................. -............. -......p r i v a t e V D id b t n E n d _ C L i c k { o b j e c t s e n d e r , S y s t e m . E v e n t A r g s e i
i
this.BindíngContextí đataSetll,"tblperson"] .Position= BindingContextí dataSetll,"tblperson"3 -Count - 1;
*)//----- ----------------------------------------------
30.LAP7i .j<ca2 3 4
p r i v a t e v o i d b t n P r e v _ C l i c k ( o b j e c t s e n d e r , S y s t e m . E v e n t A r g s e )
ỉ
t h i s . B i n d i n g C o n t e x t l d a t a S e t ỉ l , " t b l p e r s o n ” ] . P o s i t i o n — ;
)//----------------------------------------------------p r i v a t e v o i d b t n N e x t _ C l i c k { o b j e c t s e n d e r , S y s t e m . E v e n t A r g s e )
It h i s . B i n d i n g C o n t e x ỹ d a t a S e “ ĩ l , " t b l p e r s o n " ] . P o s i ^ i o n + + ;
2 3 Õ
TÀi LiỆu ThAM KhẢo1. Charles Pet2old. P ro g ra m m in g M icrosoỷt W in d o w s wìth c ^ .
Microsoít Press. 2002.
2. 'Morgan Skinner. Karli VVatson, Biil Evjen. Allen Jones. P roỷess ion a ì c#. Third Edition. Wiiey Publishing. Inc. 2004,
3. Rađlev L. Jones. Teach Y ourse!f T h e L an gu age in 2 1 doịìs.
Sams Pubtishing. 2004.
4. Jeff Perguson. Brian Patterson, Jason Beres, Pierre Boutquin. Meeta Gupta. Bible. Wiley Publishing, Inc. 2002.
5. Kevin H oíím an . Lonny Kruger. M icrosoỷt Visuaỉ ,N £ T 2 0 0 3
U n ỉeash ed . Sams Publishing. 2004.
6. Rebecca M. Riordan. M icrosoỷt A D O .N E T S te p bụ S tep .
Microsoít Press, 2002.
7. Kevin Hoffman. M icrosoỷt ự lsual c S h a rp 2 0 0 5 U nleashed.
Microsoít Press, 2005.
8. Chrischian Nagelet AI. P ro /ess io n ơ l c S h a rp 2 0 0 5 . Microsoỉt Press. 2005.
9. Jesse Liberty. Visual 2 0 0 5 - A D e u e lo p e r s N o teb o o k .
Microsoít Press. 2005.
10. Phạm Công Ngô. Tự học ngòrì ngừ lập tr ình Visual C++ 6.0 tử cơ bân d ế n nâng cao. Nhà xuất bản Thống kê. Hà Nội, 2002.
236
Muc Lịjc« ạ
Lời ữ\ở\ thiệu.......................................................................................................... 3Chương 1. Các nét co bản của c# .........................................................................5
1.1. Giới thiệu c# ........................................................................................... 51.2. Riếu, biều thức............................................................................................61.3. Từ khoá (keyworíj)...................................................................................... 71.4. Kiểu (type )................................................................................................. ô1.5. Khai báo biến (declaration).......................................................................ôl.ố. Cấc toán tử 60 học............. ..................................................................... 91.7. Toán tử cỊuan hệ và lo^ic.... ............................................... .......... ......... 101.p>. Toán tử xử lý b i t .......................................................................................101.9. Chú thích...................................................................................................12l.lữ. Kiểu liệt kê (edum)................................................................................... 121.11. Kiểu câu trúc - ô tru c t.............................................................................131.12. K.iểu tnản^ (array)....................................................................................14
Chương 2. Xuât nhỊp ổiữ4iệu...............................................................................152.1. Xuât £Ìữ íiệu ra màn hình...................................................................... *... 15
2.1.1. Xuât dD liệu khổn^ địnla ............................................................ 152.1.2. Xuất <áữ liệu cóáịnh ứlạn^ với àẳu phảy íiộn^............................ 15
2.2. Nhâp <dữ liệu tù bàn phím........................................................................15Ct^ương 3. Các lệnh diếu khiển............................................................................ lô
3.1. Các lệnh lặp (loop)................................................................................... lô3.1.1. Lệnh^p fo r.........................................................................................lô3.1.2. vònặ iặp áo... vvhilc.............................................................. ............. 195.1.3. Vòng lập whiìe.....................................................................................213.1.4. vòriặ lặp íorcach.............................................................................. 223.1.5. Lệnh break............................................ ..........................................25
3.2. Lệríh diểu kiền................... ..................................................................... 243.2.1. Cú pháp lệnh áiếu kiện................................... ;...............................243.2.2. sủ dụng lệnh rú t gọn cho if... clsc..................................................27
3.3. Lệnh iựa chọn (ôvvitch... caee)...............................................................27Chươnạ 4. Phương thức (Method).................................................................... 29
4.1. Phương thức trề về m ộtậiá t r ị ............................................................ 294.2. Phương thức kiểu v-otí............................................................................. 514.3. Truyền áối số kiểu tham chiếu có từ khoá ref hoặc ou t....................53
2 3 7
4.3.1. Từkhoá ref....................................................................................... 344.5.2, Từ khoá o u t..................................................................................... 37
Chương 5. Lớp trong Ịập trình hdớrtq dốt tượng c# (cỉđf^ổ)......................... 395.1. Hàm tạo (con&tructor mcthOíá)............................................................ 415.2. Kiếu property - thuộc tính............................................................... .,..445.5. Mảng........................................................................................................46
5.3.1. Khai báo mản^................................................................................. 465.3.2. Máng một chiếu............................................................................. 465.5.5. Mảng ^ối tượng........................................... :................................. 4Ô5.3.4. M in^ hai chiều.................................................................................515.3.5. Từ khoấ params........................................................ :...................5&5.3.6 Chỉ mục ìnciexer............................................................................... 59
5.4. Khdnq gian tên (namespacc).................................................................. 71Chương 6. Tính thùa kấ tron0 c # (inheritance)..... ;....................................... 74
6.1. s>ù ổiụng từ khoá nevv...........................................................................740.2. & J íáụng tù khoá Virtual và override...................... . 79
Chương 7. Tính da í^ạnặ (^olymorphism)......................................................... 357.1. Hàm trùng tê n ................................................. *.................................. ...Ô67.2. Toin t i} trùng tê n .............................................................................„...09
Chương f ’. PilđS.-................................ ........... ..................................................... 101ô. ì. (3hi/dọc filỂ te x t..................................................................................... 101
ô.l.l. Ghi dữ liệu vào file.............................................................................101&.12. Pọc dừliệu từ f ile ............................................. :........................ .....101
&. 2. Ghi/dọc file nhị phân........ .........................................y ................ 106Chương 9- Chuểi kỵ tự (s tring )................................................ I .....................154
9.1. Phương thức 5tríng.Form at().........................................................—..1349.2. Phương thức ConcstQ .......................................................................... 1349.3. Phưcmg thúc Jo in ()......................................................................... -,...1359.4. rhươn^ thức ltiôe rt()........................................................................... 1369.5. Phươttg thức CopyToO..................................... ;..................................1369.6. Phương thức Trim &tart(). TrimEndQ, Trim ()....................................1379.7. Phưcniậ thức R«movổ(). FatflLeft(). PadRightO................................................. 13Ô9.ỗ>. Phương thức so ôánh các chuẩi ký tự..........................................1399.9. Phương thức xác định chuểi con (đẩu và cuối.....................................1409.10. Phương thức xác áịnh vị tr í !oý tự trong chuỗi..;.................................141
Chương 10. MULTITHREADING (Pa fuồng)......................................... ..........144
2 3 8
Chương 11. Lập trình WINP0W5 vói Cit..............................................................15511.1. L|p trình Wifidows theo kiểu khai báo................................................... 15511.2. Lập trình WirìổÌowe theo <điều khiển thư viện........................................15Ô
Chương 12. Pô hoạ tronợ W'mứ0W5.................................................................... 19412.1, V? dổ th ị các hình và các đườn<Ị cong.................................................. 19412.2, Vẽ các hình có màu tô dậm và hiển th ị s tr in g ...................................19&
Chương 13. Lập trinh cơ 6Ở ũtừ íiệu......................................................................21113.1. Tạo cơ &ở dữ liệu trong Accesô 2 0 0 0 ..................................................21113.2. xâydựnậ chương trình tron^ Conỡole Application............................ 213.15.3. XẳyổÌựniỊ chương trình trong Window6 Application.......................... 21Ô13.4. ChưíTng trình quản t r ị csdl sửdụtiậ W\z&rá.........................................225
Tài Liệu Tham Khảo............................. ............................................................. 2 3 6Mục lục.............................................................................................................. 237
2 3 9
Chịu trách nhiệm xuất bản:
Chủ tịch HĐQT kiêm Tổng Giám đốc NGÔ TRẨN á i
R ió Tổng Giám đổc kiêm Tổng biên lập NGƯYỂN q u ý t h a o
Tổ chức bản thảo và chịu trách nhiệm nội dung:
Phó Tổng biên tập PHAN DOÃN THOẠI
Giám đốc Công ty CP Sách Đ H -D N NGỎ TH Ị THANH BÌNH
Biên tập lần đầu và tái bản:
PHẠM T H Ị PHƯỢNG Trinh bày hia:
LƯU C H Í ĐỒNG Chếbàn:
PHAM Đ ÌN H PHONG
LẬ P TR ÌN H C # T Ừ C Ơ B Ả N Đ ẾN N ÂN G C A O
Mâ số: 7B656yO - DAI
líi 1.000 bản (QĐ: 32), khổ 16 X 24 cm. In tại Cõng ty CP In - Thương mại Hả TTếâày, 0ịa chí: Số 15. đưcmg Quang Trung, Quận Hà Đông, Hà Nội. Số ĐKKH xuất bản: 19 - 201Q/CXB/178 - 2244/GD, in xon; và nộp iưu chiểu tháng 7 hăm 2010,
—« CÔNG TY C ổ PHẲN SÁCH ĐẠI HỌC - DẠY NGHẾ
J j | HEVOBCOV I 25 HÁN THUYÊN - HÀ NỘI
W«bsiU : www.hftvobeo eom.vn ; T«l : 043 972471S
VƯUNO MIỆN KIMC h At LUỢNO OU
TÌM ĐỌC SÁCH THAM KHẢO KỶ THUẬTCỦA NHÀ XUẤT BẢN GIÁO DỤC VIỆT NAM
1 . Giáo trình Vật lỷ đại cutftìg> tập một
2. Giáo ừnih Vật lý đạỉ oJơĩìQ, tặp hai
3 . Bài tập Vật lý đại cuơng, tập một
4. Bài tập Vật lỷ đại cucíìg, tập hai
5. Giáo ừình Kỹ thuậl xung số
6. Giáo trình Kỹ thuật lập ữừủi c
7. Giáo ừinh Kỹ thuật mạch điện tử
8. Giáo ừinh Linh kiện điện tử
9. Giáo ừình Lýứìuyêt điổu khiến tự động
10. Giáo trình xử lý số tín hiệu
11. Giáo trinh Vi xử lý và cáu ừúc máy tính12. Giáo trinh Ktú cụ đỉện
13. Lập trình từ cơ bẳn đêh nâng cao14. Cơ sở tự động điều khiển q tá trinh
Lơơtìị Dự^ên ©nh lơơnạ Duyến Bình Lươn Duyan Bình Lương Di^ên Bình Đăng Vẫn Chuyết (CB) Nguyẩn Lính Giang (CB)
£>ăng Vắn Chuyễt (CB) Hquyễn v\ết Nguyán (CB) Phan Xuân Minh (CB) Nguyễn Quốc Trung (CB) Ngô Diễn Tâp (CB)Phđm V|n Chờ Phạm côr\ậ Ngổ Ngụyln Văn Hoà
Bạn dọc có thể mua tại các Công ĩy Sách - Thiết bị ỉruờĩìg học ở các dịa phương hoặc các Cửa hàỉiỊ cùa Nhà xuổỉ bản Giáo dục Việl Nam :Tạí Hà Nội: 25 Hàn ThuyCn ; 187B Giảng Võ ; 232 Tây Sơn ; 23 Tràng Tién ; Tại Oà Nẩng : Số 15 Nguyỗn Chí 'ITianh ; Số 62 Nguyễn Chí Thanh ;
Tại Thành phố Hổ Chí Minh : Cửa hàng 451B - 453, Hai Bà Trưng, Quận 3 ;
Chi nhánh công ly CP Sách Đại học - Dạy nghé, 240 Trán ifinh Trọng - Quận 5. Tạỉ Thành phố cẩn TTiơ: Sổ 5/5, đường 30/4 ;W6b&ít^ : vvvAv.nxbậd.vn
93 4 9 0 7 7 9 2 -Giá: 32.000 đ