117
-1- TRƯỜNG ĐẠI HỌC SƯ PHẠM KTHUẬT HƯNG YÊN KHOA CÔNG NGHTHÔNG TIN ĐỀ CƯƠNG HC PHN: CHUYÊN ĐỀ LA CHN 02 HỆ: CAO ĐẲNG CHÍNH QUY (Tài liệu lưu hành nội b) Hưng Yên – Tháng 08 năm 2012

04 de cuong

Embed Size (px)

Citation preview

Page 1: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 1 -

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊNKHOA CÔNG NGHỆ THÔNG TIN

ĐỀ CƯƠNGHỌC PHẦN: CHUYÊN ĐỀ LỰA CHỌN 02

HỆ: CAO ĐẲNG CHÍNH QUY(Tài liệu lưu hành nội bộ)

Hưng Yên – Tháng 08 năm 2012

Page 2: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 2 -

MỤC LỤC

MỤC LỤC............................................................................................................. 2

CHƯƠNG 1: KIẾN TRÚC CỦA .NET................................................................ 4

1.1. Môi trường thực thi ngôn ngữ chung – CLR ........................................ 4

1.2. Ngôn ngữ trung gian - IL....................................................................... 5

1.3. Giới thiệu về .Net Framework............................................................... 6

CHƯƠNG 2: LẬP TRÌNH WINDOWS FORMS ................................................ 7

2.1. Tạo một ứng dụng Windows form ........................................................ 7

2.2. Lớp Control ........................................................................................... 8

2.3. Form....................................................................................................... 8

2.3.1. Chức năng ....................................................................................... 8

2.3.2. Một số thuộc tính thường dùng....................................................... 8

2.3.3. Một số sự kiện thường dùng ......................................................... 11

2.4. Tập hợp................................................................................................ 15

2.4.1. Khái niệm ......................................................................................... 15

2.4.2. Các thuộc tính, phương thức lớp Collection .................................... 15

2.5. Một số control...................................................................................... 16

2.5.1. Button............................................................................................ 16

2.5.2. Combobox ..................................................................................... 16

2.5.3. WebBrowser.................................................................................. 18

2.5.4. Textbox.......................................................................................... 20

2.5.5. MaskedTextbox............................................................................. 27

2.5.6. RichTextBox ................................................................................. 27

2.5.7. Nhóm điều khiển Menu................................................................. 32

Page 3: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 3 -

2.5.8. Nhóm điều khiển Dialog ............................................................... 35

2.5.9. ListView........................................................................................ 43

2.5.10. DataGridView ............................................................................ 61

2.6. User Control ........................................................................................ 80

2.6.1. Khái niệm...................................................................................... 80

2.6.2. Cách xây dựng các User Control .................................................. 80

2.7. Thao tác với file XML......................................................................... 81

2.8. Thao tác với Registry .......................................................................... 86

CHƯƠNG 3: LẬP TRÌNH CƠ SỞ DỮ LIỆU.................................................... 89

3.1. Giới thiệu ADO.NET .......................................................................... 89

3.2. Các mô hình thao tác với CSDL.......................................................... 90

3.3. Kết nối đến nguồn dữ liệu bằng đối tượng Connection ...................... 91

3.4. Thực thi câu lệnh SQL bằng đối tượng Command ............................. 94

3.5. Truy vấn và nhận về dữ liệu với DataReader...................................... 99

3.6. Cập nhật và truy vấn dữ liệu với đối tượng DataAdapter ................. 101

3.7. Mô hình DataSet................................................................................ 103

3.8. Sử dụng DataView trong sắp xếp và tìm kiếm dữ liệu ..................... 105

3.9. Ràng buộc dữ liệu với các điều khiển ............................................... 105

CHƯƠNG 4: CRYSTAL REPORT.................................................................. 106

4.1. Thiết kế báo cáo với Crystal Report.................................................. 106

4.2. Nạp và hiển thị Report trong chương trình ....................................... 114

4.3. Thiết kế Report động......................................................................... 115

Page 4: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 4 -

CHƯƠNG 1: KIẾN TRÚC CỦA .NET

1.1. Môi trường thực thi ngôn ngữ chung – CLR

Như đã đề cập thì CLR thực hiện quản lý bộ nhớ, quản lý thực thi tiểu trình,

thực thi mã nguồn, xác nhận mã nguồn an toàn, biên bịch và các dịch vụ hệ thống

khác. Những đặc tính trên là nền tảng cơ bản cho những mã nguồn được quản lý chạy

trên CLR.

Do chú trọng đến bảo mật, những thành phần được quản lý được cấp

những mức độ quyền hạn khác nhau, phụ thuộc vào nhiều yếu tố nguyên thủy của

chúng như: liên quan đến Internet, hệ thống mạng trong nhà máy, hay một máy tính

cục bộ. Điều này có nghĩa rằng, một thành phần được quản lý có thể có hay không có

quyền thực hiện một thao tác truy cập tập tin, thao tác truy cập registry, hay các chức

năng nhạy cảm khác.

CLR thúc đẩy việc mã nguồn thực hiện việc truy cập được bảo mật. Ví dụ,

người sử dụng giới hạn rằng việc thực thi nhúng vào trong một trang web có thể chạy

được hoạt hình trên màn hình hay hát một bản nhạc, nhưng không thể truy cập được

dữ liệu riêng tư, tập tin hệ thống, hay truy cập mạng. Do đó, đặc tính bảo mật của CLR

cho phép những phần mềm đóng gói trên Inernet có nhiều đặc tính mà không ảnh

hưởng đến việc bảo mật hệ thống.

CLR còn thúc đẩy cho mã nguồn được thực thi mạnh mẽ hơn bằng việc thực thi

mã nguồn chính xác và sự xác nhận mã nguồn. Nền tảng của việc thực hiện

này là Common Type System (CTS). CTS đảm bảo rằng những mã nguồn được

quản lý thì được tự mô tả (self- describing). Sự khác nhau giữa Microsoft và các

trình biên dịch ngôn ngữ của hãng thứ ba là việc tạo ra các mã nguồn được quản lý có

thể thích hợp với CTS. Điều này thì mã nguồn được quản lý có thể sử dụng những

kiểu được quản lý khác và những thể hiện, trong khi thúc đẩy nghiêm ngặt việc sử

dụng kiểu dữ liệu chính xác và an toàn.

Thêm vào đó, môi trường được quản lý của runtime sẽ thực hiện việc tự động

xử lý layout của đối tượng và quản lý những tham chiếu đến đối tượng, giải phóng

chúng khi chúng không còn được sử dụng nữa. Việc quản lý bộ nhớ tự động này còn

giải quyết hai lỗi chung của ứng dụng: thiếu bộ nhớ và tham chiếu bộ nhớ không hợp

lệ.

Page 5: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 5 -

Trong khi runtime được thiết kế cho những phần mềm của tương lai, nó cũng

hỗ trợ cho phân mềm ngày nay và trước đây. Khả năng hoạt động qua lại giữa mã

nguồn được quản lý và mã nguồn không được quản lý cho phép người phát triển tiếp

tục sử dụng những thành phần cần thiết của COM và DLL.

Rutime được thiết kế để cải tiến hiệu suất thực hiện. Mặc dù CLR cung cấp

nhiều các tiêu chuẩn dịch vụ runtime, nhưng mã nguồn được quản lý không bao giờ

được dịch. Có một đặc tính gọi là Just-in-Time (JIT) biên dịch tất cả những mã nguồn

được quản lý vào trong ngôn ngữ máy của hệ thống vào lúc mà nó được thực thi.

Khi đó, trình quản lý bộ nhớ xóa bỏ những phân mảnh bộ nhớ nếu có thể được và

gia tăng tham chiếu bộ nhớ cục bộ, và kết quả gia tăng hiệu quả thực thi.

1.2. Ngôn ngữ trung gian - IL

Như chúng ta đã biết, Intermediate Language hoạt động như là bản chất của

.NET Framework. Là lập trình viên C#, chúng ta nên biết rằng mã C# sẽ luôn được

dịch sang Intermediate Language trước khi nó được thực thi (thật vậy, trình biên dịch

C# chỉ dịch sang mã có quản). Chúng ta hãy cùng khám phá các tính năng chính của

IL, bất kì ngôn ngữ nào hướng .NET cũng sẽ hỗ trợ các đặc tính chính của IL.

Sau đây là những đặc tính chính của Intermediate Language:

Hướng đối tượng và dùng interfaces

Sự tách biệt giữa kiểu giá trị và kiểu tham chiếu

Định kiểu mạnh

Quản lỗi thông qua các ngoại lệ

Sự dụng các thuộc tính

Page 6: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 6 -

1.3. Giới thiệu về .Net Framework

.NET Framework là một platform mới làm đơn giản việc phát triển ứng dụng

trong môi trường phân tán của Internet. .NET Framework được thiết kế đầy đủ để đáp

ứng theo quan điểm sau:

Để cung cấp một môi trường lập trình hướng đối tượng vững chắc,

trong đó mã nguồn đối tượng được lưu trữ và thực thi một cách cục bộ.

Thực thi cục bộ nhưng được phân tán trên Internet, hoặc thực thi từ xa.

Để cung cấp một môi trường thực thi mã nguồn mà tối thiểu được việc

đóng gói phần mềm và sự tranh chấp về phiên bản.

Để cung cấp một môi trường thực thi mã nguồn mà đảm bảo việc thực thi

an toàn mã nguồn, bao gồm cả việc mã nguồn được tạo bởi hãng thứ ba

hay bất cứ hãng nào mà tuân thủ theo kiến trúc .NET.

Để cung cấp một môi trường thực thi mã nguồn mà loại bỏ được những lỗi

thực hiện các script hay môi trường thông dịch.

Để làm cho những người phát triển có kinh nghiệm vững chắc có thể nắm

vững nhiều kiểu ứng dụng khác nhau. Như là từ những ứng dụng trên nền

Windows đến những ứng dụng dựa trên web.

Để xây dựng tất cả các thông tin dựa triên tiêu chuẩn công nghiệp để đảm bảo

rằng mã nguồn trên .NET có thể tích hợp với bất cứ mã nguồn khác.

Page 7: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 7 -

CHƯƠNG 2: LẬP TRÌNH WINDOWS FORMS

2.1. Tạo một ứng dụng Windows form

Bước 1: Khởi động VS2008 và chọn Fille NewProject …

Bước 2: Chọn Ứng dụng dạng Windows Forms Application, chọn nơi lữu trữProject (xem hình) nhấn OK.

Page 8: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 8 -

2.2. Lớp Control

Xem slide

2.3. Form

2.3.1. Chức năngForm (hay còn gọi điều khiển Form) dùng để chứa các điều khiển khác

(Buttons, Label…)

2.3.2. Một số thuộc tính thường dùng

Tên Ỹ nghĩa

Name Tên của Form. Trong một Project tên của các Form phải

khác nhau.

AcceptButton Giá trị mà thuộc tính này nhận là tên của một Button

trên Form (Nếu Form có chứa button). Khi đó nếu bạn

nhấn phím Enter thì sự kiện Click của Button mà bạn

chọn được thực thi mà không cần nhấn chuột vào

Button đó.

Autosize Nhận một trong hai giá trị True hay False

- True: Không cho phép thay đổi kích thước Form mà

che đi các điều khiển khác chứa trên Form

- False: Ngược lại

AutoSizeMode Cho phép thay đổi kích thước của Form hay không?

(Khi di chuyển chuột vào các mép của Form mà hiện

nên biểu tượng ↔ là cho phép). Và nhận một trong hai

giá trị - GrowOnly: Cho phép- và GrowAndShrink: Không cho phép

BackColor Chọn màu nền cho Form

Page 9: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 9 -

BackGroundImage Chọn ảnh làm nền cho Form

CancelButton Giá trị mà thuộc tính này nhận là tên của một Button

trên Form (Nếu Form có chứa button). Khi đó nếu bạn

nhấn phím ESC thì sự kiện Click của Button mà bạn

chọn được thực thi mà không cần nhấn chuột vào

Button đó (tương tự như thuộc tính AcceptButton ).

ControlBox Nhận một trong hai giá trị True hay False- True: Cho phép các các nút:

MaximizeBox, MinimizeBox, Close trên

Titlebar xuất hiện- False: Không Cho phép các các nút:

MaximizeBox, MinimizeBox, Close trên

Titlebar xuất hiện (Khi đó các thuộc tính

MaximizeBox, MinimizeBox của Form

cũng mất đi)

Font Chọn kiểu Font chữ cho Form (Khi đó tất cả các điều

khiển được thêm vào Form sẽ có thuộc tính Font giống

như thuộc tính Font của Form)

ForeColor Tương tự như thuộc tính Font nhưng áp dụng đối với

màu chữ

FormBorderStyle Chọn Style cho Form (Có 7 lựa chọn khác nhau).

HelpButton Nhận một trong hai giá trị True hay False.- True: Cho phép xuất hiện Buton có dấu ?

trên Titlebar (Với điều kiện: hai thuộc tính

MaximizeBox, MaximizeBox phải đặt giá

trị là False)- False: Ngược lại

→ Thuộc tính này sẽ hay đi kèm với điều khiển

Page 10: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 10 -

HelpProvider về sau

Icon Chọn một Icon (có đuôi mở rộng là .ico) trên máy tính

của bạn thay cho Icon mặc định của Form mà VS tạo ra

KeyPreview Nhận một trong hai giá trị True hay False- True: Cho phép các sự kiện về bàn phím

của Form (KeyUp, KeyDown, KeyPress…

của Form) có hiệu lực.- False: Ngược lại

MaximizeBox Nhận một trong hai giá trị True hay False- True: Cho phép nút MaximizeBox trên

Titlebar có hiệu lực- False: Ngược lại

MaximizeBox Tương tự như thuộc tính MaximizeBox

Opacity Độ trong suốt của Form

ShowIcon Nhận một trong hai giá trị True hay False- True: Cho phép xuất hiện Icon của Form- False: Không cho phép xuất hiện Icon của

Form

ShowInTaskbar Nhận một trong hai giá trị True hay False- True: Cho phép hiện Form dưới khay

Taskbar- False: Ngược lại

StartPosition Vị trí hiển thị của Form so với màn hình hệ thống hay

Form cha (5 lựa chọn khác nhau)

Text Giá trị Text của Form

WindowState Trạng thái hiển thị của Form khi chạy (Khi bạn nhấn

Page 11: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 11 -

vào nút Run của VS) (Có 3 lựa chọn khác nhau: Ẩn

dưới khay Taskbar, mở rộng hết màn hình…).

2.3.3. Một số sự kiện thường dùng

Tên Ỹ nghĩa

AutoSizeChanged Xảy ra khi thuộc tính Autosize của Form chuyển từ

True → False hay ngược lại là False → True.

BackColorChanged Xảy ra khi thuộc tính BackColor của Form thay đổi

Click Xảy ra khi người dùng Click chuột vào vùng làm việc

thuộc Form

ControlAdded Xảy ra khi một điều khiển được Add vào Form

ControlRemoved Xảy ra khi một điều khiển bị xóa khỏi Form

CursorChanged Xảy ra khi thuộc tính Cursor của Form thay đổi

DoubleClick Xảy ra khi người dùng DoubleClick vào vùng làm việc

của Form

FontChanged Xảy ra khi thuộc tính Font của Form có sự thay đổi

ForeColorChanged Xảy ra khi thuộc tính ForeColor của Form có sự thay

đổi

FormClosed Xảy ra khi Form đã đóng (Nhấn vào nút X màu đỏ trên

Titlebar)

FormClosing Xảy ra khi Form đang đóng (2 sự kiện FormClosed và

FormClosing thường dùng trong lập trình CSDL: khi

xảy ra sự kiện này thì đóng kết nối CSDL)

KeyDown Xảy ra khi người dùng nhấn một phím hay một tố hợp

phím (tùy thuộc vào xử lý của chúng ta)

Page 12: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 12 -

KeyPress Xảy ra khi người dùng nhấn một phím

KeyUp Xảy ra khi người dùng nhả một phím.

MouseClick Xảy ra khi người dùng nhấn chuột (một trong 3 lựa

chọn: Trái, giữa, phải)

MouseDoubleClick Xảy ra khi người dùng DoubleClick chuột vào một

vùng làm việc của Form(một trong 3 lựa chọn: Trái,

giữa, phải)

MouseDown Xảy ra khi người dùng nhấn chuột

MouseHover Xảy ra khi người dùng di chuyển vào các vùng làm việc

Form

MouseLeave Xảy ra khi di chuyển chuột ra khỏi vùng làm việc của

Form

MouseMove Xảy ra khi di chuyển chuột trên một vùng làm việc

thuộc Form (nếu Form có chứa một điều khiển nào đó,

khi di chuyển chuột trên điều khiển này thì không xảy

ra sự kiện MouseMove của Form).

MouseUp Xảy ra khi người dùng nhả nhấn chuột (có thể là chuột

trái, chuột phải, chuột giữa - chuột cuộn)

Move Xảy ra khi di chuyển Form (có sự thay đổi vị trí của

Form)

StyleChanged Xảy ra khi thuộc tính FormBorderStyle của Form thay

đổi

TextChanged Xảy ra khi thuộc tính Text của Form thay đổi.

2.3.4. Minh họa

Page 13: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 13 -

2.3.4.1. Sự kiện FormClosed//Sự kiện FormClosed - Sự kiện này được gọi khi Form đã đóng

private void frmForm_FormClosed(object sender, FormClosedEventArgs e)

{

MessageBox.Show("Sự kiện FormClosed được gọi","FormClosed",MessageBoxButtons.OK,MessageBoxIcon.Information);

}

2.3.4.2. Sự kiện FormClosing//Sự kiện FormClosing xảy ra khi Form đang đóng

private void frmForm_FormClosing(object sender, FormClosingEventArgs e)

{

if (MessageBox.Show("Bạn có muốn đóng Form lại hay không?","FormClosing",

MessageBoxButtons.YesNo, MessageBoxIcon.Information) ==DialogResult.Yes)

e.Cancel = false;// Đóng Form lại (hủy bỏ việc đóng form)

else

e.Cancel = true;//Không đóng Form nữa

}

2.3.4.3. Sự kiện KeyPress

//Sự kiện KeyPress

private void frmForm_KeyPress(object sender, KeyPressEventArgs e)

{

//Nếu không chỉ rõ phím nào được nhấn thì khi nhấn bất cứ phím nào sựkiện KeyPress của Form đều xảy ra

//Chỉ rõ phím nào được nhấn thì phát sinh sự kiện KeyPress làm như sau

if (e.KeyChar = 'a')

MessageBox.Show("Sự kiện KeyPress xảy ra khi bạn nhấn phím a");

Page 14: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 14 -

}

//Sự kiện KeyUp tương tự như sự kiện KeyPress

//Sự kiện KeyDown xảy ra khi nhấn một phím hay tổ hợp phím

2.3.4.4. Sự kiện KeyDownprivate void frmForm_KeyDown(object sender, KeyEventArgs e)

{

//khi nhấn một phím bất kì trên bàn phím thì sự kiện KeyPressđược gọi

//Đồng thời sự kiện KeyDown cũng được gọi → KeyPress làtrường hợp riêng của KeyDown

//Áp dụng: Nhấn một tổ hợp phím thì sự kiện KeyDown mớiđược gọi

//Như Windows Media: Nhấn Ctrl+F để di chuyển bài tiếp theo

if (e.KeyCode == Keys.F && e.Modifiers == Keys.Control)

MessageBox.Show("Sự kiện KeyDown được gọi khi bạn nhấnCtrl + F");

}

2.3.4.5. Sự kiện MouseClick//Sự kiện MouseClick

private void frmForm_MouseClick(object sender, MouseEventArgs e)

{

//Nếu bạn không muốn biết người dùng nhấn chuột TRÁI hay PHẢI hayGIỮA thì khi nhấn bất kì

//Chuột nào cũng xảy ra sự kiện MouseClick của Form

//Còn nếu bạn muốn bắt được sự kiện người dùng nhấn chuột TRÁI,PHẢI, hay GIỮA làm thế này

if (e.Button == MouseButtons.Left)

MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuộtTRÁI");

else if (e.Button==MouseButtons.Middle)

Page 15: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 15 -

MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuộtGIỮA");

else if (e.Button==MouseButtons.Right)

MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuộtPHẢI");

}

//Các sự kiện MouseDoubleClick, MouseDown, MouseUp... Xử lýtương tự

2.4. Tập hợp

2.4.1. Khái niệm

Là một kiểu dữ liệu dùng lưu trữ nhiều phần tử có cùng đặc tính. Ví dụ: Mảng,

Tập các nút lệnh chứa trên Form, tập các phần tử (Item) của Combobox,

Listbox……….

2.4.2. Các thuộc tính, phương thức lớp Collection

• Count/Length: Lấy về số phần tử của tập hợp.

• Add, AddRange: Thêm phần tử vào tập hợp.

• Remove, RemoveAt: Xóa phần tử khỏi tập hợp.

• Clear: Xóa toàn bộ các phần tử khỏi tập hợp.

• Insert: Chèn một phần tử vào tập hợp (Khác với Add luôn thêm phần tửmới vào cuối tập hợp, Insert thêm vào một vị trí xác định nào đótrong tập hợp).

• Items[i]: Lấy một phần tử thứ i trong tập hợp.

Page 16: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 16 -

2.4.3. Duyệt các phần tử trong tập hợp

Để duyệt các phần tử trong tập hợp người ta thường sử dụng vòng lặp ForEarch

foreach (biến in biến_Tập_hợp){Xử lý giá trị lấy được}

2.5. Một số control

2.5.1. Button2.5.2. Combobox

2.5.2.1. Chức năng

Lưu trữ các mục dữ liệu (phần tử) dưới dạng danh sách

2.5.2.2. Một số thuộc tính thường dùng

Tên Ý nghĩa

Anchor Xác định vị trí “neo đậu” của điều khiển so với Form

AutoCompleteCustomSource Xác định các phần tử cho tính năng AutoComplete của

Combobox (Tức là tính năng AutoComplete chỉ áp

dụng trên các phần tử này - Nếu thuộc tính

AutoCompleteSource là CustomSource)

AutoCompleteMode Kiểu tự động tìm kiếm các phần tử trong Combobox.

Có một số lựa chọn sau

- Suggest: Hiển thị kết qủa ra bên dưới

- Append: Tự động điền vào Combobox và không

hiển thị ra bên dưới

- SuggestAppend=Suggest+Append

AutoCompleteSource Chọn nguồn các Item cho Combobox sử dụng tính

năng AutoComplete. Chú ý một số lựa chọn sau:

- HistoryList: Danh sách các Url lưu trong Historycủa IE

- ListItems: Các phần tử của Combobox được thêm

vào thông qua thuộc tính Items

- CustomSource: Giá trị các phần tử trong thuộc tính

AutoCompleteCustomSource

Page 17: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 17 -

BackColor Chọn màu nền cho Combobox

Cursor Hình dáng của chuột khi di chuyển vào Combobox

DataSource Chọn nguồn dữ liệu (nguồn các phần tử) cho

Combobox (Có thể là một mảng dữ liệu kiểu string,

một trường trong CSDL…)

Dock Vị trí bám dính của Combobox

Enabled Cho phép Combobox có hiệu lực hay không?

Font Chọn Font cho Combobox

ForeColor Chọn màu chữ của các phần tử (Item) của Combobox

Items Quản lý các phần tử trong Combobox (thêm các phần

tử vào Combobox, xóa đi…)

Text Giá trị ứng với phần tử đang được chọn

Sorted Nếu chọn là True: Tự động sắp xếp các phần tử trong

Combobox theo giá trị tăng dần

SelectedIndex Get/Set chỉ số của phần tử đang chọn

Chú ý: Các điều khiển có rất nhiều thuộc tính giống nhau: Anchor, Dock, Font,ForeColor, Enabled, Visible, TabIndex……Các thuộc tính này là giống nhau với tất cảcác điều khiển

2.5.2.3. Một số phương thức thường dùng

Tên Ý nghĩa

Add Thêm một phần tử vào Combobox

AddRange Thêm một mảng các phần tử vào Combobox

……………. → Tập các Item có các phương thức và thuộc tính của Collection

2.5.2.4. Một số sự kiện thường dùng

Tên Ý nghĩa

Page 18: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 18 -

SelectedIndexChanged Xảy ra khi người dùng chọn phần tử khác khác

Chú ý: Các điều khiển (Form, Label ,Button…) có rất nhiều các sự kiện giống nhau. Ý

nghĩa của các sự kiện này là giống nhau với các điều khiển

2.5.3. WebBrowser

2.5.3.1. Chức năngDuyệt các trang Web, hiển thị các File với các định dạng khác nhau.

2.5.3.2. Một số thuộc tính thường dùng

Tên Ý Nghĩa

ScrollBarsEnabled Nhận một trong hai giá trị True hay False

- True: Cho phép điều khiển hiển thị thanh cuộn.- False: Ngược lại

Url Giá trị mà thuộc tính này nhận là một chuỗi String (Cóthể là tên một Website, đường dẫn tới một File…) màWebBrowser sẽ hiển thị

2.5.3.3. Một số phương thức thường dùng

Tên Chức năng

Navigate Hiển thị nội dung File với tham số truyền vào

VD:webBrowser1.Navigate("C:\\WindowsForrmInC#.ppt");

2.5.3.4. Minh họa

Minh họa thuộc tính Url//Đặt thuộc tính Url thông qua mã Code

//webBrowser1 là tên điều khiển WebBrowser

private void btWeb_Click(object sender, EventArgs e)

{

Uri u = new Uri(@"http://mail.google.com/");

webBrowser1.Url = u;

//Viết gộp lại như thế này: webBrowser1.Url = new

Page 19: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 19 -

Uri(@"http://mail.google.com/");

//-> khi Click vào btWeb thì WebBrowser hiển thị WebSitehttp://mail.google.com/

//Tất nhiên máy bạn phải kết nối với Internet

}

Minh họa phương thức Navigate

//Hiển thị một trang Web hay Một File nào đó -> Sử dụng phương thức Navigate

private void btWeb_Click(object sender, EventArgs e)

{

//Hiển thị Website

webBrowser1.Navigate(@"mail.google.com");//(1)

//<->webBrowser1.Url = new Uri(@"http://mail.google.com/");

//Chú ý: Muốn sử dụng (1) phải cho (2) và (3)... vào dạng chú thích

//Vì một lúc webBrowser không thể hiển thị cả Website, cả ảnh, vả file PPT

//Hiển thị File PowerPoint

//webBrowser1.Navigate(@"C:\NET.ppt");//(2)

//Hiển thị Ảnh

//webBrowser1.Navigate(@"C:\viethqtk1.jpg");//(3)

//................................

}

Phương thức thường dùng

//Phương thức hay dùng xử lý với WebBrowser để tạo ra trình duyệt Web

private void Navigate(String address)

Page 20: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 20 -

{

if (address.Equals("about:blank")) return;

if (!address.StartsWith("http://") &&

!address.StartsWith("https://"))

{

address = "http://" + address;

}

try

{

webBrowser1.Navigate(new Uri(address));

}

catch (System.UriFormatException)

{

return;

}

}

2.5.4. Textbox

2.5.4.1. Chức năngĐiều khiển Textbox cho phép bạn nhập và hiển thị dữ liệu.

2.5.4.2. Một số thuộc tính thường dùng

Tên Ý nghĩa

AcceptsTab Nhận một trong hai giá trị True hay False- True: Khi nhấn phím Tab thì con trỏ (Focus)

chỉ di chuyển bên trong Textbox (Với điều

kiện thuộc tính Multiline=True).

Page 21: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 21 -

- False: Khi nhấn Tab thì Focus di chuyển qua

lại giữa các điều khiển trên Form

→ Thuộc tính này hay đặt bằng True trong các

ứng dụng soạn thảo văn bản

Anchor Vị trí neo đậu của Textbox trên Form

AutoCompleteCustomSource Ba thuộc tính này ý nghĩa tương tự như của

thuộc tính của điều khiển ComboboxAutoCompleteMode

AutoComplete Source

BackColor Đặt mầu nền cho Textbox

BorderStyle Chọn kiểu đường viền cho Textbox

ContextMenuStrip Chọn Menu ngữ cảnh khi nhấn chuột phải vào

Textbox

Dock Vị trí bám dính và điền đầy của Textbox với

Form

Font Chọn kiểu Font chữ cho Textbox

HideSelection Nhận một trong hai giá trị True hay False- True: Không cho phép các thuộc tính:

SelectionStart…có hiệu lực.- False: Ngược lại

MaxLenght Số lượng kí tự lớn nhất cho phép nhập vào

Textbox

Multiline Nhận một trong hai giá trị True hay False- True: Cho phép nhập và hiển thị giá trị của

Textbox trên nhiều dòng (người dùng có thể

nhìn thấy toàn bộ giá trị Text của nó)

Page 22: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 22 -

- False: Cho phép nhập/hiển thị giá trị của

Textbox trên một dòng

PasswordChar Hiển thị giá trị của Textbox dưới dạng các kí tự

mà bạn thay thế (kí tự do người dùng nhập vào:

*, #...)

ReadOnly

ScrollBars Cho phép hiển thị thanh trượt hay không? (Với

điều kiện thuộc tính Multiline=True mới nhìn

thấy thanh cuộn)

TabIndex

Visible Cho phép Textbox hiển thị hay không?

CanUndo Trả lại hai giá trị True/False.- True: có thể Undo lại được (như

Word)- False: Ngược lại

Các thuộc tính SelectionText o SelectedText

o SelectionStart

o SelectionLength

o ……………….

Chú ý: Các điều khiển có rất nhiều thuộc tính giống nhau: Anchor, Dock, Font,

ForeColor, Enabled, Visible, TabIndex……Về ý nghĩa các thuộc tính này là giống

nhau với tất cả các điều khiển

2.5.4.3. Một số phương thức thường dùng

Tên Ý nghĩa

AppendText Nối một chuỗi (string) vào giá trị Text hiện có của

Textbox

Page 23: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 23 -

Copy

Xử lý phần nội dung bôi đen (như Word)Cut

Paste

Focus Chuyển Focus (con trỏ) vào TextBox

Clear Xóa toàn bộ Textbox

Select Lấy ra một chuỗi trong Textbox (xem Code)

SelectAll Lấy tất cả giá trị của Textbox

Undo Xử lý Undo như Word

2.5.4.4. Một số sự kiện thường dùng

Tên Ý nghĩa

KeyPress Xảy ra khi người dùng nhấn phím trên bàn phím (tất

nhiên Textbox phải đang Focus – Áp dụng sự kiện này

để xử lý không cho phép nhập chữ vào Textbox…)

MouseClick Xảy ra khi người dùng Click chuột trên điều khiển

Textbox

TextChanged Xảy ra khi giá trị Text của Texbox (hay gọi giá trị

Textbox) thay đổi

2.5.4.5. Minh họa

2.5.4.5.1. Minh họa thuộc tính Text của Textboxprivate void btTextbox_Click(object sender, EventArgs e)

{

//Trước khi gán thuộc tính text

MessageBox.Show("Giá trị textbox trước khi gán: "+

Page 24: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 24 -

textBox1.Text);

//Gán giá trị Text

textBox1.Text = "Chào các bạn";

//Sau khi gán

MessageBox.Show("Giá trị textbox sau khi gán: " + textBox1.Text);

}

2.5.4.5.2. Minh họa thuộc tính SelectedTextprivate void btTextbox_Click(object sender, EventArgs e)

{

//Thuộc tính SelectedText lấy ra một chuỗi mà bạn bôi đen (Chọn)

//Bạn hãy bôi đen một vài từ trong Textbox sau đó Click vào Buttonnày sẽ hiển thị

//Message thông báo từ bạn chọn

string str = textBox1.SelectedText;

MessageBox.Show("Từ bạn vừa chọn (bôi đen) là: "+str);

}

2.5.4.5.3. Minh họa thuộc tính SelectionStart và SelectionLengthprivate void btTextbox_Click(object sender, EventArgs e)

{

//Thuộc tính này dùng trong tìm kiếm rất nhiều

//Thuộc tính SelectionStart: Ví trí bắt đầu Select

//Thuộc tính SelectionLength: Chiều dài của vùng lựa chọn

//Chú ý: Đặt thuộc tính HideSelection=False

//Ví dụ: Tìm kiếm xem giá trị của Textbox có từ nào là chào haykhông. Nếu có thì nó tự Bôi đen từ đó

string str = "chào";

int i;

i = textBox1.Text.LastIndexOf(str);

Page 25: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 25 -

if (i >= 0)

{

textBox1.SelectionStart = i;

textBox1.SelectionLength = str.Length;

}

}

2.5.4.5.4. Minh họa thuộc tính CanUndo và phương thức Undoprivate void btTextbox_Click(object sender, EventArgs e)

{

//Nếu có thể Undo (có nghĩa: Bạn phải gõ văn bản vào Textbox rồi sửa,xóa...)

//Mới có thể Undo lại được

if (textBox1.CanUndo)

textBox1.Undo();

}

2.5.4.5.5. Minh họa phương thức Selectprivate void btTextbox_Click(object sender, EventArgs e)

{

//Cú pháp chung: txtNoiDung.Select(Start, Length);

//Mục đích để lấy về một chuỗi từ từ vị trí nào và chiều dài của chuỗidược chọn (tất nhiên: bôi đen vùng này).

//-> Phương thức này tương đương với sử dụng 2 thuộc tínhSelectionStart và SelectionLength

//Ví dụ:

txtNoiDung.Select(10, 5);

//<-> 2 câu lệnh này

//textBox1.SelectionStart = 10;

//textBox1.SelectionStart = 5;

}

Page 26: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 26 -

2.5.4.5.6. Minh họa phương thức AppendTextprivate void btTextbox_Click(object sender, EventArgs e)

{

//Giá trị Textbox trước khi gọi phương thức

MessageBox.Show("Trước: "+textBox1.Text);

//Gọi phương thức

textBox1.AppendText("Khoa CNTT - UTEHY");

//Giá trị Textbox trước khi gọi phương thức

MessageBox.Show("Sau: " + textBox1.Text);

}

2.5.4.5.7. Xử lý chỉ cho phép Textbox nhập số (sự kiện KeyPress của Textbox) –Cách 1private void txtNoiDung_KeyPress(object sender, KeyPressEventArgs e)

{

if (e.KeyChar >= '0' && e.KeyChar <= '9')

e.Handled = false;//Handled: Được xử lý

else

e.Handled = true;

}

2.5.4.5.8. Xử lý chỉ cho phép Textbox nhập số (sự kiện KeyPress của Textbox) –Cách 2

private void txtNoiDung_KeyPress(object sender, KeyPressEventArgs e)

{

if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))

e.Handled = true;

//Char.IsDigit(e.KeyChar) -->

//kiểm tra xem phím vừa nhập vào textbox có phải là ký tự số haykhông, hàm này trả về kiểu bool

//Char.IsContro(e.KeyChar) -->

Page 27: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 27 -

//kiểm tra xem phím vừa nhập vào textbox có phải là các ký tự điềukhiển

//(các phím mũi tên,Delete,Insert,backspace,space bar…) hay không,mục đích dùng hàm này là để cho phép người dùng xóa số trong trường hợpnhập sai.

}→ Sử dụng Textbox viết chương trình soạn thảo văn bản đơn giản (tham khảoNotepad)

2.5.5. MaskedTextbox

2.5.5.1. Chức năng

Dùng nhập dữ liệu theo các định dạng khác nhau (ngày tháng…)

2.5.5.2. Một số thuộc tính thường dùng

Tên Ý nghĩa

Mask Đặt định dạng cho dữ liệu nhập (00/00/0000)

2.5.5.3. Một số phương thức thường dùng

Tương tự như điều khiển Textbox

2.5.5.4. Một số sự kiện thường dùng

Tương tự như điều khiển Textbox

2.5.6. RichTextBox

2.5.6.1. Chức năng

Điều khiển RitchTextBox dùng để lưu trữ và hiển thị văn bản theo nhiều định

dạng khác nhau (định dạng chuẩn là rtf)

2.5.6.2. Một số thuộc tính thường dùng

Điều khiển RitchTextBox có rất nhiều các thuộc tính giống Textbox nói riêng

và các điều khiển khác nói chung. Ý nghĩa của các thuộc tính này là giống nhau với

các điều khiển. Ở đây chúng ta xét một số thuộc tính khác của RitchTextBox

Page 28: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 28 -

Tên Ý nghĩa

SelectedText Lấy về chuỗi được lựa chọn (chuỗi mà chúng ta bôi

đen)

SelectionStart, SelectionLength Lấy về một chuỗi với vị trí bắt đầu và chiều dài, hai

thuộc tính này thường đi với nhau

SelectionFont Lấy thông tin về Font của một chuỗi được lựa chọn

(bôi đen)

SelectionColor Lấy thông tin về Color của chuỗi được bôi đen

được lựa chọn

CanUndo Trả lại hai giá trị True/False.- True: có thể Undo lại được (như

Word)- False: Ngược lại

CanRedo Tương tự như thuộc tính CanUndo

2.5.6.3. Một số phương thức thường dùng

Tên Ý nghĩa

AppendText Nối một chuỗi vào RitchTextBox

Copy Xử lý phần nội dung bôi đen (như Word)

Cut

Paste

Find Tìm kiếm một xâu trong RitchTextBox

Focus Chuyển Focus vào RitchTextBox

LoadFile Đọc nội dung một file vào RitchTextBox

Page 29: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 29 -

SaveFile Ghi nội dung của RitchTextBox ra file

Select Lấy ra một chuỗi trong RitchTextBox (tương tự

TextBox)

SelectAll Lấy tất cả nội dung của RitchTextBox

Redo Xử lý Undo, Redo như Word

Undo

2.5.6.4. Minh họa

Giả sử có một Textbox có tên là richTextBox1. Chúng ta sẽ minh họa

RitchTextbox qua sự kiện click của một Button có tên là btrichTextBox.

Việc sử dụng các thuộc tính SelectedText, SelectionStart, SelectionLength,

CanUndo, CanRedo tương tự như TextBox (Xem lại Code phần điều khiển TextBox)

2.5.6.4.1. Minh họa thuộc tính SelectionFontprivate void btRichTextBox_Click(object sender, EventArgs e)

{

//Sử dụng thuộc tính Font có thể lấy thông tin về Font của vùng Bôi đen(không phải tất cả)

//Hoặc: Thay đổi Font của vùng bôi đen

//Trước hết lấy thông tin về Font

//InfoFont bao gồm tát cả các thông tin: Style, Tên Font...

string InfoFont = richTextBox1.SelectionFont.ToString();

MessageBox.Show(InfoFont);

//Chỉ lấy tên Font của vùng Bôi đen

string FontName = richTextBox1.SelectionFont.Name.ToString();

MessageBox.Show("Vùng bôi đen có Font là: " + FontName);

//Chỉ lấy Size của vùng Bôi đen

string FontSize = richTextBox1.SelectionFont.Size.ToString();

MessageBox.Show("Vùng bôi đen có Size là: " + FontSize);

Page 30: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 30 -

//...................................................

}

2.5.6.4.2. Chọn Font cho vùng bôi đen thông qua thuộc tính SelectionFont (Chỉ vùngbôi đen)

private void btRichTextBox_Click(object sender, EventArgs e)

{

FontDialog fo = new FontDialog();

//Hiển thị hộp thoại

if (fo.ShowDialog() == DialogResult.OK)

{

//Nếu muốn đổi Font một đoạn lựa chọn thì dùng câu lệnh này

richTextBox1.SelectionFont = fo.Font;

//Còn nếu muốn đổi Font cho toàn bộ RichTextBox thì dùng câu lệnhnày

//richTextBox1.Font = fo.Font;

}

}

2.5.6.4.3. Minh họa thuộc tính SelectionColorprivate void btRichTextBox_Click(object sender, EventArgs e)

{

//Thuộc tính này lấy về màu của vùng được lựa chọn

//Tương tự như thuộc tính SelectionFont

string Color = richTextBox1.SelectionColor.Name.ToString();

MessageBox.Show(Color);

}

2.5.6.4.4. Đặt màu cho vùng bôi đen thông qua thuộc tính SelectionColorprivate void btRichTextBox_Click(object sender, EventArgs e)

{

Page 31: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 31 -

ColorDialog cl = new ColorDialog();

//Hiển thị hộp thoại

if (cl.ShowDialog() == DialogResult.OK)

{

//Nếu muốn đổi Font một đoạn lựa chọn thì dùng câu lệnh này

richTextBox1.SelectionColor = cl.Color;

}

}

2.5.6.4.5. Việc sử dụng các phương thức: AppendText, Select, SelectAll, Undo, Redo,Undo tương tự như Textbox

2.5.6.4.6. Minh họa sử dụng phương thưc LoadFileprivate void btRichTextBox_Click(object sender, EventArgs e)

{

//Load nội dung File C:\NET.rtf vào RitchTextBox

//Tất nhiên ổ C của bạn phải tồn tại file C:\NET.rtf

richTextBox1.LoadFile(@"C:\NET.rtf");

//-> Thường sử dụng cùng với điều khiển OpenFileDialog để mở mộtfile trên máy

}

2.5.6.4.7. Minh họa sử dụng phương thưc SavaFileprivate void btRichTextBox_Click(object sender, EventArgs e)

{

//Lưu nội dung RitchTextBox ra file

richTextBox1.SaveFile(@"C:\File.rtf")

//-> Thường sử dụng cùng với điều khiển SaveFileDialog lưu file vàomột nơi bất kì trên máy

}

2.5.6.4.8. Minh họa Phương thức Findprivate void btRichTextBox_Click(object sender, EventArgs e)

Page 32: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 32 -

{

//Tìm kiếm một chuỗi trong RichTextBox -> nếu có thì bôi đen kết quảtìm thấy

//Chú ý: Đặt thuộc tính HideSelection=False

//rtfNoiDung.Find("Chào", 0, 100, RichTextBoxFinds.Reverse);

//-> Ứng dụng trong tìm kiếm văn bản

richTextBox1.Find("chào", 0, 100, RichTextBoxFinds.MatchCase);

}

→ Sử dụng RitchTextBox viết chương trình soạn thảo văn bản đơn giản(thamkhảo WordPad)

2.5.7. Nhóm điều khiển Menu

2.5.7.1. Điều khiển Menu Strip2.5.7.1.1. Chức năng

Điều khiển MenuStrip cho phép thiết kế hệ thống menu trên Form (menu một cấphay nhiều cấp). Ví dụ hệ thống menu của chương trình Word, Visual Studio2008….MenuStrip cho phép thiết kế menu với các điều khiển:

• ToolStripSeparator (Gạch phân cách)• ToolStripMenuItem (Menu con).• ToolStripCombobox (Combobox).• ToolStripTextbox (Textbox)

2.5.7.1.2. Một số thuộc tính thường dùng

Tên Ý nghĩa

TextDirection Chọn hình thức trình bày Menu (quay ngược, quay

Page 33: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 33 -

900…)

Items Thêm các menu con, kiểu của menu (Menu con,Textbox, Combobox, gạch phân cách). Thông qua giaodiện đồ họa bạn có thể thêm các menu vào (tập cácItems này là một Colleciton).

RightToLeft Nhận một trong hai giá trị Yes hay No- Yes: trình bày menu từ phải qua trái- No: trình bày menu từ trái qua phải

2.5.7.1.3. Một số thuộc tính thường dùng của ToolStripMenuItem

Tên Ý nghĩa

Checked Nhận một trong hai giá trị True hay False- True: cho phép xuất hiện biểu tượngCheckbox bên cạnh chuỗi Text củaToolStripMenuItem- False: Ngược lại

CheckOnClick Nhận một trong hai giá trị True hay False- True: Biểu tượng Checkbox xuất hiện bêncạnh chuỗi Text của ToolStripMenuItem(MenuItem) mỗi khi người dùng Clickchọn vào nó- False: Ngược lại

CheckState Trạng thái của Checkbox bên cạnh chuỗi Text củamenu. Và nhận một trong 3 giá trị: UnChecked,Checked, Indeterminate (Chú ý: Thuộc tínhChecked=True thì thuộc tính này mới có hiệu lực. Hiểnnhiên rồi phải không? ☺)

DisplayStyle Hình thức trình bày của Menu và nhận một trong 4 giátrị - None: Không hiển thị gì cả (Text và

Image)- Text: Chỉ cho phép xuất hiện chuỗi mô tả- Image: Chỉ cho phép xuất hiện ảnh( hoặcIcon) bên cạnh Text (xuất hiện ở phíangoài cùng bên trái)- ImageAndText=Image+Text

Page 34: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 34 -

Image Hình ảnh xuất hiện bên cạnh chuỗi Text (chuỗi khai báobên trong thuộc tính Text của MenuItem)

ImageScaling Chọn hình thức trình bày của ảnh xuất hiện bên cạnhchuỗi. Và nhận một trong hai giá trị- None: BÌnh thường- SizeToFit: Hiển thị đúng kích cỡ của

Image hay Icon.ShortcutKeyDisplayString Chuỗi trình bày ứng với phím tắt mô tả cho MenuItem

đó (Nối vào Text của MenuItem ví dụ: Open Ctrl+O)

ShortcutKeys Chọn tổ hợp phím tắt ứng với MenuItem đó

ShowShortcutKeys Nhận một trong hai giá trị True hay False- True: Cho phép trình bày chuỗi tổ hợpphím tắt của MenuItem (=True thì thuộctính ShortcutKeyDisplayString mới có hiệulực).- False: Ngược lại

Text Chuỗi trình bày MenuItem, bạn có thể sử dụng kí tự &trước kí tự để sử dụng với phím Alt (phím nóng - phímtắt)

TooltipText Chuỗi trợ giúp khi người dùng di chuyển chuột đếnđiều khiển MenuItem đó

Visible

2.5.7.2. Điều khiển ContextMenuStrip

2.5.7.2.1. Chức năng

Điều khiển ContextMenuStrip dùng để thiết kế menu popup (menu ngữ cảnh –menu xuất hiện khi người dùng nhấn chuột phải. Ví dụ: khi người dùng nhấn chuộtphải vào Desktop xuất hiện một menu – đó chính là menu ngữ popup) .

Để xuất hiện các menu Popup khi người dùng nhấn chuột phải vào các điều khiển

(form, button, label, textbox…) bạn chỉ cần khai báo thuộc tính ContextMenuStrip của

các điều khiển đó là một điều khiển ContextMenuStrip.

Điều khiển ContextMenuStrip cho phép thiết kế menu với các điều khiển sau

(tương tự như điều khiển MenuStrip).

Page 35: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 35 -

• ToolStripSeparator (Gạch phân cách)

• ToolStripMenuItem (Menu con).

• ToolStripCombobox (Combobox).

• ToolStripTextbox (Textbox)

2.5.7.2.2. Một số thuộc tính thường dùng

Tên Ý nghĩa

Items Thêm các mnu con, kiểu của menu (Menu con,Textbox, Combobox, gạch phân cách). Thông qua giaodiện đồ họa bạn có thể thêm các menu vào (Collection)

RightToLeft Nhận một trong hai giá trị True hay False- True: Trình bày menu từ phải qua trái (căn lề là bênphải)- False: Trình bày menu từ trái qua phải (căn lề là bêntrái)

ShowImageMargin Hiển thị phần hình ảnh?

2.5.8. Nhóm điều khiển Dialog

2.5.8.1. Điều khiển OpenFileDialog

2.5.8.1.1. Chức năng

Điều khiển OpenFileDialog cho phép bạn chọn (select) tập tin đang tồn tại trên

hệ thống, kiểm tra xem một tập tin có tồn tại hay không. Trong trường hợp bạn có nhu

cầu chọn một Foder (chứ không phải File) thì bạn chọn điều khiển

FolderBrowserDialog

Ví dụ: Hộp thoại mở ra khi chúng ta chọn File → Open của chương trình Word

hay Notepad…

2.5.8.1.2. Một số thuộc tính thường dùng

Tên Ý nghĩa

AddExtension Nhận một trong hai giá trị True hay False- True: Cho phép thêm vào tên mở rộng (.txt, .jpg…)vào file- False: Ngược lại

Page 36: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 36 -

CheckFileExists Nhận một trong hai giá trị True hay False- True: Xuất hiện hộp cảnh báo nếu bạn nhập vàomột tên file không tồn tại (nhập vào ô File name:trên hộp thoại OpenFileDialog )- False: Ngược lại

CheckPathExists Nhận một trong hai giá trị True hay False- True: Kiểm tra đường dẫn tới file có hợp lệ haykhông trước khi trả về.- False: Ngược lại

DefaultExt Chọn tên mở rộng cho file (.txt, .jpg…) mặc định nếungười dùng không cung cấp tên mở rộng cho tập tin.

Filter Chọn bộ lọc cho hộp thoại (Chỉ chọn File nào). Ví dụ:

File Text (*.txt)|*.txt| Word File (*.doc)|*.doc;

FilterIndex Chọn số thứ tự cho bộ lọc (bộ lọc sẽ hiển thị trong mụcFiles Of Types)

FileName Set or Get tên tệp tin bạn chọn

FileNames Set or Get mảng chứa tệp tin chọn (trong trường hợpchọn nhiều tập tin)

InitialDirectory Đường dẫn mặc định khi hộp thoại OpenFileDialog mởra

Multiselect Nhận một trong hai giá trị True hay False- True: Cho phép bạn chọn nhiều tập tin (ví du: Chọnnhiều bản nhạc để nghe…)- False: Ngược lại

ReadOnlyChecked Nhận một trong hai giá trị True hay False- True: Check vào hộp thoại Checkbox Open asRead-Only bên dưới Combobox Files Of Types- False: Ngược lại (☻)

(với điều kiện thuộc tính ShowReadOnly = True)RestoreDirectory Nhận một trong hai giá trị True hay False- True: Mở lại thư mục vừa mở ra lần trước, với điều

kiện thuộc tính InitialDirectory không đặt gì- False: Không mở lại thư mục vừa mở lần trướcShowReadOnly Nhận một trong hai giá trị True hay False- True: Xuất hiện hộp Checkbox Open as Read-Only

Page 37: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 37 -

bên dưới Combobox Files Of Types- False: Ngược lạiTitle Đặt tiêu đề (xuất hiện trên Titlebar) cho hộp thoại

OpenFileDialog

2.5.8.1.3. Minh họa sử dụng điều khiển OpenFileDialog

Giả sử chúng ta có một form có tên: frmOpenFileDialog, trên form có một điềukhiển Textbox có tên Textbox1và một điều khiển OpenFileDialog có tênopenFileDialog1. Chúng ta sử dụng hộp thoại OpenFileDialog để load nội dung mộttệp text vào Textbox

private void frmOpenFileDialog_Load(object sender, EventArgs e)

{

//Đặt một số thuộc tính bằng Code

openFileDialog1.AddExtension = false;

openFileDialog1.CheckFileExists = true;

openFileDialog1.ReadOnlyChecked = true;//Check vào checkbox ->thuộctính ShowReadOnly = true

openFileDialog1.Filter = "File Text (*.txt)|*.txt| File Rtf (*.rtf)|*.rtf| AllFile|*.*";

openFileDialog1.FilterIndex = 0;//Chọn bộ lọc "File Text (*.txt)|*.txt" -> Chỉchọn file Text

openFileDialog1.FileName = "";//thay cho chuỗi openFileDialog1 xuất hiệntrong hộp FileName

openFileDialog1.InitialDirectory = "C:\\"; //Mở ổ C khi hộp thoại này hiển thị

openFileDialog1.Multiselect = true;

openFileDialog1.ShowReadOnly = true;//Xuất hiện Checkbox

openFileDialog1.Title = "Cong nghe NET";

//Kiển tra hộp thoại có mở ra không

Page 38: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 38 -

//Sử dụng phương thức ShowDialog()

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

//Lấy về File bạn chọn. Giả sử tôi chọn File C:\CongNgheNET.txt

string FileBanChon = openFileDialog1.FileName;

//Đọc file

StreamReader sr = new StreamReader(FileBanChon);

textBox1.Text = sr.ReadToEnd();

//Đóng luồng đọc

sr.Close();

}

}

2.5.8.2. Điều khiển SaveFileDialog

2.5.8.2.1. Chức năng

Điều khiển SaveFileDialog cho phép bạn ghi một nội dung ra một tập tin (file)

mới hay ghi đè lên tập tin đang tồn tại trên hệ thống của bạn.

Ví dụ: Hộp thoại mở ra khi chúng ta chọn File → Save của chương trình Word,

Notepad….

2.5.8.2.2. Mốt số thuộc tính thường dùng

Tên Ý nghĩa

AddExtension Nhận một trong hai giá trị True hay False- True: Cho phép thêm vào tên mở rộng (.txt,.jpg…)- False: Ngược lại

CheckFileExists Nhận một trong hai giá trị True hay False- True: Xuất hiện hộp cảnh báo nếu bạn nhập vàomột tên file không tồn tại (nhập vào ô File name:trên hộp thoại SaveFileDialog )

Page 39: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 39 -

- False: Ngược lạiCheckPathExists Nhận một trong hai giá trị True hay False- True: Kiểm tra đường dẫn tới file có hợp lệ hay

không trước khi trả về.- False: Ngược lạiFilter Chọn bộ lọc cho hộp thoại (Chỉ chọn File nào). Ví dụ:

File Text (*.txt)|*.txt| Word File (*.doc)|*.doc;

FilterIndex Chọn số thứ tự cho bộ lọc (bộ lọc sẽ hiển thị trongmục Files Of Types)

FileName Set or Get tên tệp tin

InitialDirectory Đường dẫn mặc định khi hộp thoại SaveFileDialogmở ra

RestoreDirectory Nhận một trong hai giá trị True hay False- True: Mở lại thư mục vừa mở ra lần trước, vớiđiều kiện thuộc tính InitialDirectory không đặt gì- False: Không mở lại thư mục vừa mở lần trước

Title Đặt tiêu đề (xuất hiện trên Titlebar) cho hộp thoạiSaveFileDialog

ShowHelp Cho phép xuất hiện Button Help (?) hay không?

OverwritePrompt Xuất hiện cảnh báo nếu bạn ghi đè vào một tập tin đãtồn tại

2.5.8.2.3. Minh họa sử dụng điều khiển SaveFileDialog

Giả sử chúng ta có một form có tên: frmSaveFileDialog, trên form có một điềukhiển Textbox có tên Textbox1và một điều khiển SaveFileDialog có tênsaveFileDialog1. Chúng ta sử dụng hộp thoại SaveFileDialog để ghi nội dung Textboxvào một tệp Text qua sự kiện Click của một Button có tên btSaveprivate void btSave_Click(object sender, EventArgs e)

{

//Đặt một số thuộc tính bằng Code

saveFileDialog1.AddExtension = true;//Cho phép thêm vào tên mở rộng

saveFileDialog1.OverwritePrompt = true;//Xuất hiện cảnh báo nếu tập tin đã

Page 40: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 40 -

tồn tại

saveFileDialog1.DefaultExt = "txt";//Chạy nếu:saveFileDialog1.AddExtension = true

saveFileDialog1.CheckPathExists = true;//Kiểm tra đường dẫn có hợp lệ haykhông

saveFileDialog1.FileName = "";

saveFileDialog1.Filter = "Text File (*.txt)|*.txt";

saveFileDialog1.FilterIndex = 0;

//saveFileDialog1.InitialDirectory = "C:\\";//Chọn đường dẫn khi hộp thoại mởra

saveFileDialog1.RestoreDirectory = true;//ĐK không đặtsaveFileDialog1.InitialDirectory

saveFileDialog1.ShowHelp = true;

saveFileDialog1.Title = "Cong nghe NET";

if (saveFileDialog1.ShowDialog() == DialogResult.OK)

{

//Lấy nội dung cần ghi

string strNoiDung=textBox1.Text;

//Lấy ra tên file cần ghi

string strFileSave = saveFileDialog1.FileName;

//Ghi file

StreamWriter sw = new StreamWriter(strFileSave);

sw.Write(strNoiDung);

//đóng luồng

sw.Close();

}//ví dụ rất đơn giản

2.5.8.3. Điều khiển FolderBrowerDialog

Page 41: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 41 -

2.5.8.3.1. Chức năngĐiều khiển FolderBrowserDialog cho phép người dùng chọn (Select) thư mục

đang tồn tại trong hệ thống, đồng thời có thể tạo mới thư mục ngay trong thư mụcđang chọn (Chú ý: Điều khiển OpenFileDialog chỉ cho phép chọn file).

2.5.8.3.2. Một số thuộc tính thường dùng

Tên Ý nghĩa

Description Chuỗi mô tả về hộp thoại, xuất hiện bên dưới khungTitle

RootFolder Thư mục mặc định chọn khi hộp thoại mở ra. Bao gồmrất nhiều lựa chọn có sẵn

SelectedPath Trả về tên thư mục (cả đuờng dẫn đầy đủ) mà người sửdụng chọn (các bạn chú ý thuộc tính này)

ShowNewFolderButton Nhận một trong hai giá trị True hay False- True: Xuất hiện Buttons Make New Folder chophép người dùng tạo ra thư mục mới trong thư mụcbạn chọn- False: Ngược lại

2.5.8.3.3. Minh họa sử dụng điều khiển

Chúng ta minh họa sử dụng điều khiển FolderBrowsersDialog qua ứng dụng tạoSlide ảnh.

Giả sử chúng ta có một form có tên: frmFolderBrowserDialog, trên form có chứamột số điều khiển sau:

• PictureBox có tên pictureBox1 để hiển thị ảnh• Điều khiển folderBrowserDialog có tên folderBrowserDialog1 dùng để

chọn thư mục chứa ảnh• Điều khiển Timer có tên timer1• Button có tên btOpen

//Khai báo mảngstring[] MangAnh = null;int Index = 0;int CountImage;

//Loadprivate void frmFolderBrowserDialog_Load(object sender, EventArgs e){

Page 42: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 42 -

this.WindowState = FormWindowState.Maximized;pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

}

//Mở thư mục chứa các File ảnhprivate void btOpen_Click(object sender, EventArgs e){

if (folderBrowserDialog1.ShowDialog() == DialogResult.OK){

//Khai báo các mảng để chứa các ảnh khác nhau: jpg, jpegstring[] MangAnhJpg = null, MangAnhJpeg = null, MangAnhBitmap =

null;

//Lấy ra các phần tử của mảng bảng cách dùng lớp Directory//Ở đây tôi chọn thư mục: D:\Pictures chứa rất nhiều ảnh của tôi

MangAnhJpg = Directory.GetFiles(folderBrowserDialog1.SelectedPath,"*.jpg");//CHÚ Ý CÂU LỆNH NÀY

MangAnhJpeg =Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.jpeg");//CHÚ Ý CÂULỆNH NÀY

MangAnhBitmap =Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.bmp");//CHÚ Ý CÂULỆNH NÀY

//Lấy ra chiều dài mảngint i = MangAnhJpg.Length;int j = MangAnhJpeg.Length;int k = MangAnhBitmap.Length;//Khai báo mảng mới là tổ hợp của 3 mảngMangAnh = new string[i+j+k]; //CHÚ Ý CÂU LỆNH NÀY

//Xử lý về mảngArray.Copy(MangAnhJpg, 0, MangAnh, 0,i); //CHÚ Ý CÂU LỆNH

NÀYArray.Copy(MangAnhJpeg, 0, MangAnh, i, j); //CHÚ Ý CÂU LỆNH

NÀYArray.Copy(MangAnhBitmap, 0, MangAnh, i+j, k); //CHÚ Ý CÂU

LỆNH NÀY//3 CÂU LỆNH NÀY ĐÚNG LOGIC CHƯA????? ^_^ ☺

//Lấy ra số ảnhCountImage = MangAnh.Length;

//Hết ForEachtimer1.Enabled = true;

}}

Page 43: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 43 -

//Chú ý: Đặt thuộc tính cho Timer//Enabled=true//Interval=2000 > sau 2 giây chuyển sang ảnh tiếp theoprivate void timer1_Tick(object sender, EventArgs e){

//Khai bào Image > Chú ý câu lệnh nàyImage img = Image.FromFile(MangAnh[Index]);

//Hiển thị nên PicturepictureBox1.Image = img;

//Chuyển đến ảnh tiếp theoIndex++;if (Index >= End)

Index = 0;}

2.5.9. ListView

2.5.9.1. Chức năngĐiều khiển ListView dùng để trình bày các phần tử dạng danh sách với nhiều

hình dạng khác nhau.

2.5.9.2. Một số khái niệm liên quan đến ListView

Hình 1: Minh họa về ListView

Page 44: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 44 -

Hình 2: Cột trong ListView

Hình 3: Khái niệm ColumnHeader

Page 45: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 45 -

Hình 4: Khái niệm ListViewItem

Hình 5: Khái niệm SubItems

Page 46: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 46 -

Hình 6: Minh họa về Group

2.5.9.3. Một số thuộc tính thường dùng

Tên Ý nghĩa

CheckBoxes Nhận một trong hai giá trị True hay False (mặc định là

False) - True: Hiển thị một checkbox bên cạnh phần

tử đầu tiên của mỗi hàng (1 hàng = 1

ListviewItem) trong Listview- False: Ngược lại

Columns Tập các cột trong ListView là một Collection. Thông qua

thuộc tính này có thể thêm các cột vào Listview (Có thể

thêm các cột vào Listview thông qua giao diện đồ họa hay

có thể viết Code. Chú ý: Phải đặt thuộc tính View là

Detail thì bạn mới có thể nhìn thấy các cột này)

ContextMenuStrip Gắn một menu ngữ cảnh với điều khiển ListView (khi

nhấn chuột phải vào Listview thì sẽ hiển thị menu này)

FullRowSelect Nhận một trong hai giá trị True hay False

Page 47: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 47 -

- True: Cho phép chọn (bôi đen) cả hàng (của

phần tử đang được chọn. Chú ý: Thuộc tính

View = Detail)- False: Ngược lại

GridLines Nhận một trong hai giá trị True hay False- True: Hiển thị lưới bao quanh và ngăn cách

các hàng (Chỉ có hiệu lực nếu thuộc tính

View = Detail)- False: Ngược lại

Group Khai báo nhóm để phân loại các phần tử sau khi trình bày

trên điều khiển Listview

HeaderStyle Đây là thuộc tính cho phép chọn Style cho Listview trong

chế độ View là Report

Items Là một Collection. Cho phép tạo ra các giá trị cho các

hàng, cột trong Listview (tất nhiên có thể dùng giao diện

đồ họa hay viết Code)

LabelEdit Nhận một trong hai giá trị True hay False- True: Cho phép thay đổi (sửa) Text của các

phần tử (các Ô).- False: Ngược lại

LabelWap Nhận một trong hai giá trị True hay False- True: Chuỗi DHSPKTHY sẽ tự động xuống

hàng khi chiều dài không đủ để trình bày- False: Ngược lại

MultiSelect Nhận một trong hai giá trị True hay False- True: Cho phép chọn nhiều hàng

(ListviewItem). Mặc định là True- False: Không cho phép chọn nhiều hàng

Page 48: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 48 -

LargeImageList Đối tượng ImageList chứa danh sách các Image theo chỉ

số (Index) từ 0 đến n-1. Được sử dụng nếu thuộc tính

View là LargeIcon

SmallImageList Đối tượng ImageList chứa danh sách các Image theo chỉ

số (index) từ 0 đến n-1. Được sử dụng nếu thuộc tính

View là SmallIcon

Scrollable Nhận một trong hai giá trị True hay False- True: Cho phép xuất hiện thanh trượt trong

Listview (Khi số ListViewItem nhiều và

vượt qua chiều cao của ListView)- False: Ngược lại

Sorting Sắp xếp giá trị các hàng (ListViewItem) trong ListView

(Chỉ có hiệu lực nếu thuộc tính View là Detail). Thuộc

tính này nhận một trong các giá trị sau

None: Không Sắp xếp

Ascending: Sắp xếp tăng

Descending: Sắp xếp giảm

SelectedItems Trả về danh sách các phần tử được chọn (bôi đen)

CheckedItems Trả về danh sách các phần tử được check (tất nhiên thuộc

tính CheckBoxes = True)

View Các kiểu Hiển thị trên ListView. Thuộc tính View có thể

nhận một số giá trị sau:

LargeIcon

SmallIcon

List

Detail

Title

→ Mặc định là: LargeIcon

Page 49: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 49 -

2.5.9.4. Một số phương thức thường dùng

Tên Ý nghĩa

Clear Xóa tất cả ListView

RemoveAt Xóa bỏ một cột có chỉ số (ở vị trí) nào đó

………………………………

2.5.9.5. Một số sự kiện thường dùng

Tên Ý nghĩa

SelectedIndexChanged Xảy ra khi người sử dụng thay đổi phần tử được chọn

trong ListView

ItemActivate Xảy ra khi chọn phần tử trên ListView

ItemChecked Khi Check vào biểu tượng Checkbox của mỗi phần tử

trên điều khiển ListView

2.5.9.6. Minh họa

Giả sử chúng ta có một form có tên: frmListView. Trên đó có chứa một số điềukhiển sau:

Điều khiển ListView có tên listView1 (Chúng ta để tất cả các thuộc tính

của listView1 với giá trị mặc định).

Button btCheck: minh họa việc duyệt các hàng được check trên ListView

Buttonbt RemoveAtColumns: Minh họa xóa một cột trong ListView

Buttonbt RemoveAtItems: Minh họa xóa một hàng trong ListView

Buttonbt ShowFile: Minh họa hiển thị tất cả các file trong một thư mục nên

ListView

Button btGroup: Minh họa về Group trong ListView

Chúng ta sẽ minh họa sử dụng ListView qua sự kiện Click của các button trên.

Page 50: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 50 -

2.5.9.6.1. Tạo các cột, hàng cho ListView bằng code

private void frmListView_Load(object sender, EventArgs e)

{

//Đặt một số thuộc tính cho điều khiển ListView1 bằng code

//Bạn chỉ có thể nhìn thấy các cột nếu đặt thuộc tính View=Detail

listView1.View = View.Details;

listView1.GridLines = true;

listView1.CheckBoxes = true;//Hiển thị checkbox: các bạn xemkết quả ở hinhg minh họa.

//Thêm 4 cột vào Listview

//Có thể thêm cột vào ListView theo cách này

listView1.Columns.Add("Họ và tên", 100,HorizontalAlignment.Center);

listView1.Columns.Add("Quê quán", 100,HorizontalAlignment.Center);

listView1.Columns.Add("Lớp", 100,HorizontalAlignment.Center);

//Cách 2: Có thể thêm vào theo cách này: Sử dụngColumnHeader

ColumnHeader ch = new ColumnHeader("chNgaySinh");

ch.Text = "Ngày sinh";

ch.TextAlign = HorizontalAlignment.Center;

ch.Width = 100;

listView1.Columns.Add(ch);

//Thêm hàng thứ nhất vào ListView

string[] Them = new string[] { "Nguyễn Văn Hải", "Hưng Yên","TK4N1", "29-03-1987" };

ListViewItem lv = new ListViewItem(Them);

listView1.Items.Add(lv);

Page 51: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 51 -

//Thêm hàng thứ 2

string[] Them2 = new string[] { "Nguyễn Văn Hạnh", "Hà Nội","TK4N1", "24-04-1987" };

ListViewItem lv2 = new ListViewItem(Them2);

listView1.Items.Add(lv2);

//Thêm hàng thứ 3

string[] Them3 = new string[] { "Phạm Thị Hạnh", "Hải Dương","TK4N1", "04-10-1988"};

ListViewItem lv3 = new ListViewItem(Them3);

listView1.Items.Add(lv3);

//Thêm hàng thứ 4

string[] Them4 = new string[] { "Vũ Thị Hảo", "Bắc Ninh","TK4N1", "25-12-1987" };

ListViewItem lv4 = new ListViewItem(Them4);

listView1.Items.Add(lv4);

}

→ Sau khi chạy có hình như sau:

Page 52: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 52 -

2.5.9.6.2. Duyệt xem những hàng nào được Check

private void btCheck_Click(object sender, EventArgs e)

{

//Bạn phải tạo ra một Listview như mục 7.1 trước đã

MessageBox.Show("Tên các sinh viên được Checklà","Check",MessageBoxButtons.OK);

//Duyệt các phần tử được Check thông qua thuộc tính CheckedItems

foreach (ListViewItem lvi in listView1.CheckedItems)

{

//Lấy về phần tử thứ mấy (ô thứ mấy) của ListViewItem (của 1 hàng):sử dụng SubItems

//DataGridView <-> ListView

MessageBox.Show(lvi.SubItems[0].Text);

}

//Giờ thì bạn chạy và check thử vài hàng để thấy rõ kết quả

}

2.5.9.6.3. Xóa một Cột tại vị trí nào đó

private void btRemoveAtColumns_Click(object sender, EventArgs e)

{

//Chú ý: Tập các column trong Listview là một Collection nên có đầy đủcác phương thức của một Collection.

//Ví dụ: Xóa một cột ở vị trí nào đó

listView1.Columns.RemoveAt(1);

//Giờ thì bạn chạy và nhấn vào Button này để thấy kết qủa để xem cáckết quả

}

Page 53: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 53 -

Hình 7.2: Columns ↔ Collection

2.5.9.6.4. Xóa một hàng tại một vị trí nào đó

→ Hoàn toàn tương tự như xóa một cột

private void btRemoveAtItems_Click(object sender, EventArgs e)

{

//Chú ý: Tập các Items trong Listview là một Collection nên có đầy đủcác phương thức của một Collection.

//Ví dụ: Xóa một cột ở vị trí nào đó (tất nhiên bạn phải tạo ra mộtlistview với các giá trị như mục 7.1)

listView1.Items.RemoveAt(1);

//Giờ thì bạn chạy và nhấn vào Button này để xem các kết quả

}

Page 54: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 54 -

Hình 7.4: Items ↔ Collection

2.5.9.6.5. Duyệt tất cả các file trong một thư mục và hiển thị nên ListView

private void btShowFile_Click(object sender, EventArgs e)

{

//Listview (listView1) này hiển thị tất cả các File trong C:\WINDOWS

//Bạn có thể dùng hộp thoại FolderBrowserDialog để duyệt file trongthư mục bất kì mà bạn chọn

//Phương thức Clear xóa toán bộ Listview

listView1.Clear();

//Chọn một số thuộc tính cho Listview thông qua mã lệnh

listView1.View = View.Details;

listView1.FullRowSelect = true;//Cho phép chọn cả hàng như hình kếtquả dưới

listView1.GridLines = true;

//Add các cột vào Listview bằng mã lệnh

//Mỗi file có các đặc tính của file: Tên, kích thước, kiểu file(ReadOnly, System...) nên chúng ta tạo ra các cột tương ứng

listView1.Columns.Add("Number", 100, HorizontalAlignment.Left);

listView1.Columns.Add("Name", 300, HorizontalAlignment.Left);

Page 55: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 55 -

listView1.Columns.Add("Size", 150, HorizontalAlignment.Left);

listView1.Columns.Add("Type", 100, HorizontalAlignment.Left);

//Nên khai báo đổi tượng DirectoryInfo để duyệt file

//DirectoryInfo là một lớp nằm trong System.IO

DirectoryInfo dir = new DirectoryInfo(@"C:\WINDOWS");

//Khai báo i để lấy về Số thứ tự file: 1, 2, 3....

int i = 0;

//Khai báo một ListviewItem - Một Hàng

ListViewItem lvi;

//Duyệt File ()

foreach (FileInfo f in dir.GetFiles("*.*"))

{

//Tăng giá trị i nên 1

i++;

//Gán các thành phần cho lvi qua thuộc tính SubItems.Add

lvi = new ListViewItem(i.ToString());

lvi.SubItems.Add(f.Name);

lvi.SubItems.Add(f.Length.ToString());

lvi.SubItems.Add(f.Attributes.ToString());

//Sau khi đã gán phải Add vào Listview

listView1.Items.Add(lvi);

}

//Hết

Page 56: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 56 -

}

Hình 7.5: Kết quả sau khi nhấn vào Button Show File

2.5.9.6.6. làm việc với Group trong ListView

private void btGroup_Click(object sender, EventArgs e)

{

//Ý tưởng: Chúng ta muốn đưa tất cả các file có cùng thuộc tính vào mộtnhóm

//làm việc với nhóm các bạn chú ý đối tượng ListViewGroup

//Xóa Listview trướcđã

listView1.Clear();

//Đặt một số thuộc tính bằng Code

listView1.View = View.Details;

//Khai báo 3 nhóm

ListViewGroup gArchive;

ListViewGroup gSystem;

ListViewGroup gNormal;

Page 57: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 57 -

//Add các cột vào Listview bằng mã lệnh

listView1.Columns.Add("Number", 100, HorizontalAlignment.Left);

listView1.Columns.Add("Name", 300, HorizontalAlignment.Left);

listView1.Columns.Add("Size", 150, HorizontalAlignment.Left);

listView1.Columns.Add("Type", 100, HorizontalAlignment.Left);

//Add 3 nhóm - Group vào Listview

gArchive = new ListViewGroup("Archive");

gSystem = new ListViewGroup("System");

gNormal = new ListViewGroup("Normal");

listView1.Groups.Add(gArchive);

listView1.Groups.Add(gSystem);

listView1.Groups.Add(gNormal);

//Listview này hiển thị tất cả các File trong C:\WINDOWS

//Nên khai báo đổi tượng DirectoryInfo

DirectoryInfo dir = new DirectoryInfo(@"C:\WINDOWS");

//Khai báo i để lấy về Số thứ tự file: 1, 2, 3....

int i = 0;

string ThuocTinhFile = "";

//Khai báo một ListviewItem-Một Hàng

ListViewItem lvi;

//Duyệt file và đưa vào Group các file cùng thuộc tính

foreach (FileInfo f in dir.GetFiles("*.*"))

{

Page 58: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 58 -

i++;

//Gán các thành phần cho lvi qua thuộc tính SubItems.Add

lvi = new ListViewItem(i.ToString());

lvi.SubItems.Add(f.Name);

lvi.SubItems.Add(f.Length.ToString());

//Lấy về thuộc tính tập tin và xử lý

ThuocTinhFile = f.Attributes.ToString();

lvi.SubItems.Add(ThuocTinhFile);

//Nhóm tập tin Archive

if (ThuocTinhFile.StartsWith("Archive"))

gArchive.Items.Add(lvi);

//Nhóm tập tin Archive

if (ThuocTinhFile.StartsWith("System"))

gSystem.Items.Add(lvi);

//Nhóm tập tin Archive

if (ThuocTinhFile.StartsWith("Normal"))

gNormal.Items.Add(lvi);

//Sau khi đã gán phải Add vào Listview

listView1.Items.Add(lvi);

}

//Hết- Kết quả xem hình dưới

}

Page 59: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 59 -

Hình 7.6: Group

2.5.9.6.7. Lấy về giá trị của một ô (SubItems) bất kì nào đó trên ListView (sự kiệnlistView1_ItemActivate)

Giả sử chúng ta có hình như sau:

Chúng ta muốn lấy thông tin về sinh viên “Phạm Thị Hạnh” bạn có thể sửdụng đoạn code sau:

private void listView1_ItemActivate(object sender, EventArgs e)

{

ListViewItem lvi = listView1.FocusedItem;

Page 60: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 60 -

MessageBox.Show(lvi.Text);//Lấy ra giá trị ô text đầu tiên

//Lấy về cột thứ 1 - Cột Quê quán (Cột trông ListView có chỉ số bắt đầu= 0)

string Cot1 = lvi.SubItems[1].Text;

MessageBox.Show("Giá trị cột thứ 1: " + Cot1);

//Lấy về cột thứ 2 - Cột Lớp

string Cot2 = lvi.SubItems[2].Text;

MessageBox.Show("Giá trị cột thứ 2: " + Cot2);

//Giờ thì bạn chạy và Click vào một hàng xem để xem kết quả

//Ứng dụng: Thường ứng dụng trong lập trình CSDL: Hiển hị tất cả cáccác thông tin (sinh viên chả hạn)

//nên ListView. khi người dùng chọn một hàng trên ListView thì hiểnthị các giá trị tương ứng nên

//Các Textbox. khi đó bạn có thể chỉnh sửa các thông tin và Update vàoCSDL....

//................

}

Page 61: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 61 -

2.5.10. DataGridView

2.5.10.1. Chức năngĐiều khiển DataGridView dùng để hiển thị dữ liệu.

2.5.10.2. Một số khái niệm liên quan đến DataGridView

Hình 1: Ví dụ về DataGirdView

Hình 2: Khái niệm Columns trong DataGridView

Page 62: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 62 -

Hình 3: Khái niệm về Rows trong DataGridView

Hình 4: Khái niệm về Cells trong DataGridView

→ DataGridView ≡ Mảng 2 chiều

→ Có 2 cách để truy xuất đến một ô (để lấy giá trị) trong DataGridView (các bạn

chú ý hai câu lệnh này)

Cách 1: Tên_DataGridView[Chỉ_số_cột, Chỉ_số_hàng].Value

Page 63: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 63 -

Cách 2: Tên_DataGridView.Rows[Chỉ_số_hàng].Cells[Chỉ_số_Cột].Value

Ví dụ:

Có một DataGridView như sau:

Chúng ta muốn lấy giá trị của một ô bôi đen chúng ta có thể sử dụng câu lệnh

sau (tên của DataGridView là: dgSinhVienTK4):

string str = dgSinhVienTK4[0, 2].Value.ToString();

Hoặc

string str = dgSinhVienTK4.Rows[2].Cells[0].Value.ToString();

2.5.10.3. Một số thuộc tính thường dùng

Tên Ý nghĩa

AutoSizeColumnsMode Các kiểu lựa chọn với Cột (Đặt các chế độ khác

nhau)

AutoSizeRowsMode Các kiểu lựa chọn với Hàng (Đặt các chế độ khác

nhau)

BackGroundColor Chọn mầu nền cho DataGridView

BorderStyle Đặt kiểu đường viền ngoài bao quanh cho

DataGridView

CellBorderStyle Đặt đường viền cho các ô

Page 64: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 64 -

ColumnHeadersBorderStyle

ColumnHeadersHeight

ColumnHeadersVisible Nhận một trong hai giá trị True hay False- True: Cho phép hiển thị tiêu đề các cột- False: Không cho phép hiển thị tiêu để

các cột

Columns Làm việc với cột (Đặt tiêu đề cho Headers, lựa

chọn kiểu cột (Checkbox, Button, Image…). →

Trong DataGridView một cột có thể là: Cột các

Button, Cột các Checkbox…

DataMember Chọn cơ sở dữ liệu để hiển thị nên DataGridView

DataSource Chọn nguồn dữ liệu cho DataGridView (hai thuộc

tính DataSource và DataMember hay đi với nhau)

GridColor Chọn màu cho lưới (các hàng, các cột được ngăn

cách nhau bởi lưới)

MultiSelect Cho phép/Không cho phép chọn nhiều dòng?

ReadOnly Nhận một trong hai giá trị True hay False- True: Cho phép thay đổi giá trị các các

phần tử (các ô hay các Cell).- False: không cho phép thay đổi giá trị

các phần tử.

RowHeadersBorderStyle Chọn kiểu viền cho các Hàng (Rows).

RowHeaderVisible Nhận một trong hai giá trị True hay False- True: Cho phép hiển thị Headers của

hàng(Cột đầu tiên ở mép ngoài bên

trái)

Page 65: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 65 -

- False: Ngược lại

2.5.10.4. Một số sự kiện thường dùng

Tên Ý nghĩa

CellClick Xảy ra khi người dùng nhấn chọn một ô bất kì nào đó

trên DataGridView (tất nhiên DataGridView phải có dữ

liệu)

Chú ý: Trong DataGridView thì khái niệm Ô ≡ Cell

………………………………

2.5.10.5. Minh họa

Page 66: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 66 -

Giả sử chúng ta có một form có tên: frmDataGridView. Trên đó có chứa một số điềukhiển sau:

Điều khiển DataGridView có tên dataGridView1(Chúng ta để tất cả các thuộctính của dataGridView1với giá trị mặc định).

Button btCreate: minh họa việc tạo DataGridView với số hàng và số cột xácđịnh

Button btRemove: Minh họa xóa một cột, một hàng trong DataGridView Button btGet: Minh họa việc lấy số hàng và số cột trong DataGridView Button btAddCombobox: Minh họa việc Add một cột là Combobox vào

DataGridView Button btAddCheck: Minh họa việc Add một cột là Checkbox vào

DataGridView

Giao diện của chương trình như sau:

Chúng ta sẽ minh họa sử dụng DataGridView qua sự kiện Click của các button trên.

2.5.10.5.1. Tạo các cột trong DataGridView (bằng Code)

//Sự kiện Load của Form

private void frmDataGridView_Load(object sender, EventArgs e)

{

//Đặt thuộc tính cho DataGridView thông qua mã lệnh

dataGridView1.AutoSizeColumnsMode =DataGridViewAutoSizeColumnsMode.Fill;//Chú ý thuộc tính này

//Để thêm các cột vào DataGridView bạn có thể thêm thông qua thuộc tính

Page 67: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 67 -

COLUMNS trên hộp thoại Properties

//Hoặc bạn có thể thêm bằng Code

dataGridView1.Columns.Add("clName", "Họ và Tên");

dataGridView1.Columns.Add("clQueQuan", "Quê quán");

dataGridView1.Columns.Add("clLop", "Lớp");

dataGridView1.Columns.Add("clNgaySinh", "Ngay sinh");

//Thêm một hàng mới vào (hàng mới này chưa có dữ liệu gì)

dataGridView1.Rows.Add();

//Đưa dữ liệu vào hàng mới vừa tạo ra (Đặt giá trị cho một ô) -> Các bạn chúý có hai cách như thế này

dataGridView1[0, 0].Value = "Nguyễn Văn Hải";

dataGridView1.Rows[0].Cells[1].Value = "Hưng Yên";

dataGridView1[2, 0].Value = "TK4N1";

dataGridView1.Rows[0].Cells[3].Value = "29-03-1987";

} //Hết

→ sau khi chạy chương trình: form frmDataGridView sẽ có kết quả như sau:

2.5.10.5.2. Đặt số hàng và số cột cho DataGridView

//Sự kiện Load của Form

Page 68: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 68 -

private void btCreate_Click(object sender, EventArgs e)

{

//Đặt số hàng và số cột cho DataGridView (Ví dụ: thiết kế trong chơi cờCaro)

//Ví dụ: Tạo một DataGridView với 50 hàng và 50 Cột

dataGridView1.ColumnCount = 50; //Chú ý thuộc tính này

dataGridView1.RowCount = 50; //Chú ý thuộc tính này

//Thiết lập độ rộng cho các Ô

for (int i = 0; i < 50; i++)

{

dataGridView1.Columns[i].Width = 15;

dataGridView1.Rows[i].Height = 15;

}

} //Đã xong rồi. Giờ thì bạn chạy xem nào

2.5.10.5.3. Xóa một hàng (hay 1 cột, hay tất cả các hàng các cột) của DataGridView

private void brRemove_Click(object sender, EventArgs e)

{

//Tập các hàng, các cột trong DataGridView là một Collection

//Nên nó có đầy đủ các thuộc tính và phương thức của một Collection

//Xóa hàng thứ 1 (có chỉ số là 0)

dataGridView1.Rows.RemoveAt(0); //Xóa tất cả các hàng:dataGridView1.Rows.Clear();

//Tất nhiên nếu chúng ta có 2 hàng thì chúng ta không thể thực hiện câu lệnh:dataGridView1.Rows.RemoveAt(2);

//Xóa cột thứ 2 (có chỉ số là 1)

dataGridView1.Columns.RemoveAt(1); //Xóa tất cả các Cột:

Page 69: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 69 -

dataGridView1.Columns.Clear();

}

Rows ↔ Collection

Columns ↔ Collection

2.5.10.5.4. Lấy về số hàng và số cột hiện có của DataGridView

private void btGet_Click(object sender, EventArgs e)

{

//Lấy về số hàng và số cột

int i = dataGridView1.Rows.Count; //Lấy về số hàng

Page 70: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 70 -

int j = dataGridView1.Columns.Count;//Lấy về số cột

//Thông báo

string HC = "Số hàng: " + i.ToString() +'\n' + "Số cột: " + j.ToString();

MessageBox.Show(HC);

}

2.5.10.5.5. Add thêm một cột là Combobox vào DataGridView

private void frmDataGridView_Load(object sender, EventArgs e)

{

//Đặt thuộc tính cho DataGridView thông qua mã lệnh

dataGridView1.AutoSizeColumnsMode =DataGridViewAutoSizeColumnsMode.Fill;//Chú ý thuộc tính này

//Để thêm các cột vào DataGridView bạn có thể thêm thông qua thuộc tínhCOLUMNS trên hộp thoại Properties

//Hoặc bạn có thể thêm bằng Code

dataGridView1.Columns.Add("clName", "Họ và Tên");

dataGridView1.Columns.Add("clQueQuan", "Quê quán");

dataGridView1.Columns.Add("clLop", "Lớp");

dataGridView1.Columns.Add("clNgaySinh", "Ngay sinh");

//Thêm một hàng mới vào (hàng mới này chưa có dữ liệu gì)

dataGridView1.Rows.Add();

//Đưa dữ liệu vào hàng mới vừa tạo ra (Đặt giá trị cho một ô) -> Các bạn chúý có hai cách như thế này

dataGridView1[0, 0].Value = "Nguyễn Văn Hải";

dataGridView1.Rows[0].Cells[1].Value = "Hưng Yên";

Page 71: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 71 -

dataGridView1[2, 0].Value = "TK4N1";

dataGridView1.Rows[0].Cells[3].Value = "29-03-1987";

}

//Phương thức đưa dữ liệu vào Combobox

private static void AddData(ref DataGridViewComboBoxColumncomboboxColumn)

{

{

comboboxColumn.Items.AddRange(

new string[] { "SV1", "SV2", "SV3"});

}

}

// Add thêm một cột là Combobox vào DataGridView!!!

private void btAddCombobox_Click(object sender, EventArgs e)

{

//Khai báo mảng làm DataSource cho Combobox

string[] Mang = { "SV1", "SV2", "SV3" };

//Khai báo một cột thuộc kiểu Combobox

DataGridViewComboBoxColumn comboboxColumn = newDataGridViewComboBoxColumn();

//Đặt thông số và đưa dữ liệu vào Combobox

comboboxColumn.HeaderText = "Cột Combobox";

AddData(ref comboboxColumn);// Câu lệnh này<->comboboxColumn.DataSource = Mang;

//Câu lệnh Insert này đưa cột vào vị trí đầu của DataGridView

dataGridView1.Columns.Insert(0, comboboxColumn);

Page 72: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 72 -

// Add một cột vào vị trí cuối cùng của DataGridView (Chưa có dữ liệu).

comboboxColumn = new DataGridViewComboBoxColumn();

comboboxColumn.HeaderText = "Cột Combobox ";

dataGridView1.Columns.Add(comboboxColumn);

//Sử dụng phương thức Add mà chưa có thông sốcomboboxColumn.DisplayIndex = 3;

//Thì mặc định đưa vào cuối DataGridView còn nếu có

//comboboxColumn.DisplayIndex = 3; thì đưa vào cột 3

}

→ Sau khi chạy có kết quả như sau:

2.5.10.5.6. Add thêm một cột là Checkbox vào DataGridView

//Sự kiện Load của Form

private void frmDataGridView_Load(object sender, EventArgs e)

{

//Đặt thuộc tính cho DataGridView thông qua mã lệnh

dataGridView1.AutoSizeColumnsMode =

Page 73: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 73 -

DataGridViewAutoSizeColumnsMode.Fill;//Chú ý thuộc tính này

//Để thêm các cột vào DataGridView bạn có thể thêm thông qua thuộc tínhCOLUMNS trên hộp thoại Properties

//Hoặc bạn có thể thêm bằng Code

dataGridView1.Columns.Add("clName", "Họ và Tên");

dataGridView1.Columns.Add("clQueQuan", "Quê quán");

dataGridView1.Columns.Add("clLop", "Lớp");

dataGridView1.Columns.Add("clNgaySinh", "Ngay sinh");

//Thêm một hàng mới vào (hàng mới này chưa có dữ liệu gì)

dataGridView1.Rows.Add();

//Đưa dữ liệu vào hàng mới vừa tạo ra (Đặt giá trị cho một ô) -> Các bạn chúý có hai cách như thế này

dataGridView1[0, 0].Value = "Nguyễn Văn Hải";

dataGridView1.Rows[0].Cells[1].Value = "Hưng Yên";

dataGridView1[2, 0].Value = "TK4N1";

dataGridView1.Rows[0].Cells[3].Value = "29-03-1987";

}

//Add

private void btAddCheckbox_Click(object sender, EventArgs e)

{

DataGridViewCheckBoxColumn ch = newDataGridViewCheckBoxColumn();

{

ch.HeaderText = "Check";

//Chọn vị trí hiển thị của cột: Cột thứ 0, 1 hay 2...

ch.DisplayIndex = 3;

Page 74: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 74 -

//Có cho phép Chọn nhiều hay không? (Chỉ Check được vào mộtCheckbox)

ch.FalseValue = true;

//Nếu cho phép chọn nhiều thì dùng lệnh này: ch.TrueValue = true;

}

//Chèn vào DataGridView

dataGridView1.Columns.Add(ch); // <->dgSinhVienTK5.Columns.Insert(3,ch);

}

→ Sau khi chạy có kết quả như sau:

2.5.10.5.7. Lấy giá trị của một ô bất kì bạn chọn trên DataGridView

Giả sử chúng ta có một DataGridView có các giá trị như sau:

Page 75: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 75 -

Yêu cầu: Chúng ta muốn lấy ra giá trị của một ô (Cells) bất kì mà bạn chọn

Giải quyết: Sử dụng sự kiện CellClick của điều khiển DataGridView như sau:

//CÁC BẠN HỌC CÔNG NGHỆ NET HÃY NHỚ ĐOẠN MÃ NÀY

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgse)

{

//Lấy về vị trí của Hàng và cột đang được chọn

//Hai câu lệnh này QUAN TRỌNG các bạn chú ý

int Hang = e.RowIndex; //<-> int HangHienTai =dataGridView1.CurrentRow.Index;

int Cot = e.ColumnIndex;

//Lấy ra vị trí (Hàng và cột) mà bạn chọn

string ViTriBanChon = '\n' + "Hàng: " + Hang.ToString() + '\n' + "Cột: " +Cot.ToString();

MessageBox.Show("Vị trí đang chọn: " + ViTriBanChon);

//Lấy ra giá trị của ô (Cells) mà bạn chọn

string GiaTri = dataGridView1[Cot, Hang].Value.ToString();

//Hoặc: string GiaTri =dataGridView1.Rows[Hang].Cells[Cot].Value.ToString();

MessageBox.Show("Ô bạn chọn có giá trị: "+GiaTri);

//Giờ các bạn chạy thử xem nào? ^.^

}

2.5.10.5.8. Bắt sự kiện SelectedIndexChanged của cột là combobox

//Khai báo kiểu cột

DataGridViewComboBoxColumn cbcl;

Page 76: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 76 -

private void frmDataGridView_Load(object sender, EventArgs e)

{

//Đặt một số thuộc tính thông qua Code (sau khi Add các cột vào)

dataGridView1.AutoSizeColumnsMode =DataGridViewAutoSizeColumnsMode.Fill;

///Đặt số cột

//dataGridView1.ColumnCount = 10;

//dataGridView1.RowCount = 10;

///Add thêm các cột vào

dataGridView1.Columns.Add("clMaSV", "Mã SV");

dataGridView1.Columns.Add("clTen", "Tên");

dataGridView1.Columns.Add("clLop", "Lớp");

dataGridView1.Columns.Add("clNgaySinh", "Ngày sinh");

dataGridView1.Columns.Add("clQuequan", "Quê quán");

///Add thêm một cột vào DataGridView (Chưa có giá trị)

dataGridView1.Rows.Add();

dataGridView1[0, 0].Value = "M01";

dataGridView1[1, 0].Value = "Nguyễn Tuấn Anh";

dataGridView1[2, 0].Value = "Tk4N1";

dataGridView1[3, 0].Value = "13-02-1986";

dataGridView1[4, 0].Value = "Hưng Yên";

//Thêm một hàng mới - Cách 2

string[] str = new string[5] { "M02", "Nguyễn Thị Bích", "TK4N2", "14-02-1985", "Hưng Yên"};

Page 77: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 77 -

dataGridView1.Rows.Add(str);

///Phươnng thức Add, remove...Một cột hay hàng

///Lấy giá trị của một ô bất kì: Sự kiên CellClick

///Lấy ra giá trị của một ô và hiển thị nên các textbox

///Lấy sự kiện của cột là Combobox

///-----------------------------------------------------------------------------------

//Add thêm một cột là combobox vào

string[] Mang = new string[5] { "M01", "M02", "M03", "M04", "M05" };

//

cbcl= new DataGridViewComboBoxColumn();

cbcl.HeaderText = "Cột Combobox";

cbcl.Items.AddRange(Mang);

dataGridView1.Columns.Add(cbcl);//Add vào vị trí cuối cùng (Cột cuốicùng)

cbcl.DisplayIndex = 2;

//Add+DisplayIndex thì đưa vào vị trí chỉ định <->Insert (nhưng # Insert ởchỗ: chỉ số vẫn là cuối cùng)

//Còn hiển thị so ta chỉ định

//Add thêm một cột với vị trí chỉ định: Insert

cbcl = new DataGridViewComboBoxColumn();

cbcl.HeaderText = "Cột Combobox2";

cbcl.Items.AddRange(Mang);

dataGridView1.Columns.Insert(0, cbcl);

}

//-----------------------------------------------------------------------------------------------

//Lây về sự kiện của Combobox (Cột trong DataGridView)

Page 78: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 78 -

ComboBox Combo;

int i = 1;

void SuKien(object sender, EventArgs e)

{

string str = Combo.Text;

if(i==1)

{

MessageBox.Show(str);

i = 0;

}

}

//Quan trọng

private void dataGridView1_EditingControlShowing(object sender,DataGridViewEditingControlShowingEventArgs e)

{

if (e.Control is ComboBox)

{

Combo = (ComboBox)e.Control;

Combo.SelectedIndexChanged += new EventHandler(SuKien);

i = 1;

}

}

//Sự kiện CellClick lấy về giá trị của một Ô

private void dataGridView1_CellClick(object sender,DataGridViewCellEventArgs e)

{

int Cot = e.ColumnIndex;

Page 79: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 79 -

int Hang = e.RowIndex;

if (dataGridView1[Cot, Hang].Value != null)

{

MessageBox.Show(dataGridView1[Cot, Hang].Value.ToString());

}

}

//End

Page 80: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 80 -

2.6. User Control

2.6.1. Khái niệm

User là điều khiển do người dùng tạo ra (không có sẵn trong tập các Control của

VS). User Control được xây dựng Khi muốn kết hợp chức năng của một hoặc nhiều

điều khiển với nhau hoặc khi cần có những cách hiển thị đặc biệt hay những xử lý

khác hơn.

Ví dụ: Xây dựng DataGridView tích hợp sẵn các phương thức

Text2DataGridView, DataGridView2Text (dùng nhiều lần)

2.6.2. Cách xây dựng các User Control

2.6.2.1. User Control dùng trong một dự án- Kết hợp nhiều điều khiển: Project Add New Item…User Control- Kế thừa từ một điều khiển: Tạo Add Class Kế thừa điều khiển cần xâydựng

2.6.2.2. User Control dùng trong nhiều dự án

File New ProjectChọn Winform Class Library

Page 81: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 81 -

2.7. Thao tác với file XML

2.7.1. XML là gì?

XML viết tắt của chữ eXtensible Markup Language (ngôn ngữ nâng cấp có thể

mở rộng) là một bộ qui luật về cách chia một tài liệu ra làm nhiều phần, rồi đánh dấu

và ráp các phần khác nhau lại để dễ nhận diện chúng.

Tổ hợp Web toàn cầu W3C gọi XML là "một cú pháp thông dụng cho việc biểu

thị cấu trúc trong dữ liệu". Dữ liệu có cấu trúc tham chiếu đến dữ liệu được gán nhãn

cho nội dung, ý nghĩa, hoặc công dụng.

XML có cấu trúc giống như HTML tuy nhiên HTML sử dụng những thẻ được

định nghĩa trước (trong một tài liệu html không thể sử dụng thẻ do người dùng định

nghĩa), còn trong trang XML hoàn toàn có thể sử dụng những thẻ do người dùng định

nghĩa.

2.7.2. Cú pháp XML

Một trang XML phải tuân thủ các quy luật sau.

1. Một trang XML phải bắt đầu bằng XML declaration (ví dụ: <?xml

version="1.0" encoding="utf-8" ?>)

2. Phải có một root (gốc) Element duy nhất, gọi là Document Element, nó

chứa tất cả các Elements khác trong tài liệu.

3. Mỗi Child Element phải nằm trọn bên trong Element cha của nó.

4. Mỗi opening Tag phải có một closing Tag giống như nó (Nếu Tag nào

không chứa gì ở giữa thì phải chấm dứt bằng "/>", thí dụ như <BR/>,

<HR/>…). opening Tag và closing Tag phải được đánh vần y như nhau,chữ hoa hay chữ thường.

5. Các Tag không được xen kẽ nhau (thí dụ như<Class>TK6<Lop>TK6</Class></Lop> là bất hợp lệ vì <Lop> nằm trong

Tag Class).

6. Giá trị Attribute trong XML phải được gói giữa một cặp ngoặc kép

2.7.3. Đọc/ghi file XML trong C#

Page 82: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 82 -

2.7.3.1. Ghi dữ liệu ra file XML

Trong C# để ghi dữ liệu ra file XML chúng ta có thể sử dụng 1 các đối tượng

sau:

XmlTextWriter

XmlWriter

XmlDocument

Minh họa: Để tạo trang XML SinhVien.xml có cấu trúc như bên dưới chúng ta

có thể sử dụng XmlTextWriter hay XmlDocument (trước khi sử dụng các đối tượng

này phải khai báo namespace using System.Xml;).

Trang SinhVien.xml

- Sử dụng đối tượng XmlTextWriter:

XmlTextWriter xmlText = new XmlTextWriter("SinhVien.xml", null);//Ghi chú thíchxmlText.WriteComment("Đọc ra file XML");

//Ghi dữ liệu: 1 lớp có nhiều sinh viên (tên, năm sinh)xmlText.WriteStartElement("Lop");//Bản ghi thứ nhấtxmlText.WriteStartElement("SinhVien");xmlText.WriteAttributeString("ID","1");

xmlText.WriteStartElement("Ten");xmlText.WriteString("Hoàng Quốc Việt");xmlText.WriteEndElement();//</Name>

xmlText.WriteStartElement("NamSinh");xmlText.WriteValue(1985);xmlText.WriteEndElement();

xmlText.WriteEndElement();

Page 83: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 83 -

//Bản ghi thứ 2xmlText.WriteStartElement("SinhVien");xmlText.WriteAttributeString("ID", "2");

xmlText.WriteStartElement("Ten");xmlText.WriteString("Nguyễn Anh Tuấn");xmlText.WriteEndElement();

xmlText.WriteStartElement("NamSinh");xmlText.WriteValue(1986);xmlText.WriteEndElement();

xmlText.WriteEndElement();

//Đóng filexmlText.Close();

- Sử dụng đối tượng XmlDocument

XmlDocument xmlDoc = new XmlDocument();

XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8",

null);

//Tạo Node gốc <->Class

XmlElement LopNode = xmlDoc.CreateElement("Lop");//Root Node

xmlDoc.InsertBefore(xmlDec, xmlDoc.DocumentElement);

xmlDoc.AppendChild(LopNode);

//Tạo bản ghi thứ nhất

XmlElement SinhVienNode =xmlDoc.CreateElement("SinhVien");

SinhVienNode.SetAttribute("ID", "1");

LopNode.AppendChild(SinhVienNode);

//Tạo 2 node con cho bản ghi thứ nhất và set giá trị

XmlElement TenNode = xmlDoc.CreateElement("Ten");

XmlElement NamSinhNode = xmlDoc.CreateElement("NamSinh");

TenNode.InnerText = "Hoàng Quốc Việt";

NamSinhNode.InnerText = "1985";

Page 84: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 84 -

SinhVienNode.AppendChild(TenNode);

SinhVienNode.AppendChild(NamSinhNode);

//Tạo bản ghi thứ hai

XmlElement SinhVienNode2 = xmlDoc.CreateElement("SinhVien");

SinhVienNode2.SetAttribute("ID", "2");

LopNode.AppendChild(SinhVienNode2);

//Tạo 2 node con cho bản ghi thứ nhất và set giá trị

XmlElement TenNode2 = xmlDoc.CreateElement("Ten");

XmlElement NamSinhNode2 = xmlDoc.CreateElement("NamSinh");

TenNode2.InnerText = "Nguyễn Anh Tuấn";

NamSinhNode2.InnerText = "1986";

SinhVienNode2.AppendChild(TenNode2);

SinhVienNode2.AppendChild(NamSinhNode2);

//Lưu file

xmlDoc.Save(@"SinhVien.xml");

Chú ý: việc sử dụng đối tượng XmlWriter hoàn toàn tương tự như việc sử dụng

đối tượng XmlTextWriter

2.7.3.2. Đọc dữ liệu từ file XML

Để đọc dữ liệu từ file xml chúng ta có thể sử dụng một trong các đối tượng

sau:

XmlTextReader

XmlReader

Minh họa: Đọc nội dung của file SinhVien.xml ở trên và hiển thị thông tin (tên,

năm sinh) của từng sinh viên (MessageBox). Ở đây chúng ta sử dụng đối tượng

XmlTextReader. Việc sử dụng đối tượng XmlReader là hoàn toàn tương tự.

Page 85: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 85 -

string strSinhVien = "";string strTenNode = "";//XmlTextReader read = new XmlTextReader("SinhVien.xml");//while (read.Read()){

switch (read.NodeType){

case XmlNodeType.Element:strTenNode = read.Name;break;

case XmlNodeType.Text:switch (strTenNode){

case "Ten":strSinhVien += read.Value;strSinhVien += ",";//Hai thông tin ngăn cách nhau bởi dấu ,break;

case "NamSinh":strSinhVien += read.Value;MessageBox.Show(strSinhVien);//In từng bản ghistrSinhVien = "";break;

}break;

}}

Khi chạy đoạn code này (qua sự kiện click của node button) thì sẽ hiển thị ra hai

MessageBox

Page 86: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 86 -

2.8. Thao tác với Registry

2.8.1. Giới thiệu về Registry

Registry là một cơ sở dữ liệu dùng để lưu trữ thông số kỹ thuật của Windows.

Nó ghi nhận tất cả các thông tin khi bạn thay đổi, chỉnh sửa trong Menu Settings,

Control Panel....

Trong Win95 & 98, Registry được ghi trong 2 file: user.dat và system.dat trong

thư mục Windows. Trong Windows Me, Registry được lưu trong file Classes.dat trong

thư mục Windows. Trong Win2K Registry được lưu trong thư mục

"Windows\System32\Config".

Registry có thể chỉnh sửa trực tiếp, làm thay đổi các thông số thông qua trình

chỉnh sữa Registry Editor. Chạy Registry Editor bằng cách gõ regedit vào cửa sổ Run

(Start run regedit)

Registry lưu tất cả các thông tin về phần cứng, phần mềm, những lựa chọn của

người dùng....kiểm soát được nội dung của Registry là yêu cầu tất yếu để bạn sử dụng

PC một cách khoa học, hiểu sâu hơn về môi trường làm vịệc của Windows.

Muốn tiến xa hơn trong kỹ thuật lập trình trên nền Windows, cách bảo mật,

cracking, hacking bạn cần phải có hiểu biết nhất định về Registry.

2.8.2. Cấu trúc Registry của Windows

Registry có cấu trúc cây, giống cấu trúc thư mục. Thông thường có sáu nhánh

chính. Mỗi nhánh được giao hiệm vụ lưu giữ những thông tin riêng biệt. Trong các

Page 87: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 87 -

nhánh chính có rất nhiều nhánh con. Những nhánh con này cũng được lưu giữ nhưng

thông tin riêng biệt.

HKEY_CLASSES_ROOT: Lưu những thông tin dùng chung cho toàn bộ

hệ thống.

HKEY_CURRENT_USER: Lưu những thông tin cho người dùng đang

Logon

HKEY_LOCAL_MACHINE: Lưu những thông tin về hệ thống, phần

cứng, phần mềm.

HKEY_USERS: Lưu những thông tin của tất cả các User, mỗi user là một

nhánh với tên là số ID của user đó

HKEY_CURRENT_CONFIG: Lưu thông tin về phần cứng hiện tại đang

dùng.

HKEY_DYN_DATA: Đây cũng là một phần của nhánh

HKEY_LOCAL_MACHINE

Registry sử dụng một số kiểu dữ liệu sau:

REG_BINARY: Kiểu nhị phân

REG_DWORD: Kiểu Double Word

REG_EXPAND_SZ: Kiểu chuỗi mở rộng đặc biệt. VD: "%SystemRoot%"

REG_MULTI_SZ: Kiểu chuỗi đặc biệt

REG_SZ: Kiểu chuỗi chuẩn

2.8.3. Thao tác với Registry trong C#

Trong C# để thao tác với registry: đọc, ghi thì chúng ta sử dụng đối tượng

RegistryKey (phải khai bó namespace using Microsoft.Win32 trước khi sử dụng đối

tượng này)

Minh họa cho việc thao tác với registry ở đây chúng ta có 3 ví dụ:

2.8.3.1. Tạo Key

Page 88: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 88 -

//Khai báo Key và Set thuộc tính

const string Path = @"Software\Microsoft\Windows\CurrentVersion\Run";

RegistryKey key = Registry.CurrentUser.OpenSubKey(Path,true);

key.SetValue("UTEHY", Application.ExecutablePath);

2.8.3.2. Lấy giá trị một key

const string Path = @"Software\Microsoft\Windows\CurrentVersion\Run";

RegistryKey key = Registry.CurrentUser.OpenSubKey(Path, true);

string s = (string)key.GetValue("UTEHY ");

MessageBox.Show(s);//UTEHY được tạo ở mục 1.7.3.1

2.8.3.3. Xóa một Key

const string Path = @"Software\Microsoft\Windows\CurrentVersion\Run";

RegistryKey key = Registry.CurrentUser.OpenSubKey(Path,true);

key.DeleteValue("UTEHY"); //UTEHY được tạp ở mục 1.7.3.1

Page 89: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 89 -

CHƯƠNG 3: LẬP TRÌNH CƠ SỞ DỮ LIỆU

3.1. Giới thiệu ADO.NET

Vị trí của ADO.NET trong kiến trúc của .net Framework

ADO.NET là một tập các lớp nằm trong bộ thư viện lớp cơ sở của .NET

Framework, cho phép các ứng dụng Windows (như C#, VB.NET) hay ứng dụng web

(như ASP.NET) thao tác dễ dàng với các nguồn dữ liệu.

Mục tiêu chính của ADO.NET là:

Cung cấp các lớp để thao tác CSDL trong cả hai môi trường là phi kết nối

(Disconected data) và kết nối (Connected data).

Tích hợp chặt chẽ với XML (Extensible Markup Language)

Tương tác với nhiều nguồn dữ liệu thông qua mô tả dữ liệu chung.

Tối ưu truy cập nguồn dữ liệu (OleDb & SQL server).

Làm việc trên môi trường Internet (môi trường phi kết nối – Disconnected

eviroment).

Các lớp của ADO.NET được đặt trong Namespace là System.Data. ADO.NET

bao gồm 2 Provider (2 bộ thư viện) (thường dùng) để thao tác với các CSDL là:

OleDb Provider (nằm trong System.Data.OleDb) dùng để truy xuất đến bất

kỳ CSDL nào có hỗ trợ OleDb.

SQL Provider (nằm trong System.Data.SQLClient) chuyên dùng để truy

xuất đến CSDL SQL Server.

Page 90: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 90 -

3.2. Các mô hình thao tác với CSDL

ADO.NET có 5 thành phần chính.

Connection

Command

DataReader

DataAdapter

DataSet

ADO.NET cho phép làm việc với cơ sở dữ liệu ở cả hai chế độ, chế độ Kết nối

(Connected) và phi kết nối (Disconnected).

Trong chế độ Connected thì mỗi khi thao tác (như sửa, xóa, thêm) thì đều

đòi hỏi ứng dụng phải kết nối và thao tác trực tiếp với cơ sở dữ liệu

(CSDL). Ba đối tượng Connection, Command và DataReader: cho phép

làm việc ở chế độ Connected

Còn trong chế độ Disconnected thì vẫn có thể thêm, sửa, xóa dữ liệu trên

đối tượng cục bộ, không nhất thiết phải kết nối ngay đến CSDL. Các đối

tượng DataAdapter, Connection, Command và Dataset làm việc ở chế độ

Disconnected

Kiến trúc của ADO.NET

Page 91: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 91 -

3.3. Kết nối đến nguồn dữ liệu bằng đối tượng Connection

3.3.1. Chức năng

Đối tượng Connection có nhiệm vụ thực hiện kết nối đến Cơ sở dữ liệu để

các đối tượng như Command thao tác với CSDL thông qua Connection

này.

Đối tượng Connection có hai phương thức hay dùng là Open() để mở kết

nối tới CSDL và Close() để đóng kết nối tới CSDL.

3.3.2. Khai báo

Chúng ta có một số cách khai báo đối tượng Connection như sau:

using System;

using System.Data;

using System.Data.SqlClient;

namespace WindowsFormsInCSharp

{

public partial class frmADONET : Form

{

public frmADONET()

{

InitializeComponent();

}

//Khai báo chuỗi kết nối tới CSDL (Server là .\SQLEXPRESS, Tên cơ sở dữ liệu

là CSDL)

static string strConnect = @"Data Source=.\SQLEXPRESS;Initial

Catalog=CSDL;Integrated Security=True";

Page 92: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 92 -

//Khai báo đối tượng Connection (SqlConnection)

SqlConnection sqlCon;//Cách 1

SqlConnection sqlCon2 = new SqlConnection();//Cách 2

SqlConnection sqlCon3 = new SqlConnection(strConnect);//Cách 3

}

}

3.3.3. Kết nối tới Cơ sở dữ liệu- Mở kết nối tới CSDL

Sử dụng phương thức Open() của đối tượng Connection để mở kết nối tới

CSDL (trong ConnectionString - chuỗi kết nối tới CSDL).

Sau khi gọi phương thức Open(), có thể xem đã kết nối thanh công hay

không thông qua thuộc tính State của Connection:

if (sqlCon.State == ConnectionState.Open) MessageBox.Show("Đã kết nối

thành công tới CSDL");- Đóng kết nối

Sử dụng phương thức Close() của đối tượng Connection để đóng kết nốitới CSDL.

Chú ý: Chúng ta thường viết một phương thức để mở kết nối tới CSDL và một

phương thức để đóng kết nối tới CSDL như sau:

using System.Data;

using System.Data.SqlClient;

namespace WindowsFormsInCSharp

{

public partial class frmADONET : Form

Page 93: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 93 -

{

public frmADONET()

{

InitializeComponent();

}

//Khai báo chuỗi kết nối tới CSDL

static string strConnect = @"Data Source=.\SQLEXPRESS;Initial

Catalog=CSDL;Integrated Security=True";

//Khai báo đối tượng Connection (SqlConnection)

SqlConnection sqlCon;//sử dụng cách 1

//Phương thức kết nối tới CSDL (thường gọi trong sự kiện Load của Form)

void KetNoi()

{

sqlCon = new SqlConnection(strConnect);

//Kết nối tới nguồn CSDL

if (sqlCon.State == ConnectionState.Closed)

sqlCon.Open();

//Kiểm tra kết nối có thành công hay không có thể làm như sau:

if (sqlCon.State == ConnectionState.Open)

MessageBox.Show("Kết nối thành công!");

}

//Ngắt kết nối (thường gọi trong sự kiện FormClosing của Form)

Page 94: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 94 -

void NgatKetNoi()

{

sqlCon.Close();

}

//Gọi phương thức Mở kết nối

private void frmADONET_Load(object sender, EventArgs e)

{

KetNoi();

}

//Gọi phương thức ngắt kết nối

private void frmADONET_FormClosing(object sender, FormClosingEventArgs

e)

{

NgatKetNoi();

}

3.4. Thực thi câu lệnh SQL bằng đối tượng Command

3.4.1. Chức năng

Dùng để thực thi các câu lệnh SQL thao tác với CSDL như : Insert,

Update, Select, Delete…

Trước khi thực thi câu lệnh SQL bằng đối tượng Command thì bắt buộc

phải mở kết nối tới CSDL (gọi phương thức KetNoi() ở trên).

3.4.2. Khai báo

Chúng ta có một số cách khai báo đối tượng Command như sau:

Page 95: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 95 -

using System.Windows.Forms;

using System.Data;

using System.Data.SqlClient;

namespace WindowsFormsInCSharp

{

public partial class frmADONET : Form

{

public frmADONET()

{

InitializeComponent();

}

//Khai báo đối tượng Command (sqlCommand)

SqlCommand sqlCom;

SqlCommand sqlCom2 = new SqlCommand();

}

}

3.4.3. Các phương thức thường của đối tượng Command

Đối tượng Command có một số phương thức sau:

ExecuteScalar(): Thực hiện câu lệnh mà kết quả trả về chỉ có 1 ô (Ví dụ

câu lệnh Select Count(*)…).

ExecuteReader(): Thực hiện câu lệnh Select và trả về một DataReader

Page 96: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 96 -

ExecuteNonQuery(): Thực hiện câu lệnh OLEDB nhưng không trả về kết

quả (Delete, Update, Insert …).

ExecuteXMLReader(): Tạo một bộ đọc từ file XML. Phương thức này

không có trong OleDbCommand, chỉ có trong SqlCommand.

3.4.4. Sử dụng đối tượng Command

Giả sử chúng ta có một cơ sở sữ liệu SQL có tên: CSDL. Cơ sở dữ liệu đó bao gồm

một bảng: tbSinhVien(MaSinhVien, TenSinhVien, Lop, NgaySinh, QueQuan) để lưu

trữ thông tin về một số sinh viên

Giả sử chúng ta có một form có tên frmADONET. Trên form đó có chứa một số

điều khiển sau:

DataGridView: dgSinhVien để hiển thị dữ liệu trong bảng tbSinhVien.

Các Textbox: txtMaSinhVien, txtTenSinhVien, txtLop, txtNgaySinh,

txtQueQuan dùng để nhập dữ liệu

Các nút button: btMoi, btThem, btSua, btXoa minh họa sử dụng đối tượng

Command để thao tác với CSDL (Insert, Update, Delete…)

using System.Windows.Forms;

using System.Data;

using System.Data.SqlClient;

Page 97: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 97 -

namespace WindowsFormsInCSharp

{

public partial class frmADONET : Form

{

public frmADONET()

{

InitializeComponent();

}

//Khai báo chuỗi kết nối tới CSDL

static string strConnect = @"Data Source=.\SQLEXPRESS;InitialCatalog=CSDL;Integrated Security=True";

//Khai báo đối tượng Connection (SqlConnection) và SqlCommand

SqlConnection sqlCon;//sử dụng cách 1

SqlCommand sqlCom;

SqlCommand sqlCom2 = new SqlCommand();

//Phương thức kết nối tới CSDL

void KetNoi()

{

sqlCon = new SqlConnection(strConnect);

//Kết nối tới nguồn CSDL

if (sqlCon.State == ConnectionState.Closed)

sqlCon.Open();

}

//Ngắt kết nối (thường gọi trong sự kiện FormClosing của Form)

void NgatKetNoi()

{

sqlCon.Close();

Page 98: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 98 -

}

/// <summary>

/// Phương thức thực thi câu lệnh SQL (Insert, Update, Delete)

/// </summary>

/// <param name="strSQL">Chuỗi string mô tả Câu lệnh SQL: Insert, Update,Delete</param>

void ThucThi(string strSQL)

{

//Bước 1: Kết nối tới CSLD (Gọi phương thức KetNoi)

KetNoi();

//Bước 2: Khởi tạo và gọi phương thức của đối tượng Command

sqlCom = new SqlCommand(strSQL, sqlCon);

sqlCom.ExecuteNonQuery();

//Bước 3: Ngắt kết nối

NgatKetNoi();

}

//Mới

private void btMoi_Click(object sender, EventArgs e)

{

foreach (Control ctr in this.splitContainer1.Panel2.Controls)

{

if ((ctr is TextBox) || (ctr is MaskedTextBox))

{

ctr.Text = "";

}

}

}

Page 99: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 99 -

//Thêm bản ghi mới vào bảng tbSinhVien

private void btThem_Click(object sender, EventArgs e)

{

string strThem = "Insert into tbSinhVien values('"+ txtMaSinhVien.Text+"','"+txtTenSinhVien.Text+"','"+txtLop.Text+"','"+mkNgaySinh.Text+"','"+txtQueQuan.Text+"')";

ThucThi(strThem);

}

//Sửa bản ghi

private void btSua_Click(object sender, EventArgs e)

{

string strSua = "update tbSinhVien set TenSinhVien='" +txtTenSinhVien.Text + "',Lop='" + txtLop.Text + "',NgaySinh='" +mkNgaySinh.Text + "',QueQuan='" + txtQueQuan.Text + "' whereMaSinhVien='"+txtMaSinhVien.Text+"' ";

ThucThi(strSua);

}

//Xóa bản ghi

private void btXoa_Click(object sender, EventArgs e)

{

string strXoa = "delete from tbSinhVien where MaSinhVien='"+txtMaSinhVien.Text +"' ";

ThucThi(strXoa);

}

//End

}

3.5. Truy vấn và nhận về dữ liệu với DataReader

3.5.1. Chức năng.

Dùng để đón nhận kết quả (dữ liệu) trả về từ phương thức ExecuteReader

của đối tượng Command. Tuy nhiên dữ liệu là Readonly và chỉ đọc theo

chiều tiến

Page 100: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 100 -

3.5.2. Khai báo

Khai báo: SqlDataReader Biến_DataReader;//Không có New

Lấy kết quả từ Command

<Biến_DataReader > = <Biến_Command>.ExecuteReader();

3.5.3. Sử dụng đối tượng DataReader

Giả sử chúng ta muốn hiển thi tên của tất cả sinh viên tring bảng

tbSinhVien(MaSinhVien, TenSinhVien, Lop, NgaySinh, QueQuan), chúng ta sử dụng

đối tượng SqlDataReader như sau.

using System.Data;using System.Data.SqlClient;

namespace SampleDatabaseProgramming{

public partial class frmADONET : Form{

public frmADONET(){

InitializeComponent();}

//Khai báo các chuỗi kết nối và các đối tượngstring strConnect = @"Data Source=.\SQLEXPRESS;Initial

Catalog=CSDL;Integrated Security=True";SqlConnection sqlCon;SqlCommand sqlCom;SqlDataReader sqlRd;SqlParameter sqlPa;

//Phương thức kết nối tới CSDL SQL Serverprivate void KetNoi(){

sqlCon = new SqlConnection(strConnect);if (sqlCon.State == ConnectionState.Closed){

sqlCon.Open();}

}

//Phương thức đóng kết nối tới CSDLprivate void NgatKetNoi()

Page 101: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 101 -

{if (sqlCon.State == ConnectionState.Open){

sqlCon.Close();}

}

//Phương thức đọc dữ liệupublic void DocDuLieu(){

KetNoi();//kết nối tới CSDLsqlCom = new SqlCommand("select TenSinhVien from tbSinhVien", sqlCon);sqlRd = sqlCom.ExecuteReader();//while (sqlRd.Read()){

MessageBox.Show(sqlRd["TenSinhVien"].ToString());//HoặcsqlRd["TenSinhVien"].ToString()

}//Ngắt kết nốiNgatKetNoi();

}

//Gọi phương thức đọc dữ liệuprivate void frmADONET_Load(object sender, EventArgs e){

DocDuLieu();}

}}

3.6. Cập nhật và truy vấn dữ liệu với đối tượng DataAdapter

3.6.1. Chức năng

Có chức năng như một chiếc cầu nối giữa nguồn (tệp) dữ liệu và các bảng

được cached trong bộ nhớ (đối tượng DataSet.). DataAdapter sử dụng

phương thức Fill() để nhận dữ liệu từ nguồn dữ liệu vào một dataset.

3.6.2. Khai báo đối tượng DataAdapter

Khai báo: SqlDataAdapter BiếnAdapter;

Biến Adapter có các phương thức khởi dựng sau:

Page 102: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 102 -

Sử dụng: BiếnAdapter.Fill(<Biến dataset>, “Tên cho bảng”); or

BiếnAdapter.Fill(<Biến_DataTable>, “Tên cho bảng”);

3.6.3. Sử dụng đối tượng DataAdapter

3.6.3.1. Sử dụng đối tượng DataAdapter để truy vấn dữ liệu

Chúng ta muốn lấy dữ liệu bảng tbSinhVien ở trên chúng ta có thể sử dụng đối

tượng DataAdapter như bên dưới.

using System.Data;using System.Data.SqlClient;

namespace SampleDatabaseProgramming{

public partial class frmADONET : Form{

public frmADONET(){

InitializeComponent();}

//Khai báo các chuỗi kết nối và các đối tượngSqlDataAdapter sqlAdap;

//Truy vấn dữ liệu sử dụng đối tượng DataAdapterDataTable TruyVanDuLieu(){

DataTable dt=new DataTable();//sqlAdap = new SqlDataAdapter("select * from tbSinhVien", @"Data

Page 103: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 103 -

Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True");sqlAdap.Fill(dt);//return dt;

}

3.6.3.2. Sử dụng DataAdapter để cập nhật (inserts, update…) dữ liệu

using System.Data;using System.Data.SqlClient;

namespace SampleDatabaseProgramming{

public partial class frmADONET : Form{

//Khai báo đối tượngSqlDataAdapter sqlAdap;

//Cập nhật dữ liệu với DataAdapterDataTable CapNhatDuLieu(){

DataTable dt=new DataTable();//sqlAdap = new SqlDataAdapter("Insert into tbSinhVien

values('M02',N'Nguyễn Văn Quyết','TK2', '10/10/1988','Hưng Yên')", @"DataSource=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True");

sqlAdap.Fill(dt);//return dt;

}

//Gọi phương thức cập nhật dữ liệuprivate void frmADONET_Load(object sender, EventArgs e){

CapNhatDuLieu();}

}}

3.7. Mô hình DataSet

3.7.1. Chức năng

Dataset là một lớp dùng để thao tác với dữ liệu theo mô hình dữ liệu phi

kết nối. Nó được coi như là một kho chứa các bảng (table). Người dùng có

Page 104: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 104 -

thể thay đổi dữ liệu trong các bảng này và khi thực sự muốn cập nhật vào

Cơ sở dữ liệu thì DataSet sẽ thực hiện cập nhật thông qua lớp DataAdapter

Các bảng trong DataSet có thể do DataAdapter Fill vào hoặc cũng có thể là

các bảng được tạo thành từ lớp DataTable.

3.7.2. Khai báo

DataSet BienDataSet=new DataSet(); //Chú ý: Phải có New trước khi sửdụng biến DataSet

3.7.3. Mô hình DataSet

Mối quan hệ giữa DataAdapter và DataSet

Mối quan hệ giữa DataSet và DataTable

Page 105: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 105 -

Mô hình DataTabble

3.8. Sử dụng DataView trong sắp xếp và tìm kiếm dữ liệu

3.9. Ràng buộc dữ liệu với các điều khiển

3.9.1. Mục đích

Gắn kết các điều khiển (Textbox…) vào các trường dữ liệu trong CSDL

3.9.2. Sử dụng

Trong C#: để gắn kết dữ liệu với các điều khiển chúng ta thường sử dụng đối

tượng BindingManagerBase (xem ví dụ minh họa đi kèm)

Page 106: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 106 -

CHƯƠNG 4: CRYSTAL REPORT

4.1. Thiết kế báo cáo với Crystal Report

Bước 1: Tạo 1 Project Visual C#.NET bình thường

Bước 2: Để thiết kế Report bạn thêm vào dự án vừa tạo ở bước 1 một Item Report

bằng cách:

Page 107: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 107 -

Page 108: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 108 -

Report được chia làm 5 khu vực (Section):

Section 1 (Report Header): Những thiết kế trên phần này chỉ xuất

hiện trên trang đầu tiên của báo cáo (Report) (nếu báo cáo có nhiều

trang).

Section 2 (Page Header): Những thiết kế trên phần này sẽ xuất hiện

trên tất cả các của báo cáo (nếu báo cáo có nhiều trang).

Section 3 (Detail): Khu vực này hiển thị nội dung bảng CSDL.

Section 4 (Report Footer) và Section 5(Page Footer) có ý nghĩa

tương tự như Section 1 và 2.

Bước 3: Kết nối đến nguồn CSDL

Page 109: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 109 -

Chú ý: Tùy thuộc CSDL là gì (SQL Server, Access, Excel…) mà chúng ta chọn Driver

cho thích hợp (trong trường hợp này tôi chọn kết nối đến SQL Server)

Page 110: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 110 -

Chọn tên Server từ Combobox Server (ở đây tên server của tôi là:

VIETHQTK1 hoặc bạn có thể gõ vào đó là localhost…). Sau đó bạn chọn CSDL mà

muốn hiển thị ra Report ở Combobox Database (ở đây tôi chọn CSDL Northwind)

Page 111: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 111 -

Chọn các bảng dữ liệu cần hiển thị dữ liệu ra Report bên khung bên trái sau đó

nhấn nút >. Khi đó danh sách các bảng bạn chọn sẽ hiển thị ra bên tay phải bạn (ở đây

tôi muốn hiển thị bảng CSDL Customers).

Bước 4: Thiết kế Report

Đế thiết kế reports Visual Studio cung cấp một số điều khiển (trong hộp thoại

Toolbox), các điều khiển này cũng có các thuộc tính như trong các ứng dụng Window

Form.Ở đây ta chú ý đến 2 điều khiển- Text Object: Hiển thi chuỗi Text (như một Label)- Line Object: Dùng kẻ các đường thẳng.

Trước hết chúng ta thiết kế cho 2 phần Section 1 (Report Header) (thường hiển

thị CỘNG HÒA XÃ HỘI CHỦ NGHĨA……..) và Section 2 (Page Header) (thường

hiển thị tiêu đề báo cáo). Ở đây: 2 phần này tôi dùng điều khiển Text Object để thiết

kế.

Page 112: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 112 -

Tiếp đến chúng ta thiết kế để dữ liệu từ CSDL hiển thị ra Report. Chúng ta làm

theo các bước sau:

Bạn kéo lần lượt các trường trong bảng CSDL Customers ở trong khung Field

Explorer bên tay trái vào khu vực Section 3 (Details) ta sẽ được như hình dưới đây.

Page 113: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 113 -

Để xem các kết quả thiết kế của bạn bạn có thể chọn Tab Main Report

Preview để xem kết quả như dưới đây.

Để quay trở lại thiết kế các bạn chọn Tab Main Report

Page 114: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 114 -

→ Quá trình thiết kế Report hoàn tất bây giờ đến bước hiển thị Report ra Form

4.2. Nạp và hiển thị Report trong chương trình

Bước 5: Hiển thị Report ra form

Để hiến thị Report nên Form, VS hỗ trợ điều khiển CystalReportViewr trong

Tab Reporting.

Bạn hãy kéo điều khiển đó vào form sau đó đặt thuộc tính ReportSource cho

điều khiển đó là Reports chúng ta vừa thiết kế → Giờ thì bạn hãy chạy form và xem

kết quả xem nào!

Page 115: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 115 -

4.3. Thiết kế Report động

4.3.1. Mục đích

Truyền dữ liệu từ form (dữ liệu được nhập vào từ textbox, dữ liệu từ biến…)

sang report nhằm thiết kế các report động.

4.3.2. Sử dụng

Yêu cầu: Truyền dữ liệu từ textbox có tên txtTenSinhVien (txtTenSinhVien

nằm trên form frmDynamicReport) sang một report có tên reDynamicReport.

Cách làm:

Bước 1: Thiết kế report có nội dung như sau (hoàn toàn tương tự như bước 4 ở

trên).

Trên Report có một TextObject có tên txtTenSinhvien dùng để đón nhận kết

quả truyền từ form sang.

Bước 2: Thiết kế form có giao diện như sau (frmDynamicReport).

frmDynamicReport được chia làm hai phần sử dụng SplitContainer.

Phần thứ nhất (Panel 1) chứa một textbox có tên txtTenSinhVien để truyền

dữ liệu sang TextObject (txtTenSinhVien) trên Report. Button OK để minh

họa cho việc truyền dữ liệu.

Phần thứ 2 (Panel 2) chứa điều khiển crystalReportViewer1để hiển thị

report thiết kế ở bước 1.

Page 116: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 116 -

Bước 3: Truyền dữ liệu từ Textbox sang Report

using CrystalDecisions.CrystalReports;using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.CrystalReports.Engine.Migration;

namespace CrystalReport2008{

public partial class frmDynamicReport : Form{

private void btOK_Click(object sender, EventArgs e){

crDynamicReport rpt = new crDynamicReport();

//Truyền dữ liệu

((TextObject)rpt.ReportDefinition.ReportObjects["txtTenSinhVien"]).Text = txtTenSinhVien.Text;

//Refresh datacrystalReportViewer1.ReportSource = rpt;crystalReportViewer1.RefreshReport();

}}

}

Sau khi nhấn button OK ta sẽ có kết quả như bên dưới.

Page 117: 04 de cuong

Đề cương môn học: Chuyên đề lựa chọn 02 Hệ: Cao đẳng chính quy

- 117 -