Các nhóm điều khiển trên formCác điều khiển thường dùng Các điều khiển chứa Các điều khiển menu Các điều khiển dữ liệu Các thành phần Các điều khiển hỗ trợ in Các điều khiển hộp thoại Sự
Trang 1Bài 4:
LẬP TRÌNH VỚI CSDL ADO.NET & KIẾN TRÚC KHÔNG KẾT NỐI
& LẬP TRÌNH GIAO DIỆN
Trang 2Các nhóm điều khiển trên form
Các điều khiển thường dùng
Các điều khiển chứa
Các điều khiển menu
Các điều khiển dữ liệu
Các thành phần
Các điều khiển hỗ trợ in
Các điều khiển hộp thoại
Sự kiện và xử lý sự kiện trong C#
Hệ thống bài cũ
Các nhóm điều khiển trên form
Các điều khiển thường dùng
Các điều khiển chứa
Các điều khiển menu
Các điều khiển dữ liệu
Các thành phần
Các điều khiển hỗ trợ in
Các điều khiển hộp thoại
Sự kiện và xử lý sự kiện trong C#
Lập trình giao diện - ứng dụng gồm nhiều form 2
Trang 3Thêm Toolbar, Tooltip vào form
Giới thiệu về ADO.NET
Trang 4ADO.NET (ActiveX Data Objects NET) là một thành
phần trong NET Framework đảm nhiệm vai trò thao
tác với CSDL
ADO.NET
ADO.NET (ActiveX Data Objects NET) là một thành
phần trong NET Framework đảm nhiệm vai trò thao
tác với CSDL
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 4
Trang 5ADO.NET là cầu nối giữa ứng dụng và CSDL
ADO.NET hỗ trợ các lập trình viên kết nối với hệ quản trịCSDL như SQL Server, Microsoft Access, Oracle…
ADO.NET
ADO.NET là cầu nối giữa ứng dụng và CSDL
ADO.NET hỗ trợ các lập trình viên kết nối với hệ quản trịCSDL như SQL Server, Microsoft Access, Oracle…
Trang 6Hỗ trợ lập trình
Cung cấp các lớp thao tác với CSDL giúp lập trình viên lập
trình nhanh hơn và giảm bớt lỗi
Cung cấp các công cụ để thao tác với CSDL ngay trên
phần Designer giúp lập trình viên tương tác với CSDL mà
không cần hiểu sâu về CSDL
Cung cấp các lớp thao tác với CSDL giúp lập trình viên lập
trình nhanh hơn và giảm bớt lỗi
Cung cấp các công cụ để thao tác với CSDL ngay trên
phần Designer giúp lập trình viên tương tác với CSDL mà
không cần hiểu sâu về CSDL
Trang 7Kiến trúc không kết nối
Kết nối được thiết lập và tạo một bản sao của CSDL ngay trên máy tính, sau đó kết nối được đóng
Thao tác với bản sao và update lại CSDL khi cần thiết
Ưu điểm
Tiết kiệm tài nguyên Bảo mật vì kết nối được mở trong thời gian ngắn
Kiến trúc không kết nối
Kiến trúc không kết nối
Kết nối được thiết lập và tạo một bản sao của CSDL ngay trên máy tính, sau đó kết nối được đóng
Thao tác với bản sao và update lại CSDL khi cần thiết
Ưu điểm
Tiết kiệm tài nguyên Bảo mật vì kết nối được mở trong thời gian ngắn
Trang 8ADO gồm hai phần
.NET data provider: cung cấp các lớp để kết nối, thực thi
lệnh SQL trên CSDL và lấy kết quả trả về
Dataset: lưu trữ bản sao của CSDL trên bộ nhớ Cung cấp
các phương thức cho phép ứng dụng thao tác với bản sao
Các thành phần chính của ADO.NET
ADO gồm hai phần
.NET data provider: cung cấp các lớp để kết nối, thực thi
lệnh SQL trên CSDL và lấy kết quả trả về
Dataset: lưu trữ bản sao của CSDL trên bộ nhớ Cung cấp
các phương thức cho phép ứng dụng thao tác với bản sao
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 8
Trang 9Data provider cung cấp các lớp để tương tác với CSDL
Data provider gồm 4 thành phần chính
Connection: kết nối với CSDL
Command: thực thi các lệnh sql để lấy dữ liệu từ CSDL
hoặc thay đổi CSDL
DataReader: đọc dữ liệu tuần tự từ CSDL
DataAdapter: lấy dữ liệu từ CSDL lưu vào dataset và cập
nhật CSDL
Data provider
Data provider cung cấp các lớp để tương tác với CSDL
Data provider gồm 4 thành phần chính
Connection: kết nối với CSDL
Command: thực thi các lệnh sql để lấy dữ liệu từ CSDL
hoặc thay đổi CSDL
DataReader: đọc dữ liệu tuần tự từ CSDL
DataAdapter: lấy dữ liệu từ CSDL lưu vào dataset và cập
nhật CSDL
Trang 10Ví dụ thực tiễn
Vấn đề: Một ngân hàng đa quốc gia có rất nhiều chi
nhánh Giả sử một chi nhánh ở Việt Nam muốn truy cập
DataSet Hỗ trợ kiến trúc không kết nối
Kết nối đến CSDL chỉ được mở khi lấy dữ liệu về dataset
và cập nhật dữ liệu trở lại CSDL
Mọi thao tác sẽ được thực hiện trên DataSet
DataSet không phụ thuộc vào loại CSDL
Dataset
Ví dụ thực tiễn
Vấn đề: Một ngân hàng đa quốc gia có rất nhiều chi
nhánh Giả sử một chi nhánh ở Việt Nam muốn truy cập
DataSet Hỗ trợ kiến trúc không kết nối
Kết nối đến CSDL chỉ được mở khi lấy dữ liệu về dataset
và cập nhật dữ liệu trở lại CSDL
Mọi thao tác sẽ được thực hiện trên DataSet
DataSet không phụ thuộc vào loại CSDL
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 10
Trang 11Cấu trúc của DataSet giống hệt cấu trúc của cơ sở dữ
liệu
Mỗi dataset gồm nhiều bảng
Các bảng có ràng buộc với nhau
Mỗi dataset gồm nhiều bảng
Các bảng có ràng buộc với nhau
Mỗi bảng có nhiều dòng và cột
Mỗi cột có nhiều dòng
Mỗi dòng có nhiều cột
Trang 12DataAdapter kết nối với CSDL thông qua Connection, lấy
dữ liệu lưu vào DataSet
Ứng dụng sẽ lấy và thay đổi dữ liệu trên DataSet
DataAdapter kết nối với CSDL thông qua Connection vàcập nhật lại CSDL
Kiến trúc không kết nối
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 12
Trang 13Các data provider được đặt trong các namespace khác nhau
Các lớp cho các data provider
Các loại Data provider
SQL Server System.Data.SqlClient OLE DB System.Data.OleDb
Oracle System.Data.OracleClient
Các data provider được đặt trong các namespace khác nhau
Các lớp cho các data provider
Oracle System.Data.OracleClient
Connection SqlConnection OleDbConnection OdbcConnection OracleConnection Command SqlCommand OleDbCommand OdbcCommand OracleCommand Data reader SqlDataReader OldeDbDataReader OdbcDataReader OracleDataReader Data
adapter
SqlDataAdapter OleDbDataAdapter OdbcDataAdapter OracleDataAdapter
Trang 14Các lớp của các loại data provider về cơ bản giống
Các loại Data provider
Các lớp của các loại data provider về cơ bản giống
Trang 15Thực hiện kết nối với CSDL
Phương thức khởi tạo
Thuộc tính và phương thức
Các giá trị trên chuỗi kết nối
SqlConnection
new SqlConnection() new SqlConnection( chuỗi-kết-nối )
Thuộc tính/Phương thức Mô tả
ConnectionString Cung cấp thông tin để truy cập đến CSDL SQL Server
Thực hiện kết nối với CSDL
Phương thức khởi tạo
Thuộc tính và phương thức
Các giá trị trên chuỗi kết nối
ConnectionString Cung cấp thông tin để truy cập đến CSDL SQL Server
Data source/Server Tên Server CSDL
Initial catalog/DataBase Tên của CSDL
UserID Tên của user đăng nhập vào CSDL
Trang 16DataAdapter hoạt động như cầu nối giữa dataset và
CSDL
SqlDataAdapter
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 16
Trang 17Phương thức khởi tạo
liệu từ dataset InsertCommand Lệnh sql hoặc sp để thêm dữ
liệu vào dataset UpdateCommand Lệnh sql hoặc sp để cập nhật
dữ liệu cho dataset
Trang 18đổi trên dataset lên CSDL
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 18
Trang 19Sử dụng phương thức DataAdapter để fill Dataset
Đọc dữ liệu vào form từ Dataset
Thay đổi dữ liệu trên Dataset
Update lại dữ liệu trên CSDL
Demo thao tác với
dữ liệu bằng kiến trúc không kết nối
Trang 20Các bước thực hiện Lập trình cơ sở dữ liệu
1 Khai báo các biến
SqlConnection conn; // biến connection kết nối đến CSDL
SqlCommand com; // thực thi các lệnh sql để lấy dữ liệu từ hoặc là thay
//đổi CSDL SqlDataAdapter da; // biến có kiểu
DataSet ds; // biến dataset
2 Khởi tạo biến
conn = new SqlConnection(" Data Source=localhost; Initial Catalog=ProductDB;Persist Security
da.Fill(ds, "Products"); // Đưa kết quả câu lệnh truy vấn vào dataset
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 20
2 Khởi tạo biến
conn = new SqlConnection(" Data Source=localhost; Initial Catalog=ProductDB;Persist Security
da.Fill(ds, "Products"); // Đưa kết quả câu lệnh truy vấn vào dataset
3 Lấy 1 dòng dữ liệu trong bảng
ds.Tables[0].Rows.Count; // trả về tổng số bản ghi
ds.Tables[0].Rows[i].ItemArray[ j ].ToString() // Lấy cột thứ J của hàng thứ i
Trang 21Demo load dữ liệu vào ListView
private void frmBookDetails_Load(object sender, EventArgs e)
Trang 22Demo hiển thị dữ liệu khi một dòng trên ListView được chọn
private void lvwBookDetails_Click(object sender, EventArgs e)
{
int index = lvwBookDetails.SelectedItems[0].Index; // Dòng được chọn
DataRow dr = ds.Tables[ "Products"].Rows[index]; // Lấy dòng được chọn
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 22
private void lvwBookDetails_Click(object sender, EventArgs e)
{
int index = lvwBookDetails.SelectedItems[0].Index; // Dòng được chọn
DataRow dr = ds.Tables[ "Products"].Rows[index]; // Lấy dòng được chọn
Trang 23ỨNG DỤNG
GỒM NHIỀU FORM ỨNG DỤNG
GỒM NHIỀU FORM
Trang 24Ứng dụng Payment gồm 2 form
Form Payment được mở khi nhấn vào button Select
Payment trên form Customer
Thao tác trên form Payment mới được thao tác trên form Customer
Chạy thử ứng dụng Payment
Lập trình giao diện - ứng dụng gồm nhiều form 24
Trang 25Có thể thêm một form mới hoặc một form có sẵn vào
Project
Thêm form vào Project
Thêm một form mới
Thêm một form mới
Thêm một form có sẵn
Trang 26Thêm form frmPayment và thiết kế như sau
Demo thêm form Payment vào Project
Lập trình giao diện - ứng dụng gồm nhiều form 26
Trang 27Khi ứng dụng nhiều form chạy, theo mặc định ứng dụng
sẽ tải form được tạo đầu tiên trước
Đối với ứng dụng nhiều form, với form này gọi form kia
Có thể lập trình viên muốn chạy từng form để kiểm thửtừng form
Hiển thị form đầu tiên của Project
Trang 28Thông tin về form được tải đầu tiên của project được lưutrong file Program.cs
Demo hiển thị form đầu tiên của Project
static void Main()
Lập trình giao diện - ứng dụng gồm nhiều form 28
static void Main()
Trang 29Có hai cách hiển thị form mới
Hiển thị theo kiểu dialog: Người dùng phải thao tác với
form mới này trước tiên
Hiển thị thông thường: Người dùng có thể thao tác với
form tùy ý
Cách hiển thị form mới
B1 Sử dụng từ khóa new để tạo form mới
B2 Sử dụng phương thức ShowDialog hoặc Show của
form mới để hiển thị form
Hiển thị form mới
Có hai cách hiển thị form mới
Hiển thị theo kiểu dialog: Người dùng phải thao tác với
form mới này trước tiên
Hiển thị thông thường: Người dùng có thể thao tác với
form tùy ý
Cách hiển thị form mới
B1 Sử dụng từ khóa new để tạo form mới
B2 Sử dụng phương thức ShowDialog hoặc Show của
form mới để hiển thị form
Form paymentForm = new frmPayment();
paymentForm.ShowDialog(); //Hiển thị form dialog
paymentForm.Show(); //Hiển thị form thông thường
Trang 30Demo hiển thị form Payment khi người dùng nhấn vào
button Select Payment trên form Customer
Demo hiển thị form Payment
private void btnSelectPayment_Click(object sender, System EventArgs e) {
Form paymentForm = new frmPayment();
DialogResult selectedButton = paymentForm.ShowDialog();
}
Lập trình giao diện - ứng dụng gồm nhiều form 30
private void btnSelectPayment_Click(object sender, System EventArgs e) {
Form paymentForm = new frmPayment();
DialogResult selectedButton = paymentForm.ShowDialog();
}
Trang 31DialogResult result = MessageBox.Show( "Bạn muốn xóa không", "Xóa",
Form Dialog được tạo sẵn
Form Dialog tự tạo
Xử lý sự kiện cho các button trên form dialog tự tạo
Thiết lập giá trị cho thuộc tính DialogResult
Lấy phản hồi của người dùng từ Dialog
Form Dialog được tạo sẵn
Form Dialog tự tạo
Xử lý sự kiện cho các button trên form dialog tự tạo
Thiết lập giá trị cho thuộc tính DialogResult
this.DialogResult = DialogResult.OK;
Trang 32Form Payment
Form Customer
Demo lấy phản hồi từ form Payment
private void btnOK_Click(object sender, EventArgs e)
Lập trình giao diện - ứng dụng gồm nhiều form 32
private void btnCancel_Click(object sender, EventArgs e)
Form paymentForm = new frmPayment();
DialogResult selectedButton = paymentForm.ShowDialog();
if (selectedButton == DialogResult.OK) {
MessageBox.Show( "Bạn vừa chọn OK");
} }
Trang 33Form cung cấp thuộc tính Tag để lưu đối tượng chứa dữliệu của form
Cũng có thể tự khai báo thuộc tính bất kỳ để lưu dữ liệucho form và truyền cho form khác bằng cách truy cập
đến thuộc tính đó trên form khác
Truyền dữ liệu giữa các form
Trang 34Form Payment
Form Customer
Demo truyền dữ liệu
từ form Payment cho form Customer
private void btnOK_Click(object sender, EventArgs e)
Lập trình giao diện - ứng dụng gồm nhiều form 34
private void btnOK_Click(object sender, EventArgs e)
Form paymentForm = new frmPayment();
DialogResult selectedButton = paymentForm.ShowDialog();
if (selectedButton == DialogResult.OK) {
lblPayment.Text = (string) paymentForm.Tag;
} }
Trang 35Sự kiện xẩy ra khi người dùng nhấn vào button gọi đếnphương thức Close của form nhưng trước khi form đượcđóng thực sự
Sự kiện này thường được dùng để ngăn người dùng
đóng form chứa dữ liệu chưa được lưu
Nếu muốn đóng form, thiết lập e.Cancel = false (mặc
//Viết mã ở đây
}
Sự kiện xẩy ra khi người dùng nhấn vào button gọi đếnphương thức Close của form nhưng trước khi form đượcđóng thực sự
Sự kiện này thường được dùng để ngăn người dùng
đóng form chứa dữ liệu chưa được lưu
Nếu muốn đóng form, thiết lập e.Cancel = false (mặc
định)
Nếu muốn hủy lệnh đóng form, thiết lập e.Cancel = true
private void frmCustomer_FormClosing(object sender,
FormClosingEventArgs e) {
//Viết mã ở đây
}
Trang 36Demo xử lý sự kiện FormClosing cho frmCustomer
private void frmCustomer_FormClosing(object sender,
FormClosingEventArgs e) {
if (isDataSaved == false)
{
string message =
"This form contains unsaved data.\n\n" +
"Do you want to save it?";
DialogResult button =
MessageBox.Show(message, "Customer",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
if (button == DialogResult.Yes) {
//Đoạn mã lưu dữ liệu
}
if (button == DialogResult.Cancel) {
e.Cancel = true;
} }
}
Lập trình giao diện - ứng dụng gồm nhiều form 36
private void frmCustomer_FormClosing(object sender,
FormClosingEventArgs e) {
if (isDataSaved == false)
{
string message =
"This form contains unsaved data.\n\n" +
"Do you want to save it?";
DialogResult button =
MessageBox.Show(message, "Customer",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
if (button == DialogResult.Yes) {
//Đoạn mã lưu dữ liệu
}
if (button == DialogResult.Cancel) {
e.Cancel = true;
} }
}
Trang 37Ứng dụng SDI (single document interface – giao diện
đơn tài liệu) là ứng dụng
gồm nhiều form độc lập với nhau
mỗi form có thể có menu và toolbar riêng
mỗi form chạy trên một cửa sổ riêng
Với loại ứng dụng này cần có một form chính cung cấptruy cập đến các form khác của ứng dụng
Ứng dụng SDI
Ứng dụng SDI (single document interface – giao diện
đơn tài liệu) là ứng dụng
gồm nhiều form độc lập với nhau
mỗi form có thể có menu và toolbar riêng
mỗi form chạy trên một cửa sổ riêng
Với loại ứng dụng này cần có một form chính cung cấptruy cập đến các form khác của ứng dụng
Trang 38Chạy thử ứng dụng SDI Financial Calculation
Lập trình giao diện - ứng dụng gồm nhiều form 38
Form chính
Trang 39Gọi đến form frmFutureValue khi nhấn vào button
Calculate Future Value trên form frmMain
Gọi đến form frmDepreciation khi nhấn vào button
Calculate SYD Depreciation trên form frmMain
Demo gọi đến các form từ form chính
private void btnFutureValue_Click(object sender, System EventArgs e)
{
Form newForm = new frmFutureValue();
newForm.Show();
}
Gọi đến form frmFutureValue khi nhấn vào button
Calculate Future Value trên form frmMain
Gọi đến form frmDepreciation khi nhấn vào button
Calculate SYD Depreciation trên form frmMain
private void btnFutureValue_Click(object sender, System EventArgs e)
Trang 40Đóng tất cả các form (khi người dùng nhấn vào button
Exit của form chính)
Đóng từng form (khi người dùng nhấn vào button Close
Đóng tất cả các form (khi người dùng nhấn vào button
Exit của form chính)
Đóng từng form (khi người dùng nhấn vào button Close
của từng form)
Lập trình giao diện - ứng dụng gồm nhiều form 40
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}