winform+adonet
TRANSCRIPT
![Page 1: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/1.jpg)
Project 2
- 1 -
MỤC LỤC
MỤC LỤC ......................................................................................................... 1
CHƯƠNG 1: KIẾN TRÚC CỦA .NET.............................................................. 3
1.1. Môi trường thực thi ngôn ngữ chung – CLR .......................................... 3
1.2. Ngôn ngữ trung gian - IL ....................................................................... 4
1.3. Giới thiệu về .Net Framework................................................................ 5
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........................................................... 10
2.4. Một số control...................................................................................... 16
2.4.1. Textbox.......................................................................................... 16
2.4.2. RichTextBox.................................................................................. 25
2.4.3. DataGridView................................................................................ 32
2.4.4. ListView ........................................................................................ 56
2.5. User Control ........................................................................................ 78
2.6. Thao tác với file XML ......................................................................... 78
2.7. Thao tác với Registry........................................................................... 83
CHƯƠNG 3: LẬP TRÌNH CƠ SỞ DỮ LIỆU.................................................. 86
3.1. Giới thiệu ADO.NET........................................................................... 86
3.2. Các mô hình thao tác với CSDL........................................................... 87
![Page 2: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/2.jpg)
Project 2
- 2 -
3.3. Kết nối đến nguồn dữ liệu bằng đối tượng Connection ........................ 88
3.4. Thực thi câu lệnh SQL bằng đối tượng Command ............................... 93
3.5. Truy vấn và nhận về dữ liệu với DataReader ..................................... 101
3.6. Cập nhật và truy vấn dữ liệu với đối tượng DataAdapter ................... 104
3.7. Mô hình DataSet ................................................................................ 107
3.8. Đối tượng Parameter .......................................................................... 109
3.9. Ràng buộc dữ liệu với các điều khiển................................................. 113
3.10. Sử dụng DataView trong sắp xếp và tìm kiếm dữ liệu..................... 113
3.11. LINQ .............................................................................................. 113
CHƯƠNG 4: CRYSTAL REPORT ............................................................... 114
4.1. Thiết kế báo cáo với Crystal Report ................................................... 114
4.2. Nạp và hiển thị Report trong chương trình ......................................... 122
4.3. Thiết kế Report động ......................................................................... 123
![Page 3: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/3.jpg)
Project 2
- 3 -
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ớ
![Page 4: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/4.jpg)
Project 2
- 4 -
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ệ.
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 5: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/5.jpg)
Project 2
- 5 -
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.
![Page 6: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/6.jpg)
Project 2
- 6 -
Để 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: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/7.jpg)
Project 2
- 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 New Project …
Bước 2: Chọn Ứng dụng dạng Windows Forms Application, chọn nơi lữutrữ Project (xem hình) nhấn OK.
![Page 8: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/8.jpg)
Project 2
- 8 -
2.2. Lớp Control
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
BackGroundImage Chọn ảnh làm nền cho Form
![Page 9: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/9.jpg)
Project 2
- 9 -
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
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
![Page 10: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/10.jpg)
Project 2
- 10 -
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
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
![Page 11: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/11.jpg)
Project 2
- 11 -
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)
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)
![Page 12: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/12.jpg)
Project 2
- 12 -
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: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/13.jpg)
Project 2
- 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
else
e.Cancel = true;//Không đóng Form nữa
}
![Page 14: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/14.jpg)
Project 2
- 14 -
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");
}
//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
![Page 15: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/15.jpg)
Project 2
- 15 -
if (e.KeyCode == Keys.F && e.Modifiers == Keys.Control)
MessageBox.Show("Sự kiện KeyDown được gọi khi bạn nhấn Ctrl + 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 hay GIỮ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ột TRÁI");
else if (e.Button==MouseButtons.Middle)
MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuột GIỮA");
else if (e.Button==MouseButtons.Right)
MessageBox.Show("Sự kiện MouseClick xảy ra khi bạn Click chuột PHẢI");
}
//Các sự kiện MouseDoubleClick, MouseDown, MouseUp... Xử lý tương tự
![Page 16: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/16.jpg)
Project 2
- 16 -
2.4. Một số control
2.4.1. Textbox
2.4.1.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.4.1.2. Một số thuộc tính thường dùngTê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).- 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
![Page 17: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/17.jpg)
Project 2
- 17 -
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ó)- 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
![Page 18: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/18.jpg)
Project 2
- 18 -
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.4.1.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
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.4.1.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
![Page 19: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/19.jpg)
Project 2
- 19 -
Textbox
TextChanged Xảy ra khi giá trị Text của Texbox (hay gọi giá trị
Textbox) thay đổi
2.4.1.5. Minh họa
![Page 20: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/20.jpg)
Project 2
- 20 -
2.4.1.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: "+ 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.4.1.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 Button nà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);
![Page 21: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/21.jpg)
Project 2
- 21 -
}
2.4.1.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 hay không. Nếu có thì nó tự Bôi đen từ đó
string str = "chào";
int i;
i = textBox1.Text.LastIndexOf(str);
if (i >= 0)
{
textBox1.SelectionStart = i;
textBox1.SelectionLength = str.Length;
}
}
![Page 22: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/22.jpg)
Project 2
- 22 -
2.4.1.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.4.1.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ỗi dượ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ính SelectionStart và SelectionLength
//Ví dụ:
txtNoiDung.Select(10, 5);
//<-> 2 câu lệnh này
//textBox1.SelectionStart = 10;
![Page 23: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/23.jpg)
Project 2
- 23 -
//textBox1.SelectionStart = 5;
}
2.4.1.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.4.1.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ý
![Page 24: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/24.jpg)
Project 2
- 24 -
else
e.Handled = true;
}
2.4.1.5.8. Xử lý chỉ cho phép Textbox nhập số (sự kiện KeyPress của Textbox) – Cách 2private 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ố hay không, hàm này trả về kiểu bool
//Char.IsContro(e.KeyChar) -->
//kiểm tra xem phím vừa nhập vào textbox có phải là các ký tự điều khiể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ố trongtrường hợp nhậ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ảo Notepad)
![Page 25: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/25.jpg)
Project 2
- 25 -
2.4.2. RichTextBox
2.4.2.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.4.2.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
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
![Page 26: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/26.jpg)
Project 2
- 26 -
2.4.2.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
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.4.2.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.
![Page 27: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/27.jpg)
Project 2
- 27 -
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.4.2.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 28: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/28.jpg)
Project 2
- 28 -
2.4.2.4.2. Chọn Font cho vùng bôi đen thông qua thuộc tính SelectionFont (Chỉ vùng bô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ệnh này
//richTextBox1.Font = fo.Font;
}
}
2.4.2.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
![Page 29: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/29.jpg)
Project 2
- 29 -
string Color = richTextBox1.SelectionColor.Name.ToString();
MessageBox.Show(Color);
}
2.4.2.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)
{
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.4.2.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.4.2.4.6. Minh họa sử dụng phương thưc LoadFileprivate void btRichTextBox_Click(object sender, EventArgs e)
{
![Page 30: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/30.jpg)
Project 2
- 30 -
//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ột file trên máy
}
2.4.2.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ào một nơi bất kì trên máy
}
2.4.2.4.8. Minh họa Phương thức Findprivate void btRichTextBox_Click(object sender, EventArgs e)
{
//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);
![Page 31: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/31.jpg)
Project 2
- 31 -
//-> Ứ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(tham khảo WordPad)
![Page 32: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/32.jpg)
Project 2
- 32 -
2.4.3. DataGridView
2.4.3.1. Chức năngĐiều khiển DataGridView dùng để hiển thị dữ liệu.
2.4.3.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 33: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/33.jpg)
Project 2
- 33 -
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 34: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/34.jpg)
Project 2
- 34 -
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.4.3.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
![Page 35: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/35.jpg)
Project 2
- 35 -
CellBorderStyle Đặt đường viền cho các ô
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)- False: Ngược lại
![Page 36: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/36.jpg)
Project 2
- 36 -
2.4.3.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.4.3.5. Minh họa
![Page 37: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/37.jpg)
Project 2
- 37 -
Giả sử chúng ta có một form có tên: frmDataGridView. Trên đó có chứa một số điều khiển sau:
Điều khiển DataGridView có tên dataGridView1(Chúng ta để tất cả các thuộc tính của dataGridView1vớigiá 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.
![Page 38: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/38.jpg)
Project 2
- 38 -
2.4.3.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 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";
![Page 39: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/39.jpg)
Project 2
- 39 -
} //Hết
→ sau khi chạy chương trình: form frmDataGridView sẽ có kết quả như sau:
2.4.3.5.2. Đặt số hàng và số cột cho DataGridView
//Sự kiện Load của Form
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
![Page 40: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/40.jpg)
Project 2
- 40 -
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.4.3.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);
![Page 41: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/41.jpg)
Project 2
- 41 -
//Xóa cột thứ 2 (có chỉ số là 1)
dataGridView1.Columns.RemoveAt(1); //Xóa tất cả các Cột: dataGridView1.Columns.Clear();
}
Rows ↔ Collection
![Page 42: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/42.jpg)
Project 2
- 42 -
Columns ↔ Collection
2.4.3.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
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();
![Page 43: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/43.jpg)
Project 2
- 43 -
MessageBox.Show(HC);
}
2.4.3.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ính 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();
![Page 44: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/44.jpg)
Project 2
- 44 -
//Đư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";
}
//Phương thức đưa dữ liệu vào Combobox
private static void AddData(ref DataGridViewComboBoxColumn comboboxColumn)
{
{
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" };
![Page 45: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/45.jpg)
Project 2
- 45 -
//Khai báo một cột thuộc kiểu Combobox
DataGridViewComboBoxColumn comboboxColumn = new DataGridViewComboBoxColumn();
//Đặ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);
// 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
![Page 46: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/46.jpg)
Project 2
- 46 -
}
→ Sau khi chạy có kết quả như sau:
2.4.3.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 = DataGridViewAutoSizeColumnsMode.Fill;//Chú ý thuộc tính này
![Page 47: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/47.jpg)
Project 2
- 47 -
//Để thêm các cột vào DataGridView bạn có thể thêm thông qua thuộc tính 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";
}
//Add
private void btAddCheckbox_Click(object sender, EventArgs e)
{
![Page 48: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/48.jpg)
Project 2
- 48 -
DataGridViewCheckBoxColumn ch = new DataGridViewCheckBoxColumn();
{
ch.HeaderText = "Check";
//Chọn vị trí hiển thị của cột: Cột thứ 0, 1 hay 2...
ch.DisplayIndex = 3;
//Có cho phép Chọn nhiều hay không? (Chỉ Check được vào một Checkbox)
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:
![Page 49: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/49.jpg)
Project 2
- 49 -
2.4.3.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 50: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/50.jpg)
Project 2
- 50 -
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, DataGridViewCellEventArgs e)
{
//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? ^.^
![Page 51: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/51.jpg)
Project 2
- 51 -
}
2.4.3.5.8. Bắt sự kiện SelectedIndexChanged của cột là combobox
//Khai báo kiểu cột
DataGridViewComboBoxColumn cbcl;
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");
![Page 52: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/52.jpg)
Project 2
- 52 -
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"};
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
///-----------------------------------------------------------------------------------
![Page 53: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/53.jpg)
Project 2
- 53 -
//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ối cù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 54: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/54.jpg)
Project 2
- 54 -
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);
![Page 55: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/55.jpg)
Project 2
- 55 -
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;
int Hang = e.RowIndex;
if (dataGridView1[Cot, Hang].Value != null)
{
MessageBox.Show(dataGridView1[Cot, Hang].Value.ToString());
}
}
//End
![Page 56: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/56.jpg)
Project 2
- 56 -
2.4.4. ListView
2.4.4.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.4.4.2. Một số khái niệm liên quan đến ListView
Hình 1: Minh họa về ListView
Hình 2: Cột trong ListView
![Page 57: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/57.jpg)
Project 2
- 57 -
Hình 3: Khái niệm ColumnHeader
Hình 4: Khái niệm ListViewItem
![Page 58: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/58.jpg)
Project 2
- 58 -
Hình 5: Khái niệm SubItems
Hình 6: Minh họa về Group
![Page 59: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/59.jpg)
Project 2
- 59 -
2.4.4.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- 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
![Page 60: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/60.jpg)
Project 2
- 60 -
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
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
![Page 61: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/61.jpg)
Project 2
- 61 -
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
2.4.4.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 đó
………………………………
![Page 62: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/62.jpg)
Project 2
- 62 -
2.4.4.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.4.4.6. Minh họa
![Page 63: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/63.jpg)
Project 2
- 63 -
Giả sử chúng ta có một form có tên: frmListView. Trên đó có chứa một số điều khiể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.
2.4.4.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 xem kế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);
![Page 64: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/64.jpg)
Project 2
- 64 -
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ụng ColumnHeader
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);
//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"};
![Page 65: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/65.jpg)
Project 2
- 65 -
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 66: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/66.jpg)
Project 2
- 66 -
2.4.4.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 Check là","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.4.4.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.
![Page 67: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/67.jpg)
Project 2
- 67 -
//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ác kết quả
}
Hình 7.2: Columns ↔ Collection
2.4.4.6.4. Xóa một hàng tại một vị trí nào đó
![Page 68: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/68.jpg)
Project 2
- 68 -
→ 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ột listview 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ả
}
Hình 7.4: Items ↔ Collection
2.4.4.6.5. Duyệt tất cả các file trong một thư mục và hiển thị nên ListView
![Page 69: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/69.jpg)
Project 2
- 69 -
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 trong thư 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ết quả 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);
listView1.Columns.Add("Size", 150, HorizontalAlignment.Left);
listView1.Columns.Add("Type", 100, HorizontalAlignment.Left);
![Page 70: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/70.jpg)
Project 2
- 70 -
//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);
![Page 71: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/71.jpg)
Project 2
- 71 -
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
}
Hình 7.5: Kết quả sau khi nhấn vào Button Show File
2.4.4.6.6. làm việc với Group trong ListView
![Page 72: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/72.jpg)
Project 2
- 72 -
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ột nhó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;
//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);
![Page 73: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/73.jpg)
Project 2
- 73 -
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
![Page 74: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/74.jpg)
Project 2
- 74 -
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("*.*"))
{
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);
![Page 75: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/75.jpg)
Project 2
- 75 -
//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
}
Hình 7.6: Group
![Page 76: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/76.jpg)
Project 2
- 76 -
2.4.4.6.7. Lấy về giá trị của một ô (SubItems) bất kì nào đó trên ListView (sự kiện listView1_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;
MessageBox.Show(lvi.Text);//Lấy ra giá trị ô text đầu tiên
![Page 77: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/77.jpg)
Project 2
- 77 -
//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ác cá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ển thị 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ào CSDL....
//................
}
![Page 78: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/78.jpg)
Project 2
- 78 -
2.5. User Control
2.6. Thao tác với file XML
2.6.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.6.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.
![Page 79: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/79.jpg)
Project 2
- 79 -
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.6.3. Đọc/ghi file XML trong C#
2.6.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");
![Page 80: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/80.jpg)
Project 2
- 80 -
xmlText.WriteString("Hoàng Quốc Việt");xmlText.WriteEndElement();//</Name>
xmlText.WriteStartElement("NamSinh");xmlText.WriteValue(1985);xmlText.WriteEndElement();
xmlText.WriteEndElement();
//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";
![Page 81: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/81.jpg)
Project 2
- 81 -
NamSinhNode.InnerText = "1985";
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.6.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 82: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/82.jpg)
Project 2
- 82 -
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 83: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/83.jpg)
Project 2
- 83 -
2.7. Thao tác với Registry
2.7.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.7.2. Cấu trúc Registry của Windows
![Page 84: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/84.jpg)
Project 2
- 84 -
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 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.7.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)
![Page 85: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/85.jpg)
Project 2
- 85 -
Minh họa cho việc thao tác với registry ở đây chúng ta có 3 ví dụ:
2.7.3.1. Tạo Key
//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.7.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.7.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 86: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/86.jpg)
Project 2
- 86 -
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.
![Page 87: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/87.jpg)
Project 2
- 87 -
SQL Provider (nằm trong System.Data.SQLClient) chuyên dùng để
truy xuất đến CSDL SQL Server.
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 88: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/88.jpg)
Project 2
- 88 -
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
{
![Page 89: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/89.jpg)
Project 2
- 89 -
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";
//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
}
}
![Page 90: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/90.jpg)
Project 2
- 90 -
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ối tớ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 91: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/91.jpg)
Project 2
- 91 -
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)
![Page 92: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/92.jpg)
Project 2
- 92 -
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)
void NgatKetNoi()
{
sqlCon.Close();
}
//Gọi phương thức Mở kết nối
private void frmADONET_Load(object sender, EventArgs e)
{
KetNoi();
![Page 93: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/93.jpg)
Project 2
- 93 -
}
//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 94: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/94.jpg)
Project 2
- 94 -
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;
![Page 95: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/95.jpg)
Project 2
- 95 -
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
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
![Page 96: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/96.jpg)
Project 2
- 96 -
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;
namespace WindowsFormsInCSharp
![Page 97: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/97.jpg)
Project 2
- 97 -
{
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;Initial Catalog=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
![Page 98: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/98.jpg)
Project 2
- 98 -
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();
}
/// <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
![Page 99: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/99.jpg)
Project 2
- 99 -
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 = "";
}
}
}
//Thêm bản ghi mới vào bảng tbSinhVien
private void btThem_Click(object sender, EventArgs e)
![Page 100: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/100.jpg)
Project 2
- 100 -
{
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 + "' where MaSinhVien='"+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
![Page 101: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/101.jpg)
Project 2
- 101 -
}
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
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.
![Page 102: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/102.jpg)
Project 2
- 102 -
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 103: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/103.jpg)
Project 2
- 103 -
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ặc sqlRd["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();}
}}
![Page 104: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/104.jpg)
Project 2
- 104 -
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 105: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/105.jpg)
Project 2
- 105 -
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(){
![Page 106: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/106.jpg)
Project 2
- 106 -
DataTable dt=new DataTable();//sqlAdap = new SqlDataAdapter("select * from tbSinhVien", @"Data 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')", @"Data
Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True");sqlAdap.Fill(dt);
![Page 107: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/107.jpg)
Project 2
- 107 -
//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ó 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
![Page 108: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/108.jpg)
Project 2
- 108 -
Mối quan hệ giữa DataAdapter và DataSet
Mối quan hệ giữa DataSet và DataTable
![Page 109: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/109.jpg)
Project 2
- 109 -
Mô hình DataTabble
3.8. Đối tượng Parameter
3.8.1. Chức năng
Sử dụng đối tượng SqlParameter để truyền giá trị (lấy từ textbox, có sẵn…) vào cho các tham số ứng với câu lệnh SQL hay
thử thục nội tại (StoredProcedure).
Chú ý: Chỉ sử dụng đối tượng này nếu câu lệnh SQL hay StoredProcedure có tham số.
3.8.2. Sử dụng
Giả sử chúng ta có một StoredProcedure thêm mới một bản ghi vào bảng tbSinhVien có nội dung:
CREATE PROCEDURE ThemMoiBanGhi(@MaSinhVien nchar(10),@TenSinhVien nvarchar(50),@Lop nchar(10),
![Page 110: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/110.jpg)
Project 2
- 110 -
@NgaySinh nchar(12),@QueQuan nvarchar(12))ASBEGIN
If exists (select MaSinhVien from tbSinhVien where MaSinhVien=@MaSinhVien)print 'Da co sinh vien nay'
elsebegin
Insert into tbSinhVien values (@MaSinhVien, @TenSinhVien,@Lop,@NgaySinh,@QueQuan)print 'Da them thanh cong'
endENDGO
Chúng ta sử dụng đối tượng SqlParameter như 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ượngstring strConnect = @"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True";
![Page 111: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/111.jpg)
Project 2
- 111 -
SqlConnection sqlCon;SqlCommand sqlCom;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(){
if (sqlCon.State == ConnectionState.Open){
sqlCon.Close();}
}
//Phương thức ThucThi ở dạng tổng quát: cả câu lệnh SQL và Stored Procedure//Thực thi nhiều lần và các Store hay câu lệnh SQL có tham số//Khai báo đối tượng Parameter/// <summary>/// Phương thức thực thi câu lệnh SQL hay StoredProcedure/// </summary>/// <param name="cmdType"> Thực thi dạng câu lệnh SQL hay StoredProcedure</param>/// <param name="strName"> Tên câu lệnh SQL hay tên StoredProcedure</param>/// <param name="MangTen"> Tên các tham số truyền vào StoredProcedure</param>
![Page 112: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/112.jpg)
Project 2
- 112 -
/// <param name="MangGiaTri">Giá trị truyền vào cho các biến trong StoredProcedure</param>/// <param name="MangType"> Kiểu dữ liệu của biến</param>public void ThucThi(CommandType cmdType, string strName, string[] MangTen, object[] MangGiaTri, DbType[] MangType){
KetNoi();//sqlCom = new SqlCommand();sqlCom.CommandType = cmdType;sqlCom.CommandText = strName;sqlCom.Connection = sqlCon;//Khai báo và gán các đối tượng Parameterfor (int i = 0; i < MangTen.Length; i++){
sqlPa = new SqlParameter();sqlPa.ParameterName = MangTen[i];sqlPa.Value = MangGiaTri[i];sqlPa.DbType = MangType[i];sqlCom.Parameters.Add(sqlPa);
}//Thực thi câu lệnhsqlCom.ExecuteNonQuery();NgatKetNoi();
}
//Gọi thực thi Storedprivate void frmADONET_Load(object sender, EventArgs e){
string[] MangTen = {"MaSinhVien","TenSinhVien","Lop","NgaySinh","QueQuan" };string[] MangGT = { "M01", "Nguyễn Văn A", "TK6", "10/10/1988", "Hưng Yên" };DbType[] MangType={DbType.String, DbType.String, DbType.String, DbType.String, DbType.String};//ThucThi(CommandType.StoredProcedure, "ThemMoiBanGhi", MangTen, MangGT, MangType);
}
![Page 113: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/113.jpg)
Project 2
- 113 -
//End}
}
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)
3.10. Sử dụng DataView trong sắp xếp và tìm kiếm dữ liệu
3.11. LINQ
![Page 114: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/114.jpg)
Project 2
- 114 -
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 115: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/115.jpg)
Project 2
- 115 -
▼
▼
▼
![Page 116: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/116.jpg)
Project 2
- 116 -
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 117: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/117.jpg)
Project 2
- 117 -
▼
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 118: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/118.jpg)
Project 2
- 118 -
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 119: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/119.jpg)
Project 2
- 119 -
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 120: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/120.jpg)
Project 2
- 120 -
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 121: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/121.jpg)
Project 2
- 121 -
Để 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 122: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/122.jpg)
Project 2
- 122 -
→ 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 123: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/123.jpg)
Project 2
- 123 -
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.
![Page 124: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/124.jpg)
Project 2
- 124 -
Phần thứ 2 (Panel 2) chứa điều khiển crystalReportViewer1để hiển
thị report thiết kế ở bước 1.
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();
}}
}
![Page 125: Winform+ADONET](https://reader035.vdocuments.net/reader035/viewer/2022081711/5572028e4979599169a3bd34/html5/thumbnails/125.jpg)
Project 2
- 125 -
Sau khi nhấn button OK ta sẽ có kết quả như bên dưới.