58
Bà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

Bà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 - Lập trình winform - Giáo trình FPT

Embed Size (px)

DESCRIPTION

Giới thiệu về ADO.NET Các thành phần của ADO.NET DataProvider DataSet Các loại DataProvider Sql Data Provider SqlConnection SqlDataAdapter Ứng dụng nhiều form Ứng dụng SDI Ứng dụng MDI Thêm Toolbar, Tooltip vào form

Citation preview

Page 1: Bà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 - Lập trình winform - Giáo trình FPT

Bà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

Page 2: Bà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 - Lập trình winform - Giáo trình FPT

Các nhóm điều khiển trên formCác điều khiển thường dùngCác điều khiển chứaCác điều khiển menuCác điều khiển dữ liệuCác thành phầnCác điều khiển hỗ trợ inCá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 formCác điều khiển thường dùngCác điều khiển chứaCác điều khiển menuCác điều khiển dữ liệuCác thành phầnCác điều khiển hỗ trợ inCá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

Page 3: Bà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 - Lập trình winform - Giáo trình FPT

Mục tiêu bài học

Giới thiệu về ADO.NETCác thành phần của ADO.NET

DataProviderDataSet

Các loại DataProviderSql Data Provider

SqlConnectionSqlDataAdapter

Ứng dụng nhiều formỨng dụng SDIỨng dụng MDIThêm Toolbar, Tooltip vào form

Giới thiệu về ADO.NETCác thành phần của ADO.NET

DataProviderDataSet

Các loại DataProviderSql Data Provider

SqlConnectionSqlDataAdapter

Ứng dụng nhiều formỨng dụng SDIỨng dụng MDIThêm Toolbar, Tooltip vào form

Lập trình giao diện - ứng dụng gồm nhiều form 3

Page 4: Bà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 - Lập trình winform - Giáo trình FPT

ADO.NET (ActiveX Data Objects .NET) là một thànhphần trong .NET Framework đảm nhiệm vai trò thaotác với CSDL

ADO.NET

ADO.NET (ActiveX Data Objects .NET) là một thànhphần trong .NET Framework đảm nhiệm vai trò thaotác với CSDL

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 4

Page 5: Bà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 - Lập trình winform - Giáo trình FPT

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…

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…

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 5

Page 6: Bà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 - Lập trình winform - Giáo trình FPT

Hỗ trợ lập trìnhCung cấp các lớp thao tác với CSDL giúp lập trình viên lậptrình nhanh hơn và giảm bớt lỗiCung cấp các công cụ để thao tác với CSDL ngay trênphầ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

Khả năng mở rộngSử dụng kiến trúc không kết nối chỉ kết nối với dữ liệulúc khi cần thiết nên giảm tải cho server CSDL Ứngdụng có thể đáp ứng nhiều người dùng hơn

Khả năng tích hợpADO.NET có thể gửi dữ liệu cho bất cứ ứng dụng nào hỗtrợ XML

Tính năng của ADO.NET

Hỗ trợ lập trìnhCung cấp các lớp thao tác với CSDL giúp lập trình viên lậptrình nhanh hơn và giảm bớt lỗiCung cấp các công cụ để thao tác với CSDL ngay trênphầ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

Khả năng mở rộngSử dụng kiến trúc không kết nối chỉ kết nối với dữ liệulúc khi cần thiết nên giảm tải cho server CSDL Ứngdụng có thể đáp ứng nhiều người dùng hơn

Khả năng tích hợpADO.NET có thể gửi dữ liệu cho bất cứ ứng dụng nào hỗtrợ XML

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 6

Page 7: Bà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 - Lập trình winform - Giáo trình FPT

Kiến trúc không kết nốiKết nối được thiết lập và tạo một bản sao của CSDL ngaytrên máy tính, sau đó kết nối được đóngThao 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ênBả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ốiKết nối được thiết lập và tạo một bản sao của CSDL ngaytrên máy tính, sau đó kết nối được đóngThao 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ênBảo mật vì kết nối được mở trong thời gian ngắn

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 7

Page 8: Bà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 - Lập trình winform - Giáo trình FPT

ADO gồm hai phần.NET data provider: cung cấp các lớp để kết nối, thực thilệ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ấpcá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 thilệ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ấpcá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

Page 9: Bà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 - Lập trình winform - Giáo trình FPT

Data provider cung cấp các lớp để tương tác với CSDLData provider gồm 4 thành phần chính

Connection: kết nối với CSDLCommand: thực thi các lệnh sql để lấy dữ liệu từ CSDLhoặc thay đổi CSDLDataReader: đọc dữ liệu tuần tự từ CSDLDataAdapter: lấy dữ liệu từ CSDL lưu vào dataset và cậpnhật CSDL

Data provider

Data provider cung cấp các lớp để tương tác với CSDLData provider gồm 4 thành phần chính

Connection: kết nối với CSDLCommand: thực thi các lệnh sql để lấy dữ liệu từ CSDLhoặc thay đổi CSDLDataReader: đọc dữ liệu tuần tự từ CSDLDataAdapter: lấy dữ liệu từ CSDL lưu vào dataset và cậpnhật CSDL

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 9

Page 10: Bà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 - Lập trình winform - Giáo trình FPT

Ví dụ thực tiễnVấn đề: Một ngân hàng đa quốc gia có rất nhiều chinhánh. Giả sử một chi nhánh ở Việt Nam muốn truy cậpthông tin.Giải pháp: Lấy thông tin cần thiết và lưu vào máy cục bộdưới dạng dataset

Dataset là bản sao của CSDL hay một phần CSDL trênbộ nhớ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ề datasetvà cập nhật dữ liệu trở lại CSDLMọ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ễnVấn đề: Một ngân hàng đa quốc gia có rất nhiều chinhánh. Giả sử một chi nhánh ở Việt Nam muốn truy cậpthông tin.Giải pháp: Lấy thông tin cần thiết và lưu vào máy cục bộdưới dạng dataset

Dataset là bản sao của CSDL hay một phần CSDL trênbộ nhớ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ề datasetvà cập nhật dữ liệu trở lại CSDLMọi thao tác sẽ được thực hiện trên DataSet

DataSet không phụ thuộc vào loại CSDLLập trình với CSDL - ADO.Net & Kiến trúc không kết nối 10

Page 11: Bà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 - Lập trình winform - Giáo trình FPT

Cấ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ảngCác bảng có ràng buộc với nhauMỗi bảng có nhiều dòng và cộtMỗi cột có nhiều dòngMỗi dòng có nhiều cột

DataSet

Cấ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ảngCác bảng có ràng buộc với nhauMỗi bảng có nhiều dòng và cộtMỗi cột có nhiều dòngMỗi dòng có nhiều cột

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 11

Page 12: Bà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 - Lập trình winform - Giáo trình FPT

DataAdapter kết nối với CSDL thông qua Connection, lấydữ liệu lưu vào DataSet.Ứng dụng sẽ lấy và thay đổi dữ liệu trên DataSetDataAdapter 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

Page 13: Bà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 - Lập trình winform - Giáo trình FPT

Cá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

Provider Namespace

SQL Server System.Data.SqlClient

OLE DB System.Data.OleDb

ODBC System.Data.Odbc

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

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 13

Oracle System.Data.OracleClient

Object SQL Server OLE DB ODBC Oracle

Connection SqlConnection OleDbConnection OdbcConnection OracleConnection

Command SqlCommand OleDbCommand OdbcCommand OracleCommand

Data reader SqlDataReader OldeDbDataReader OdbcDataReader OracleDataReader

Dataadapter

SqlDataAdapter OleDbDataAdapter OdbcDataAdapter OracleDataAdapter

Page 14: Bà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 - Lập trình winform - Giáo trình FPT

Các lớp của các loại data provider về cơ bản giốngnhau vì cùng kế thừa từ một lớpVí dụ OleDbDataAdpater và SqlDataAdapter cùngkế thừa từ lớp DbDataAdapterVới môn này sẽ học về SQL data provider để thao tác vớiCSDL Microsoft SQL Server 2008

Các loại Data provider

Các lớp của các loại data provider về cơ bản giốngnhau vì cùng kế thừa từ một lớpVí dụ OleDbDataAdpater và SqlDataAdapter cùngkế thừa từ lớp DbDataAdapterVới môn này sẽ học về SQL data provider để thao tác vớiCSDL Microsoft SQL Server 2008

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 14

Page 15: Bà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 - Lập trình winform - Giáo trình FPT

Thực hiện kết nối với CSDLPhươ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 CSDLPhươ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

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 15

ConnectionString Cung cấp thông tin để truy cập đến CSDL SQL Server

Open() Mở kết nối

Close() Đóng kết nối

Giá trị Mô tả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

Page 16: Bà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 - Lập trình winform - Giáo trình FPT

DataAdapter 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

Page 17: Bà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 - Lập trình winform - Giáo trình FPT

Phương thức khởi tạo

Thuộc tính

SqlDataAdapter

new SqlDataAdapter()new SqlDataAdapter(lệnh-truy-vấn, Connection)

Thuộc tính Mô tảDeleteCommand Lệnh sql hoặc sp để xóa dữ

liệu từ dataset

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 17

DeleteCommand Lệnh sql hoặc sp để xóa dữliệu từ dataset

SelectCommand Lệnh sql hoặc sp để lấy dữ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ậtdữ liệu cho dataset

Page 18: Bà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 - Lập trình winform - Giáo trình FPT

Phương thức

SqlDataAdapter

Phương thức Mô tảFill (dataset) Lấy dữ liệu đổ vào dataset

Update(dataset) Cập nhật những dữ liệu thayđổ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

Page 19: Bà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 - Lập trình winform - Giáo trình FPT

Sử dụng phương thức DataAdapter để fill DatasetĐọc dữ liệu vào form từ DatasetThay đổi dữ liệu trên DatasetUpdate lại dữ liệu trên CSDL

Demo thao tác vớidữ liệu bằng 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 19

Page 20: Bà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 - Lập trình winform - Giáo trình FPT

Các bước thực hiện Lập trình cơ sở dữ liệu

1. Khai báo các biếnSqlConnection conn; // biến connection kết nối đến CSDLSqlCommand com; // thực thi các lệnh sql để lấy dữ liệu từ hoặc là thay

//đổi CSDLSqlDataAdapter da; // biến có kiểuDataSet ds; // biến dataset

2. Khởi tạo biếnconn = new SqlConnection("Data Source=localhost; Initial Catalog=ProductDB;Persist Security

Info=True;User ID=sa;Password=sa");conn.Open(); // Thực hiện mở kết nối đến CSDLda = new SqlDataAdapter();ds = new DataSet();com = new SqlCommand("Select * from Products", conn); // thực hiện truy vấn CSDL

da.SelectCommand = com;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ếnconn = new SqlConnection("Data Source=localhost; Initial Catalog=ProductDB;Persist Security

Info=True;User ID=sa;Password=sa");conn.Open(); // Thực hiện mở kết nối đến CSDLda = new SqlDataAdapter();ds = new DataSet();com = new SqlCommand("Select * from Products", conn); // thực hiện truy vấn CSDL

da.SelectCommand = com;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ảngds.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

Page 21: Bà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 - Lập trình winform - Giáo trình FPT

Demo load dữ liệu vào ListView

private void frmBookDetails_Load(object sender, EventArgs e){

com = new SqlCommand("Select * from Products",conn);da.SelectCommand = com;da.Fill(ds, "Products");for (rows = 0; rows < ds.Tables[0].Rows.Count; rows++){

lvwBookDetails.Items.Add(ds.Tables[0].Rows[rows].ItemArray[0].ToString()); //thêm vào cột thứ nhấtlvwBookDetails.Items[rows].SubItems.Add(ds.Tables[0].Rows[rows].ItemArray[1].ToString());lvwBookDetails.Items[rows].SubItems.Add(ds.Tables[0].Rows[rows].ItemArray[2].ToString());lvwBookDetails.Items[rows].SubItems.Add(ds.Tables[0].Rows[rows].ItemArray[3].ToString());

}}

Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 21

private void frmBookDetails_Load(object sender, EventArgs e){

com = new SqlCommand("Select * from Products",conn);da.SelectCommand = com;da.Fill(ds, "Products");for (rows = 0; rows < ds.Tables[0].Rows.Count; rows++){

lvwBookDetails.Items.Add(ds.Tables[0].Rows[rows].ItemArray[0].ToString()); //thêm vào cột thứ nhấtlvwBookDetails.Items[rows].SubItems.Add(ds.Tables[0].Rows[rows].ItemArray[1].ToString());lvwBookDetails.Items[rows].SubItems.Add(ds.Tables[0].Rows[rows].ItemArray[2].ToString());lvwBookDetails.Items[rows].SubItems.Add(ds.Tables[0].Rows[rows].ItemArray[3].ToString());

}}

Page 22: Bà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 - Lập trình winform - Giáo trình FPT

Demo hiển thị dữ liệukhi 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ọnDataRow dr = ds.Tables["Products"].Rows[index]; // Lấy dòng được chọntxtCode.Text = dr[0].ToString();txtTitle.Text = dr[1].ToString();txtPrice.Text = dr[2].ToString();txtQuantity.Text = dr[3].ToString();

}

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ọnDataRow dr = ds.Tables["Products"].Rows[index]; // Lấy dòng được chọntxtCode.Text = dr[0].ToString();txtTitle.Text = dr[1].ToString();txtPrice.Text = dr[2].ToString();txtQuantity.Text = dr[3].ToString();

}

Page 23: Bà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 - Lập trình winform - Giáo trình FPT

ỨNG DỤNGGỒM NHIỀU FORM

Lập trình giao diện - ứng dụng gồm nhiều form 23

ỨNG DỤNGGỒM NHIỀU FORM

Page 24: Bà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 - Lập trình winform - Giáo trình FPT

Ứng dụng Payment gồm 2 formForm Payment được mở khi nhấn vào button SelectPayment trên form CustomerThao tác trên form Payment mới được thao tác trên formCustomer

Chạy thử ứng dụng Payment

Lập trình giao diện - ứng dụng gồm nhiều form 24

Page 25: Bà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 - Lập trình winform - Giáo trình FPT

Có thể thêm một form mới hoặc một form có sẵn vàoProject

Thêm form vào Project

Thêm một form mới

Lập trình giao diện - ứng dụng gồm nhiều form 25

Thêm một form mới

Thêm một form có sẵn

Page 26: Bà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 - Lập trình winform - Giáo trình FPT

Thê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

Page 27: Bà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 - Lập trình winform - Giáo trình FPT

Khi ứng dụng nhiều form chạy, theo mặc định ứng dụngsẽ 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

Lập trình giao diện - ứng dụng gồm nhiều form 27

Page 28: Bà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 - Lập trình winform - Giáo trình FPT

Thô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(){

Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new frmCustomer());

}

Mặc định frmCustomer được loadtrước tiên

Lập trình giao diện - ứng dụng gồm nhiều form 28

static void Main(){

Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new frmCustomer());

}static void Main(){

Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new frmPayment());

}frmPayment được load trước tiên

Page 29: Bà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 - Lập trình winform - Giáo trình FPT

Có hai cách hiển thị form mớiHiển thị theo kiểu dialog: Người dùng phải thao tác vớiform mới này trước tiênHiển thị thông thường: Người dùng có thể thao tác vớiform tùy ý

Cách hiển thị form mớiB1. Sử dụng từ khóa new để tạo form mớiB2. Sử dụng phương thức ShowDialog hoặc Show củaform mới để hiển thị form

Hiển thị form mới

Có hai cách hiển thị form mớiHiển thị theo kiểu dialog: Người dùng phải thao tác vớiform mới này trước tiênHiển thị thông thường: Người dùng có thể thao tác vớiform tùy ý

Cách hiển thị form mớiB1. Sử dụng từ khóa new để tạo form mớiB2. Sử dụng phương thức ShowDialog hoặc Show củaform mới để hiển thị form

Lập trình giao diện - ứng dụng gồm nhiều form 29

Form paymentForm = new frmPayment();paymentForm.ShowDialog(); //Hiển thị form dialog

paymentForm.Show(); //Hiển thị form thông thường

Page 30: Bà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 - Lập trình winform - Giáo trình FPT

Demo hiển thị form Payment khi người dùng nhấn vàobutton 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();

}

Page 31: Bà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 - Lập trình winform - Giáo trình FPT

DialogResult result = MessageBox.Show("Bạn muốn xóa không", "Xóa",MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

if (result==DialogResult.OK){

//Đoạn mã xóa dữ liệu}

Form Dialog được tạo sẵn

Form Dialog tự tạoXử 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ạoXử 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ập trình giao diện - ứng dụng gồm nhiều form 31

this.DialogResult = DialogResult.OK;

Page 32: Bà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 - Lập trình winform - Giáo trình FPT

Form Payment

Form Customer

Demo lấy phản hồi từ form Payment

private void btnOK_Click(object sender, EventArgs e){

this.DialogResult = DialogResult.OK;}private void btnCancel_Click(object sender, EventArgs e){

this.DialogResult = DialogResult.Cancel;}

Form Payment

Form Customer

Lập trình giao diện - ứng dụng gồm nhiều form 32

private void btnCancel_Click(object sender, EventArgs e){

this.DialogResult = DialogResult.Cancel;}

private void btnSelectPayment_Click(object sender, System.EventArgs e){

Form paymentForm = new frmPayment();DialogResult selectedButton = paymentForm.ShowDialog();if (selectedButton == DialogResult.OK){

MessageBox.Show("Bạn vừa chọn OK");}

}

Page 33: Bà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 - Lập trình winform - Giáo trình FPT

Form cung cấp thuộc tính Tag để lưu đối tượng chứa dữliệu của formCũ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

Lập trình giao diện - ứng dụng gồm nhiều form 33

Page 34: Bà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 - Lập trình winform - Giáo trình FPT

Form Payment

Form Customer

Demo truyền dữ liệutừ form Payment cho form Customer

private void btnOK_Click(object sender, EventArgs e){

string msg = null;//Đoạn mã gán dữ liệu của form cho biến msg//…this.Tag = msg;this.DialogResult = DialogResult.OK;

}

Form Payment

Form Customer

Lập trình giao diện - ứng dụng gồm nhiều form 34

private void btnOK_Click(object sender, EventArgs e){

string msg = null;//Đoạn mã gán dữ liệu của form cho biến msg//…this.Tag = msg;this.DialogResult = DialogResult.OK;

}

private void btnSelectPayment_Click(object sender,System.EventArgs e)

{Form paymentForm = new frmPayment();DialogResult selectedButton = paymentForm.ShowDialog();if (selectedButton == DialogResult.OK){

lblPayment.Text = (string) paymentForm.Tag;}

}

Page 35: Bà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 - Lập trình winform - Giáo trình FPT

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

Sự kiện FormClosing

private void frmCustomer_FormClosing(object sender,FormClosingEventArgs e)

{//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

Lập trình giao diện - ứng dụng gồm nhiều form 35

private void frmCustomer_FormClosing(object sender,FormClosingEventArgs e)

{//Viết mã ở đây

}

Page 36: Bà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 - Lập trình winform - Giáo trình FPT

Demo xử lý sự kiệnFormClosing 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;}

}}

Page 37: Bà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 - Lập trình winform - Giáo trình FPT

Ứ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 nhaumỗi form có thể có menu và toolbar riêngmỗ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 nhaumỗi form có thể có menu và toolbar riêngmỗ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

Lập trình giao diện - ứng dụng gồm nhiều form 37

Page 38: Bà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 - Lập trình winform - Giáo trình FPT

Chạ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

Page 39: Bà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 - Lập trình winform - Giáo trình FPT

Gọi đến form frmFutureValue khi nhấn vào buttonCalculate Future Value trên form frmMain

Gọi đến form frmDepreciation khi nhấn vào buttonCalculate 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 buttonCalculate Future Value trên form frmMain

Gọi đến form frmDepreciation khi nhấn vào buttonCalculate SYD Depreciation trên form frmMain

Lập trình giao diện - ứng dụng gồm nhiều form 39

private void btnFutureValue_Click(object sender, System.EventArgs e){

Form newForm = new frmFutureValue();newForm.Show();

}

private void btnCalculateDepreciation_Click(object sender, System.EventArgs e){

Form newForm = new frmDepreciation();newForm.Show();

}

Page 40: Bà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 - Lập trình winform - Giáo trình FPT

Đóng tất cả các form (khi người dùng nhấn vào buttonExit của form chính)

Đóng từng form (khi người dùng nhấn vào button Closecủa từng form)

Demo đóng form

private void btnExit_Click(object sender, System.EventArgs e){

Application.Exit();}

Đóng tất cả các form (khi người dùng nhấn vào buttonExit của form chính)

Đóng từng form (khi người dùng nhấn vào button Closecủ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();}

Page 41: Bà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 - Lập trình winform - Giáo trình FPT

Có thể sử dụng điều khiển Tab thay cho kiểu giao diệnSDI

Mỗi điều khiển Tab có nhiều page, có thể thêm và xóa cácpage nàySử dụng thuộc tính SelectedIndex để xác định tab nàođang được focus

Sử dụng Tab

Có thể sử dụng điều khiển Tab thay cho kiểu giao diệnSDI

Mỗi điều khiển Tab có nhiều page, có thể thêm và xóa cácpage nàySử dụng thuộc tính SelectedIndex để xác định tab nàođang được focus

Lập trình giao diện - ứng dụng gồm nhiều form 41

Page 42: Bà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 - Lập trình winform - Giáo trình FPT

Xử lý sự kiện cho button Calculate

Xử lý sự kiện SelectedIndexChanged của điều khiển Tab

Demo sử dụng điều khiển Tab

private void btnCalculate_Click(object sender, System.EventArgs e){

if (tabCalculations.SelectedIndex == 0)DisplayFutureValue();

else if (tabCalculations.SelectedIndex == 1)DisplayDepreciation();

}

Xử lý sự kiện cho button Calculate

Xử lý sự kiện SelectedIndexChanged của điều khiển Tab

Lập trình giao diện - ứng dụng gồm nhiều form 42

private void btnCalculate_Click(object sender, System.EventArgs e){

if (tabCalculations.SelectedIndex == 0)DisplayFutureValue();

else if (tabCalculations.SelectedIndex == 1)DisplayDepreciation();

}

private void tabCalculations_SelectedIndexChanged(object sender,EventArgs e)

{if (tabCalculations.SelectedIndex == 0)

txtMonthlyInvestment.Focus();else if (tabCalculations.SelectedIndex == 1)

txtInitialCost.Focus();}

Page 43: Bà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 - Lập trình winform - Giáo trình FPT

MDI (multiple-document interface – giao diện đa tài liệu)là giao diện có một form cha chứa nhiều form conSử dụng menu trên form cha để có thể truy cập đến cácform con

Ứng dụng MDI

Lập trình giao diện - ứng dụng gồm nhiều form 43

Page 44: Bà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 - Lập trình winform - Giáo trình FPT

Chạy thử ứng dụngMDI Financial Calculations

Lập trình giao diện - ứng dụng gồm nhiều form 44

Page 45: Bà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 - Lập trình winform - Giáo trình FPT

Trong cửa sổ Properties, thiết lập thuộc tínhIsMdiContainer của form là true

Tạo form cha

Lập trình giao diện - ứng dụng gồm nhiều form 45

Page 46: Bà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 - Lập trình winform - Giáo trình FPT

Viết code thiết lập thuộc tính MdiParent chỉ ra form chacho form con

Đoạn mã này mở form FutureValue khi người dùng nhấnvào menu New Future Value trên form cha

Tạo form con

private void mnuNewFutureValue_Click(object sender, System.EventArgs e){

Form newForm = new frmFutureValue();newForm.MdiParent = this;newForm.Show();

}

Lập trình giao diện - ứng dụng gồm nhiều form 46

private void mnuNewFutureValue_Click(object sender, System.EventArgs e){

Form newForm = new frmFutureValue();newForm.MdiParent = this;newForm.Show();

}

Page 47: Bà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 - Lập trình winform - Giáo trình FPT

Sử dụng thuộc tính ActiveMdiChild để lấy tham chiếuđến form con đang được kích hoạt

Đóng form con đang được kích hoạt

private void mnuClose_Click(object sender, System.EventArgs e){

Form activeForm = this.ActiveMdiChild;if (activeForm != null)activeForm.Close();

}

Sử dụng thuộc tính ActiveMdiChild để lấy tham chiếuđến form con đang được kích hoạt

Lập trình giao diện - ứng dụng gồm nhiều form 47

private void mnuClose_Click(object sender, System.EventArgs e){

Form activeForm = this.ActiveMdiChild;if (activeForm != null)activeForm.Close();

}

Page 48: Bà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 - Lập trình winform - Giáo trình FPT

Sử dụng phương thức LayoutMdi(KieuLayOut) để sắpxếp các form conCó các kiểu sắp xếp như Cascade, TileVertical,TileHorizontal…

Sắp xếp các form con

private void mnuCascade_Click(object sender, System.EventArgs e){this.LayoutMdi(MdiLayout.Cascade);}

Lập trình giao diện - ứng dụng gồm nhiều form 48

private void mnuCascade_Click(object sender, System.EventArgs e){this.LayoutMdi(MdiLayout.Cascade);}

Page 49: Bà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 - Lập trình winform - Giáo trình FPT

Thiết lập thuộc tính MDIWindowListItem của điều khiểnMenuStrip cho menu muốn hiển thị

Hiển thị danh sáchcủa tất cả các form con đang được mở

Lập trình giao diện - ứng dụng gồm nhiều form 49

Page 50: Bà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 - Lập trình winform - Giáo trình FPT

Thêm menu riêng cho mỗi form conThêm menu riêng cho form con giống như thêm menucho form thông thườngMenu này sẽ được thêm vào sau thanh menu của formcha khi menu con được kích hoạt

NÂNG CẤP ỨNG DỤNG FINANCIAL CALCULATION

Lập trình giao diện - ứng dụng gồm nhiều form 50

Page 51: Bà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 - Lập trình winform - Giáo trình FPT

Toolbar được dùng để chứa các công cụ cho form

Sử dụng điều khiển ToolStrip

Thêm Toolbar

Toolbar được dùng để chứa các công cụ cho form

Sử dụng điều khiển ToolStrip

Lập trình giao diện - ứng dụng gồm nhiều form 51

ToolStrip ToolStrip

Page 52: Bà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 - Lập trình winform - Giáo trình FPT

Có thể thêm Toolbar tiêu chuẩn hoặc Toolbar tùy chỉnh

Demo Thêm Toolbar

Lập trình giao diện - ứng dụng gồm nhiều form 52

Tạo Toolbar tiêu chuẩn

Tạo Toolbar tùy chỉnh

Page 53: Bà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 - Lập trình winform - Giáo trình FPT

Thêm Tool vào Toolbar

B1. Chọn kiểu Tool B2. Thêm Tool

B3. Thiết lậpảnh đại diện

cho Tool

Lập trình giao diện - ứng dụng gồm nhiều form 53

B4. Thiết lậpvăn bản giải

thích mục đíchcủa Tool

Page 54: Bà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 - Lập trình winform - Giáo trình FPT

Nhấn vào button đầu tiên trên Toolbar để hiển thị formFuture Value

Demo thêm Toolbar

Lập trình giao diện - ứng dụng gồm nhiều form 54

//Hoặc là

Page 55: Bà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 - Lập trình winform - Giáo trình FPT

Tooltip được sử dụng để giải thích ý nghĩa cho các điềukhiển trên form khi người dùng di chuột lên điều khiển

Khi thêm Tooltip vào form (theo mặc định có tên làtoolTip1), tất cả điều khiển đều có thêm thuộc tínhTooltip on toolTip1

Thiết lập giá trị cho thuộc tính này cho mỗi điều khiểnhoặc cho form

Thêm Tooltip

Tooltip được sử dụng để giải thích ý nghĩa cho các điềukhiển trên form khi người dùng di chuột lên điều khiển

Khi thêm Tooltip vào form (theo mặc định có tên làtoolTip1), tất cả điều khiển đều có thêm thuộc tínhTooltip on toolTip1

Thiết lập giá trị cho thuộc tính này cho mỗi điều khiểnhoặc cho form

Lập trình giao diện - ứng dụng gồm nhiều form 55

Thuộc tính ToolTip ontoolTip1 được thêm vào

các điều khiển

Page 56: Bà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 - Lập trình winform - Giáo trình FPT

Trợ giúp theo ngữ cảnh sẽhiển thị văn bản trợ giúp chođiều khiển được focus khingười dùng nhấn F1

Trợ giúp theo ngữ cảnh

Khi thêm HelpProvider vàoform (theo mặc định có tên làhelpProvider1), tất cả điềukhiển đều có thêm thuộc tínhHelpString on helpProvider1

Lập trình giao diện - ứng dụng gồm nhiều form 56

Thuộc tính HelpString on helpProvider1được thêm vào các điều khiển

Khi thêm HelpProvider vàoform (theo mặc định có tên làhelpProvider1), tất cả điềukhiển đều có thêm thuộc tínhHelpString on helpProvider1

Thiết lập giá trị cho thuộc tính này cho mỗi điều khiển hoặccho form

Page 57: Bà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 - Lập trình winform - Giáo trình FPT

Tổng kết bài học

ADO.NET gồm hai phần data provider và dataset.NET data provider cung cấp các lớp để kết nối, thực thi lệnh SQLvà lấy kết quả trả vềDataset lưu trữ bản sao của CSDL hoặc một phần CSDL trên bộnhớ. Cung cấp các phương thức cho phép ứng dụng thao tác vớibản saoData provider gồm 4 thành phần chính là Connection,Command, DataReader và DataAdapterCommand và DataReader thực hiện theo kiến trúc kết nối, nênphải mở và đóng kết nối trước vào sau khi thao tácDataAdapter thực hiện theo cơ chế không kết nối, đối tượng nàytự động mở và đóng kết nối khi cần thiết

ADO.NET gồm hai phần data provider và dataset.NET data provider cung cấp các lớp để kết nối, thực thi lệnh SQLvà lấy kết quả trả vềDataset lưu trữ bản sao của CSDL hoặc một phần CSDL trên bộnhớ. Cung cấp các phương thức cho phép ứng dụng thao tác vớibản saoData provider gồm 4 thành phần chính là Connection,Command, DataReader và DataAdapterCommand và DataReader thực hiện theo kiến trúc kết nối, nênphải mở và đóng kết nối trước vào sau khi thao tácDataAdapter thực hiện theo cơ chế không kết nối, đối tượng nàytự động mở và đóng kết nối khi cần thiết

Page 58: Bà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 - Lập trình winform - Giáo trình FPT

Một ứng dụng có thể bao gồm nhiều form. Từ một formcó thể mở form mới theo kiểu form thông thường hoặcdialogĐối với form dialog, khi mở form có giá trị trả về kiểuDialogResult cho biết thao tác của người dùng trên formỨng dụng SDI gồm nhiều form độc lập với nhau, mỗiform có thể có menu và toolbar riêng và mỗi form chạytrên một cửa sổ riêngỨng dụng SDI này cần có một form chính cung cấp truycập đến các form khác của ứng dụngỨng dụng MDI là giao diện có một form cha chứa nhiềuform con

Tổng kết bài học

Một ứng dụng có thể bao gồm nhiều form. Từ một formcó thể mở form mới theo kiểu form thông thường hoặcdialogĐối với form dialog, khi mở form có giá trị trả về kiểuDialogResult cho biết thao tác của người dùng trên formỨng dụng SDI gồm nhiều form độc lập với nhau, mỗiform có thể có menu và toolbar riêng và mỗi form chạytrên một cửa sổ riêngỨng dụng SDI này cần có một form chính cung cấp truycập đến các form khác của ứng dụngỨng dụng MDI là giao diện có một form cha chứa nhiềuform con

Lập trình giao diện - ứng dụng gồm nhiều form 58