Giáo trình lập trình .NET

MỤC LỤC

VISUAL STUDIO VÀ .NET FRAMEWORK .1

I. Mục tiêu . 1

II. .NET Framework . 1

II.1. Khái niệm . 1

II.2. Kiến trúc của .NET Framework. 1

II.3. Các ngôn ngữ thuộc họ .NET . 2

II.4. Các thư viện có sẵn của .Net Framework . 2

III. Visual Studio . 3

III.1. Khái niệm . 3

III.2. Cách tổ chức chương trình của Visual Studio . 3

III.3. Các dạng Project của Visual Studio . 4

IV. Ngôn ngữ lập trình C# . 4

IV.1. Khái niệm . 4

IV.2. Đặc điểm . 4

LẬP TRÌNH C# CĂN BẢN .6

I. Mục tiêu . 6

II. Bắt đầu với Console Application . 6

II.1. Tạo Project . 6

II.2. Lập trình . 8

II.3. Biên dịch . 8

II.3.1. Biên dịch từng phần . 8

II.3.2. Biên dịch toàn phần . 9

II.4. Chạy chương trình . 9

II.4.1. Chế độ debug . 10

II.4.2. Chế độ non-debug . 10

III. Biến và phạm vi hoạt động của biến trong C#. 11

III.1. Biến . 11

III.2. Phạm vi hoạt động của biến . 11

IV. Hằng. 12

V. Kiểu dữ liệu . 12

V.1. Kiểu giá trị (Value Types) . 13

V.1.1. Kiểu dữ liệu số nguyên . 13

V.1.2. Kiểu dữ liệu dấu chấm động . 13

V.1.3. Các kiểu dữ liệu khác . 13

V.2. Kiểu tham chiếu (Reference Type) . 13

VI. Cấu trúc điều kiện . 14

VI.1. Câu lệnh điều kiện if.else . 14

VI.1.1. Cú pháp . 14

VI.1.2. Cách sử dụng . 15

VI.2. Câu lệnh switch.case. 15

VI.2.1. Cú pháp . 15

Mục lục iii

VI.2.2. Cách sử dụng . 15

VII. Cấu trúc lặp . 16

VII.1. Cấu trúc lặp for . 16

VII.1.1. Cú pháp . 16

VII.1.2. Cách sử dụng . 16

VII.2. Cấu trúc lặp while . 17

VII.2.1. Cú pháp . 17

VII.2.2. Cách sử dụng . 17

VII.3. Cấu trúc lặp do.while . 17

VII.3.1. Cú pháp . 17

VII.3.2. Cách sử dụng . 17

VII.4. Các lệnh hỗ trợ cho cấu trúc lặp . 18

VII.4.1. Lệnh break . 18

VII.4.2. Lệnh continue . 18

VIII. Mảng (Array) . 19

VIII.1. Mảng một chiều . 19

VIII.1.1. Cú pháp khai báo . 19

VIII.1.2. Cách sử dụng . 19

VIII.1.3. Cấu trúc lặp foreach . 19

VIII.2. Mảng hai chiều (Ma trận) . 20

VIII.2.1. Cú pháp khai báo . 20

VIII.2.2. Cách sử dụng . 20

IX. Xử lý nhập xuất file . 21

IX.1. Khái niệm file . 21

IX.2. Phân loại . 21

IX.2.1. File văn bản (text file) . 21

IX.2.2. File nhị phân (binary file) . 22

IX.3. Đọc và ghi file văn bản . 22

IX.3.1. Đọc file văn bản bằng StreamReader . 22

IX.3.2. Ghi file văn bản bằng StreamWriter . 24

LẬP TRÌNH HƢỚNG ĐỐI TƢỢNG VỚI C# . 25

I. Mục tiêu . 25

II. Lớp (Class) . 25

III. Đối tượng (Object) . 27

IV. Thuộc tính (Attribute) . 27

V. Phương thức (Method). 27

VI. Nạp chồng toán tử (Overloading) . 28

VII. Kế thừa (Inheritance) . 29

VIII. Đa hình (Polymorphism) . 31

IX. Interface . 33

XỬ LÝ BIỆT LỆ . 34

I. Mục tiêu . 34

II. Biệt lệ (Exception) . 34

II.1. Chương trình và lỗi . 34

Mục lục iv

II.2. Khái niệm biệt lệ . 35

III. Xử lý biệt lệ (Exception Handler) . 35

III.1. Cơ chế try/catch . 35

III.2. Xử lý biệt lệ lồng nhau . 37

III.3. Xử lý biệt lệ song song . 40

THƢ VIỆN LIÊN KẾT ĐỘNG . 42

I. Mục tiêu . 42

II. Thư viện trong lập trình . 42

II.1. Khái niệm . 42

II.2. Phân loại thư viện . 43

II.2.1. Thư viện tĩnh . 43

II.2.2. Thư viện liên kết động . 43

III. Namespace . 44

IV. Thư viện liên kết động . 44

IV.1. Cách xây dựng thư viện với Visual Studio 2005 . 44

IV.1.1. Tạo một project cho thư viện . 44

IV.1.2. Cấu hình cho project . 45

IV.1.3. Xây dựng lớp và phương thức cần thiết . 46

IV.2. Cách sử dụng thư viện . 47

IV.2.1. Tạo thêm tham chiếu (add reference). . 47

IV.2.2. Khai báo tham chiếu . 48

IV.2.3. Sử dụng thư viện . 49

V. Các namespace có sẵn của .Net Framework 2.0 . 49

V.1. Namespace System.Windows.Forms. 49

V.2. Namespace System.Data . 50

LẬP TRÌNH ỨNG DỤNG WINDOWS . 51

I. Mục tiêu . 51

II. Các bảng điều khiển . 51

II.1. Toolbox panel . 52

II.2. Solution Explorer panel . 53

II.3. Properties panel . 54

III. Form và Label . 54

III.1. Form . 54

III.1.1. Khái niệm Form . 54

III.1.2. Các thuộc tính của Form . 54

III.1.3. Các sự kiện của Form . 55

III.2. Label . 56

III.2.1. Khái niệm Label . 56

III.2.2. Các thuộc tính của Label . 56

III.3. Ứng dụng Form và Label . 56

III.3.1. Tạo mới project . 56

III.3.2. Đổi tên Form chính . 57

III.3.3. Đặt tiêu đề cho Form . 58

III.3.4. Cài đặt sự kiện FormClosed . 59

III.3.5. Thêm Label vào Form . 60

Mục lục v

III.3.6. Biên dịch và chạy ứng dụng . 62

IV. TextBox và Button . 62

IV.1. TextBox . 62

IV.1.1. Khái niệm TextBox . 62

IV.1.2. Các thuộc tính của TextBox . 62

IV.1.3. Các sự kiện của TextBox . 63

IV.2. Button . 63

IV.2.1. Khái niệm Button . 63

IV.2.2. Các thuộc tính của Button . 63

IV.2.3. Các sự kiện của Button . 64

IV.3. Ứng dụng TextBox và Button . 64

IV.3.1. Tạo project, tạo Form và các Label . 64

IV.3.2. Tạo các TextBox . 64

IV.3.3. Thêm các Button . 65

IV.3.4. Cài đặt sự kiện cho từng Button . 66

IV.3.5. Biên dịch và chạy chương trình . 67

V. ComboBox, CheckBox, RadioButton . 67

V.1. ComboBox . 67

V.1.1. Khái niệm ComboBox . 67

V.1.2. Các thuộc tính của ComboBox . 67

V.1.3. Các phương thức của ComboBox . 68

V.1.4. Các sự kiện của ComboBox . 68

V.2. CheckBox . 68

V.2.1. Khái niệm CheckBox . 68

V.2.2. Các thuộc tính của CheckBox . 69

V.2.3. Các sự kiện của CheckBox . 69

V.3. RadioButton . 69

V.3.1. Khái niệm RadioButton . 69

V.3.2. Các thuộc tính của RadioButton . 69

V.3.3. Các sự kiện của RadioButton . 69

V.4. Ứng dụng ComboBox, CheckBox, RadioButton . 69

V.4.1. Tạo project, tạo Form, tạo các Label và TextBox . 70

V.4.2. Tạo các RadioButton . 70

V.4.3. Tạo ComboBox . 71

V.4.4. Tạo các CheckBox . 72

V.4.5. Tạo Button . 73

V.4.6. Biên dịch và chạy chương trình . 73

VI. MDI Form và MenuStrip . 74

VI.1. MDI Form . 74

VI.1.1. Khái niệm MDI Form . 74

VI.1.2. Các thuộc tính của MDI Form . 75

VI.2. MenuStrip . 75

VI.2.1. Khái niệm MenuStrip . 75

VI.2.2. Các thuộc tính của MenuStrip . 75

VI.3. ToolStripMenuItem . 75

VI.3.1. Khái niệm ToolStripMenuItem . 75

VI.3.2. Các thuộc tính của ToolStripMenuItem . 75

Mục lục vi

VI.3.3. Các sự kiện của ToolStripMenuItem . 76

VI.4. Ứng dụng MDI Form, MenuStrip . 76

VI.4.1. Tạo project và cấu hình MDI Form. 76

VI.4.2. Tạo Form LogIn và Form Register . 76

VI.4.3. Tạo MenuStrip . 77

VI.4.4. Viết sự kiện cho từng ToolStripMenuItem . 77

TƢƠNG TÁC CƠ SỞ DỮ LIỆU . 78

I. Mục tiêu . 78

II. ADO.NET . 78

II.1. Khái niệm . 78

II.2. Kiến trúc . 78

II.3. Các namespace phục vụ cho ADO.NET. 80

III. SqlConnection, SqlCommand . 80

III.1. SqlConnection . 80

III.1.1. Khái niêm SqlConnection . 80

III.1.2. Các thuộc tính của SqlConnection . 80

III.1.3. Các phương thức của SqlConnection . 81

III.2. SqlCommand . 81

III.2.1. Khái niệm SqlCommand . 81

III.2.2. Các thuộc tính của SqlCommand . 81

III.2.3. Các phương thức của SqlCommand . 82

III.3. Ứng dụng SqlConnection, SqlCommand, ExcuteNonQuery . 82

III.3.1. Tạo cơ sở dữ liệu . 82

III.3.2. Tạo bảng tblUser . 83

III.3.3. Tạo stored procedure . 84

III.3.4. Lập trình tương tác cơ sở dữ liệu . 85

III.3.5. Biên dịch và chạy ứng dụng . 86

IV. SqlDataReader và phương thức ExcuteReader. 87

IV.1. SqlDataReader . 87

IV.1.1. Khái niệm SqlDataReader . 87

IV.1.2. Các thuộc tính của SqlDataReader . 87

IV.1.3. Các phương thức của SqlDataReader . 87

IV.2. Phương thức ExcuteReader . 88

IV.3. Ứng dụng SqlDataReader và phương thức ExcuteReader . 88

V. SqlDataAdapter, DataSet và DataGridView. 89

V.1. SqlDataAdapter . 89

V.2. DataSet . 89

V.3. DataGridView . 90

V.3.1. Khái niệm DataGridView . 90

V.3.2. Các thuộc tính của DataGridView . 90

V.3.3. Các sự kiện của DataGridView . 90

V.4. Ứng dụng SqlDataAdapter, DataSet, DataGridView . 90

V.4.1. Tạo project . 90

V.4.2. Thêm đối tượng DataGridView . 90

V.4.3. Cài đặt sự kiện Load của Form . 91

V.4.4. Biên dịch và chạy chương trình . 92

Mục lục vii

KẾT LUẬN . 93

PHỤ LỤC . ERROR! BOOKMARK NOT DEFINED.

pdf106 trang | Chuyên mục: ASP.NET | Chia sẻ: dkS00TYs | Lượt xem: 4819 | Lượt tải: 2download
Tóm tắt nội dung Giáo trình lập trình .NET, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
hiều. Điều này 
nghĩa là người lập trình chỉ được đọc từ SqlDataReader một cách tuần tự, muốn đọc được 
dòng thứ i thì phải đọc i-1 dòng trước đó (giống như việc đọc file trên đĩa). SqlDataReader 
không cung cấp cơ chế sắp xếp cũng như cơ chế truy xuất ngẫu nhiên, do đó người lập trình 
thường sử dụng vòng lặp khi thực hiện đọc dữ liệu từ SqlDataReader để hiển thị lên giao 
diện. 
IV.1.2. Các thuộc tính của SqlDataReader 
 FieldCount: thuộc tính này trả về số trường trong record hiện hành. 
 IsClosed: thuộc tính này trả về trạng thái của SqlDataReader là đóng hay mở. 
 HasRows: thuộc tính này chỉ định SqlDataReader có record dữ liệu nào hay không. 
IV.1.3. Các phương thức của SqlDataReader 
 Close: phương thức này thực hiện việc đóng SqlDataReader và giải phóng tài nguyên. 
 GetBoolean, GetByte, GetChar, GetDateTime, GetDecimal: lấy các giá trị tại cột đang 
xét tùy vào kiểu dữ liệu. 
 GetValue, GetValues: lấy về giá trị hoặc tập giá trị ở dạng “nguyên thủy” ( kiểu dữ 
liệu gốc của Database). 
 Read: Đọc record tiếp theo của DataReader. 
Lập trình .Net 
 88 
IV.2. Phƣơng thức ExcuteReader 
ExcuteReader là phương thức của đối tượng SqlCommand, phương thức này thực hiện 
việc truy vấn cơ sở dữ liệu trong trường hợp nội dung câu truy vấn (CommandText) là câu 
lệnh select. Kết quả trả về của phương thức ExcuteReader là SqlDataReader, đối tượng này tổ 
chức dữ liệu thành bảng giống như kết quả trả về của câu lệnh truy vấn trong hệ quản trị cơ sở 
dữ liệu. 
IV.3. Ứng dụng SqlDataReader và phƣơng thức ExcuteReader 
Ví dụ sau trình bày việc ứng dụng DataReader và phương thức ExcuteReader để xử lý sự 
kiện LogIn trong ứng dụng đã trình bày ở mục IV.3 của chương 6. Trong sự kiện LogIn này, 
chương trình sẽ xử lý việc truy vấn cơ sở dữ liệu để kiểm tra xem tài khoản có AccountName 
và Password mà người sử dụng nhập vào từ các TextBox đã có sẵn trong cơ sở dữ liệu hay 
không. Đoạn mã của sự kiện LogIn như sau. 
Hình 95 – Ứng dụng DataReader và ExcuteQuery 
Trong đoạn mã trên thực hiện việc kiểm tra đăng nhập bằng cách thực hiện lệnh truy vấn 
select. Lệnh này thực hiện việc tìm trong bảng tblUser các record có AccoutName và 
AccountPassword trùng với dữ liệu nhập vào từ các TextBox. Kết quả thu được từ câu lệnh 
truy vấn này được lưu trữ trong đối tượng SqlDataReader. Nếu đối tượng này có record 
Lập trình .Net 
 89 
(HasRows = true) thì tài khoản người dùng nhập vào là hợp lệ và chương trình sẽ thông báo 
đăng nhập thành công, ngược lại thì chương trình sẽ báo lỗi. 
V. SqlDataAdapter, DataSet và DataGridView 
V.1. SqlDataAdapter 
SqlDataAdapter là một khái niệm .Net Framework, khái niệm này được dùng để chỉ đối 
tượng làm cầu nối giữa cơ sở dữ liệu và DataSet. SqlDataAdapter chứa một phần dữ liệu của 
cơ sở dữ liệu và hoạt động theo cơ chế “kết nối”. Với cơ chế “kết nối”, SqlDataAdapter được 
trang bị một số phương thức để lấy giữ liệu từ cơ sở dữ liệu hoặc điền ngược dữ liệu vào cơ 
sở dữ liệu khi cần thiết. 
Các thuộc tính thông dụng của SqlDataAdapter bao gồm: 
 SelectCommand: Thuộc tính này quy định câu lệnh select của SqlDataAdapter. Câu 
lệnh select của thuộc tính này thường được triệu gọi khi SqlDataAdapter thực hiện 
phương thức Fill(). 
 InsertCommand, UpdateCommand, DeleteCommand: Các thuộc tính này lần lượt quy 
định câu lệnh insert, update, delete của SqlDataAdapter. Các câu lệnh này được triệu 
gọi khi SqlDataAdapter thực hiện phương thức Update() để cập nhật dữ liệu từ 
SqlDataAdapter vào cơ sở dữ liệu. 
Các phương thức thông dụng của SqlDataAdapter bao gồm: 
 Fill: Đối số của phương thức này là DataSet hoặt DataTable. Phương thức này thực 
hiện việc điền dữ liệu tương ứng với câu lệnh select từ cơ sở dữ liệu vào một DataSet 
hoặc DataTable. 
 Update: Thực hiện việc cập nhật dữ liệu từ SqlDataAdaper vào cơ sở dữ liệu. 
V.2. DataSet 
DataSet là khái một niệm của .Net Framework, khái niệm này được dùng để chỉ đối tượng 
ở tầng “không kết nối” trong mô hình ADO.NET. DataSet được thiết kế tách biệt với cơ sở 
dữ liệu và khi vận hành không cần biết đến việc cơ sở dữ liệu thuộc kiểu gì, kết nối ra sao. 
Nhiệm vụ của DataSet là nhận dữ liệu về từ DataAdapter và xử lý nó. 
DataSet có thể được xem như một cơ sở dữ liệu trong bộ nhớ gồm tất cả các bảng, dữ liệu, 
quan hệ và ràng buộc dữ liệu. DataSet có nhiều đối tượng cấp thấp hơn đi kèm với nó như : 
DataTable (tương đương với một bảng), cấp thấp hơn của DataTable có các đối tượng 
DataRow (tương đương với một dòng), DataColumn (tương đương với một cột), 
DataRelation (tương đương với các quan hệ). 
DataSet nhận dữ liệu từ DataAdapter thông qua phương thức Fill() và dữ liệu này được 
hiển thị lên giao diện thông qua thuộc tính DataSource của đố tượng trình bày. Việc sử dụng 
DataSet là một tiến bộ lớn của kiến trúc ADO.NET tuy nhiên với các ứng dụng Website, việc 
Lập trình .Net 
 90 
sử dụng DataSet không được khuyến khích vì đối tượng DataSet được xem là quá lớn, nặng 
nề khó thích hợp cho đường truyền vốn rất hạn chế. 
V.3. DataGridView 
V.3.1. Khái niệm DataGridView 
DataGridView là khái niệm dùng để chỉ đối tượng trình bày giao diện trên Form, đối tượng 
này bố trí dữ liệu thành nhiều cột và nhiều hàng. Đối tượng này còn được gọi là lưới dữ liệu. 
V.3.2. Các thuộc tính của DataGridView 
 DataSource: Thuộc tính này quy định bảng dữ liệu được hiển thị lên giao diện. Đối 
tượng được gán vào thuộc tính này thông thường là DataTable. 
 CurrentRow: Thuộc tính này trả về dòng đang được chọn, thông tin trong dòng này 
được chứa đựng trong đối tượng DataGridViewRow. 
 CurrentCell: Thuộc tính này trả về ô đang được chọn, thông tin trong ô này được chứa 
đựng trong đối tượng DataGridViewCell. 
V.3.3. Các sự kiện của DataGridView 
 SelectionChanged: Sự kiện này xảy ra khi người sử dụng di chuyển con trỏ soạn thảo 
trên các dòng của DataGridView. 
 DoubleClick: Sự kiện này xảy ra khi người sử dụng kích đúp chuột vào 
DataGridView. 
V.4. Ứng dụng SqlDataAdapter, DataSet, DataGridView 
Ví dụ sau trình bày việc ứng dụng SqlDataAdapter, DataSet và DataGridView trong việc 
hiển thị dữ liệu từ cơ sở dữ liệu lên giao diện. Ứng dụng được thực hiện từng bước như sau: 
V.4.1. Tạo project 
Thực hiện tạo project Windows Application như đã trình bày ở mục IV.3 chương 6. Sau 
khi project được tạo thì một Form chính có tên là Form1 được tạo ra. 
V.4.2. Thêm đối tượng DataGridView 
Thực hiện việc kéo thả đối tượng DataGridView từ Toolbox panel vào Form chính. Sau đó 
đặt tên cho DataGridView. Trong trường hợp này, DataGridView được đặt tên là myGrid1. 
Lập trình .Net 
 91 
Hình 96 – Cấu hình DataGridView 
V.4.3. Cài đặt sự kiện Load của Form 
Như đã trình bày ở chương trước, sự kiện Load của Form xảy ra khi Form được khởi tạo. 
Trong ứng dụng này, sự kiện Load thực hiện việc kết nối cơ sở dữ liệu và lấy thông tin, sau 
đó điền vào DataGridView để hiển thị trên Form. Đoạn mã của sự kiện này được cài đặt như 
sau: 
Hình 97 – Sử dụng DataAdapter, DataSet và DataGridView 
Lập trình .Net 
 92 
Trong đoạn mã mình họa trên, đối tượng SqlDataAdapter được khởi tạo bằng cách cung 
cấp hai tham số: câu lệnh truy vấn và đối tượng SqlConnection. Sau khi khởi tạo, đối tượng 
SqlDataAdapter thực hiện phương thức Fill() để điền dữ liệu từ cơ sở dữ liệu vào một bảng có 
tên là “tblUser” trong DataSet. Bảng này được hiển thị lên giao diện bằng cách gán nó cho 
thuộc tính DataSource của đối tượng DataGridView. 
V.4.4. Biên dịch và chạy chương trình 
Thực hiện biên dịch và chạy chương trình được kết quả như sau: 
Hình 98 – Kết quả chạy chƣơng trình 
Kết quả chạy chương trình này hoàn toàn giống với kết quả khi thực hiện hiển thị dữ liệu 
của Sql Server bằng Enterprise Manager ở hình 94. 
Lê Văn Minh – Trường Cao đẳng Công nghệ Thông tin, Đại học Đà Nẵng 93 
KẾT LUẬN 
Giáo trình này trình bày phương pháp lập trình .NET với ngôn ngữ C# của phiên bản 
Visual Studio 2005. Tuy giáo trình chỉ trình bày những nội dung cơ bản nhất của công nghệ 
.NET, nhưng với những kiến thức này, người lập trình có thể tự nghiên cứu các chuyên đề cao 
hơn. Từ những nội dung trong giáo trình và những kiến thức từ các học phần tiên quyết của 
học phần này, người học có đủ kiến thức để xây dựng một ứng dụng Windows. 
Tuy nhiên, giáo trình được viết cho sinh viên cao đẳng nên về nội dung còn có nhiều hạn 
chế, cách tiếp cận vấn đề chưa thật sự chính xác và cách giải quyết vấn đề chưa hoàn toàn tối 
ưu và tổng quát. Giáo trình chỉ đi sâu vào kỹ năng thực hành, các ví dụ minh họa được trình 
bày theo phương pháp “hướng dẫn từng bước” (step – by – step) nên giáo trình chưa thể 
hướng người học đến tư duy trừu tượng của lập trình bậc cao. Do thời lượng giảng dạy không 
nhiều nên giáo trình cũng chưa thể trình bày một ứng dụng hoàn chỉnh của một dự án phần 
mềm thực tế. 
Cuối cùng, tác giả mong người học có những góp để kịp thời cải tiến và hoàn thiện. 
 1 
TÀI LIỆU THAM KHẢO 
[1] Phương Lan. Lập trình Windows với C#.Net. Nhà xuất bản lao động – xã hội 
[2] Phạm Hữu Khang, Đoàn Thiện Ngân. C# 2005. Tập 1, 2, 3, 4, 5. Nhà xuất bản Lao 
động và Xã hội. 
[3] Jesse Liberty. Programming C# for Visual Studio .NET. O’Reilly. 
[4] Jason Price. Mastering C Sharp Database Programming. Sybex. 
[5] Jesse Liberty. Programming C#. O’Reilly. 
[6] Rebecca M. Riordan. Microsoft ADO.NET Step by Step. MS Press. 
Lập trình .Net 
 2 
Tãn taïc giaí åí âáy, LÅÏP XXX 3 
TÓM TẮT LUẬN VĂN TỐT NGHIỆP 
Phần này viết tên đề tài (chữ nhỏ 13pt) và : 
tóm tắt nội dung LUẬN VĂN TỐT NGHIỆP, viết ngắn gọn và rõ ràng 
(15 đến 20 dòng) cho biết : 
 Đề tài đã được đặt ra như thế nào (bối cảnh), mục đích (giải thích rõ hơn tên đề tài) và 
nhiệm vụ phải thực hiện (các mục tiêu cụ thể và kết quả cần có) 
 SV đã giải quyết vấn đề gì (đã nghiên cứu lý thuyết, thực tiễn như thế nào, đã đề xuất 
được những giải pháp (biện pháp) hay sáng kiến gì ?). 
 SV đã giải quyết đến đâu (nêu một số kết quả tiêu biểu). 

File đính kèm:

  • pdfGiáo trình lập trình .NET.pdf
Tài liệu liên quan