Giáo trình Lập trình web với ASP.Net (Phần 2) - Nghề: Thiết kế trang web - Trình độ: Cao đẳng

pdf 42 trang Gia Huy 17/05/2022 1970
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình web với ASP.Net (Phần 2) - Nghề: Thiết kế trang web - Trình độ: Cao đẳng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_lap_trinh_web_voi_asp_net_phan_2_nghe_thiet_ke_tr.pdf

Nội dung text: Giáo trình Lập trình web với ASP.Net (Phần 2) - Nghề: Thiết kế trang web - Trình độ: Cao đẳng

  1. Bài 5. XỬ LÝ DỮ LIỆU VỚI ADO.NET I. Tìm hiểu về ADO.NET Hầu hết ứng dụng hay các website đều cần phải có cơ sở dữ liệu, để lưu trữ dữ liệu, xử lý thông tin và đưa ra các báo cáo, hỗ trợ tìm kiếm Khi dữ liệu trở thành trung tâm của ứng dụng thì cung cấp các chức năng tới người dùng phụ thuộc vào khả năng thao tác dữ liệu, vấn đề mà người thiết kế và người xây dựng ứng dụng quan tâm khi sử dụng dữ liệu là: • Lưu dữ liệu tập trung • Đảm bảo toàn vẹn dữ liệu • Đảm bảo khả năng truy xuất đồng thời của nhiều người dùng trên dữ liệu • Đảm bảo thời gian hồi đáp ngắn cho mỗi người dùng • Bảo mật dữ liệu • Trao đổi dữ liệu giữa các hệ thống khác nhau Những vấn đề này được giải quyết dựa vào khả năng của các hệ quản trị cơ sở dữ liệu(HQT CSDL) và các phần mềm xử lý dữ liệu do HQT CSDL cung cấp. .Net truy xuất dữ liệu qua ADO.NET, đặc điểm chính của ADO.NET là khả năng làm việc với dữ liệu không kết nối, dữ liệu được lưu trữ trong bộ nhớ như một csdl thu nhỏ gọi là dataset, nhằm tăng tốc độ tính toán, xử lý tính toán và hạn chế sử dụng tài nguyên trên Database Server. Đặc điểm quan trọng thứ 2 là khả năng xử lý dữ liệu chuẩn XML, dữ liệu ở dạng XMl có thể trao đổi giữa bất kỳ hệ thống nào nên ứng dụng của bạn sẽ có nhiều khả năng làm việc với nhiều ứng dụng khác. 1. Kiến trúc ADO .Net Kiến trúc ADO.NET có thể chia làm 2 phần chính: - Managed Provider Component: bao gồm các đối tượng như DataAdapter, DataReader, giữ nhiệm vụ làm việc trực tiếp với dữ liệu như database, file, - Content Component: bao gồm các đối tượng như DataSet, DataTable, đại diện cho dữ liệu thực sự cần làm việc. o DataReader là đối tượng mới, giúp truy cập dữ liệu nhanh chóng nhưng forward-only và read-only giống như ADO RecordSet sử dụng Server cursor, OpenFowardOnly và LockReadOnly. Trang 86
  2. o DataSet cũng là một đối tượng mới, không chỉ là dữ liệu, DataSet có thể coi là một bản sao gọn nhẹ của CSDL trong bộ nhớ với nhiều bảng và các mối quan hệ. o DataAdapter là đối tượng kết nối giữa DataSet và CSDL, nó bao gồm 2 đối tượng Connection và Command để cung cấp dữ liệu cho DataSet cũng như cập nhật dữ liệu từ DataSet xuống CSDL. 2. Minh họa tạo kết nối cơ sở dữ liệu using System; using System.Data; using System.Data.SqlClient; public partial class vd1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); //Mở kết nối cnn.Open(); //Command điều khiển truy vấn sql SqlCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select HotenKH from Khachhang where MaKH=5"; //lấy về chuỗi giá trị trong cơ sở dữ liệu string result = (string)cmd.ExecuteScalar(); //đóng kết nối cnn.Close(); //in giá trị ra màn hình Response.Write(result); } } Thi hành Cơ bản các bƣớc thực hiện với database • Bước 1: Tạo kết nối • Bước 2: Mở kết nối dữ liệu • Bước 3: Tạo lệnh điều khiển truy vấn SQL • Bước 4: Thực thi lệnh • Bước 5: Đóng kết nối • Bước 6: in kết quả II. Các đối tƣợng trong ADO.Net Trang 87
  3. 1. Đối tƣợng Connection Vai trò của Connection trong ADO.net là tạo kết nối giữa ứng dụng với nguồn dữ liệu(CSDL) Data Provider : o System.Data.Oledb : Sử dụng với Access o System.Data.SqlClient : Sử dụng với SQLServer Ứng với mỗi tên miến ta có một connection tương ứng: o System.Data.Oledb.OledbConnection o System.Data.SqlClient.SqlConnection Ngòai ra Ado.net còn hỗ trợ các Data Provider khác như o System.data.OcracleClient : Dành cho Ocracle o MicroSoft.data.Odbc : Dành cho dạng kết nối thong qua Odbc Connectionủa Hệ điều hành o Microsoft.Data.Sqlxml: Dành cho XML trên Sqlserver Connection String Trước khi thực hiện kết nối Connectionần khai báo các thong tin cho Connection thông qua thuộc tính Connection String. Cách khai báo thay đổi tùy thuộc vào Data Provider. Gồm có các thành phần sau: o Nếu kết nối với CSDL Access Provider: Khai báo Data Provider Connectionủa Hệ QT CSDL Access Data Source: Nguồn dữ liệu (Tên CSDL.mdb) User ID: Tên người dùng Password : Mật khẩu Ví dụ: Tạo kết nối với CSDL Access using System; using System.Data; using System.Data.OleDb; public partial class VD2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection String StrCnn="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath("~/App_Data/QLBansach.mdb"); OleDbConnection cnn = new OleDbConnection (StrCnn); //Mở kết nối cnn.Open(); //Command điều khiển truy vấn sql OleDbCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select HotenKH from Khachhang where MaKH=2"; //lấy về chuỗi giá trị trong cơ sở dữ liệu string result = (string)cmd.ExecuteScalar(); //đóng kết nối cnn.Close(); //in giá trị ra màn hình Response.Write(result); } } o Nếu kết nối với CSDL SQLServer Trang 88
  4. Provider: Khai báo Data Provider Connectionủa Hệ QT CSDL SQLServer Data Source:Tên máy cài đặt SQLServer Initial Catalog: Tên CSDL User ID: Tên người dùng Password : Mật khẩu Các thuộc tính Của Connection o DataBase: : Tương ứng với Initial Catalog(SQL) hay tên CSDL muốn làm việc (Access) o DataSource: Tương ứng với DataSource Tên máy SQL hay tên CSDL o Provider: Tương ứng với Provider o State: Tình trạng kết nối Connectionủa Connection với các giá trị Broken: Kết nối đã bị ngắt chỉ xảy ra sau khi đã kết nối Closed: Kết nối đã đóng Connecting: Đang kết nối Executing: Kết nối đang thực hiện một lệnh Fetching: Kết nối đang truy xuất dữ liệu Open: Kết nối đang mở Các phƣơng thức Change Databse: Thay đổi DataBase làm việc Close : Đóng kết nối sử dụng đóng Connection đang mở Dispose: Xóa tòan bộ tài nguyên liên quan đấn Connection trên vùng nhớ. Open: Thực hiện kết nối Connectionới các thông tin đã khai báo trong ConnectionString Ví dụ: Kiểm tra kết nối với CSDL SQLServer protected void Button1_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=;Initial Catalog=QLbansach;User ID=sa;Password="); //Mở kết nối cnn.Open(); TextBox1.Text = "State = " + cnn.State; ; // Thực hiện các câu lệnh SELECT, INSERT, DELETE, UPDATE. cnn.Close(); //Đóng kết nối } 2. Đối tƣợng Command Sau khi tạo kết nối với nguồn dữ liệu, mọi thao tác với nguồn dữ liệu đó đều được thực hiện thông qua Command. Tùy theo loại Connection đối tượng Command thuộc tên miền như sau: Trang 89
  5. System.Data.OleDb.OleDbCommand System.Data.SqlClient.SqlCommand Tạo Command Chúng ta có thể tạo Command thông qua đối tượng Connection bàng cách: As New ; .Connection= ; .CommandText= ; Hoặc As New Command( ); .Connection= ; Các thuộc tính CommandText : Lệnh SQL hay tên Stored Procedure muốn thực hiện trên nguồn dữ liệu CommandType: Giá trị cho biết nội dugn Commandtext là gì: Text: (Mặc định) là câu lệnh SQL StoredProcedure: Tên thủ tục TableDirect: Tên Connectionủa table VD: SqlCommand cmd As SqlCommand = New SqlCommand(); cmd.Connection = cnn; cmd.CommandType = CommandType.Text; cmd.CommandText = "Select* From Khachhang Where MaKH=2"; Parameters Lệnh SQL trong commandText có thể sử dụng dấu ? thay cho trị chưa xác định và khi thực hiện sẽ dùng đối tượng Parameters để truyền gái trị vào dấu ? . Tùy theo Command Parameter sẽ khai báo từ lớp OledbParameter hay SqlParameter. Cú pháp khai báo sau: OleDbParameter | SqlParameter As New OleDbParameter | SqlParameter(); OleDbParameter | SqlParameter As New OleDbparameter | SqlParameter( ); OleDbParameter | SqlParameter As New OleDbParameter | SqlParamter( , ); Các thuộc tính cần chú ý: Direction : Giá trị cho biết lọai tham số Input: (mặc định) Loại tham số đầu vào InputOutput: Loại tham số đầu vào và ra Output: Loại tham số đầu ra ReturnValue: Loại tham số nhận giá trị trả về Connectionủa một thủ tục OleDbType / SqlDbType: Kiểu dữ liệu OleDb hay SQLDb Connectionủa tham số. ParameterName: Tên tham số Value: Giá trị tham số Trang 90
  6. Dùng phƣơng thức CreateParameter và Add Command của tập hợp Parameters. VD: Khi sử dụng OleDbCommand cmd.CommandText=”Select * From Khachhang Where MaKH=?”; OleDbParameter Par As OleDbParameter= cmd.CreateParameter(); Par.Value=”KH01”;; cmd.Parameters.Add(Par); VD: Khi sử dụng SqlDbCommand cmd.CommandText=”Select * From Khachhang Where MaKH=@MaKH”; SqlParameter Par As SqlParameter = cmd.CreateParameter(); Par.ParameterName=”@MaKH”; Par.Value=”KH01”; cmd.Parameters.Add(Par); Đƣa tham số vào tập hợp Parameters VD: Khi sử dụng OleDbCommand cmd.CommandText=”Select * From BangDiem Where Masv=? And MaMH=?”; OleDbParameter Par1 As OleDbParameter= cmd.CreateParameters.Add(“Sinhvien”,OleDbType.Char,4); Par1.Value=”SV01” OleDbParameter Par2 As OleDbParameter= cmd.CreateParameters.Add(“Monhoc”,OleDbType.Char,4); Par2.Value=”MH01” VD: Khi sử dụng SqlDbCommand cmd.CommandText=”Select * From BangDiem Where Masv=@MaSV and MaMH = @MaMH ”; SqlDbParameter Par1 As SqlDbParameter= cmd.CreateParameters.Add(“@MaSV”,SqlType.Char,4); Par1.Value=”SV01” SqlDbParameter Par2 As SqlDbParameter= cmd.CreateParameters.Add(“@MaMH”,SqlType.Char, 4); Par2.Value=”MH01”; Tạo tham số và đƣa vào tập hợp Parameters VD: Procedure SpKetQuaThi Cần 2 tham số đầu vào: @MaSV , @MaMH và trả về Điểm thi của Môn học Connectionủa sinh viên đó. Vì vậy chúng ta Connectionần truyền 3 tham số: 1 trả về, 2 đưa vào. Tham số trả về phải được truyền cho Command trước tiên cmd.CommandText=”spKetQuaThi”; cmd.CommandType=CommandType.StoredProcedure; OleDbParameter ts3 As New OleDbParameter(); ts3.Direction=ParameterDirection.ReturnValue; Trang 91
  7. ts3.OleDbType=OleDn.OleDbType.Int; cmd.parameters.Add(ts3); OleDbParameter ts1 as OleDbParameter= cmd.Parameters.Add(“@MaSV”,OleDbType.Char,4); Ts1.Value=”Sv01”; OleDbParameter ts2 as OleDbParameter= cmd.Parameters.Add(“@MAMH”,OleDbType.Char ,4); Ts1.Value=”MH01”; Thực hiện Command Phƣơng thức ExecuteReader: Phương thức này trả về một đối tượng DataReader để đọc dữ liệu mỗi lần một dòng với phương thức Read. DataReader đọc dữ liệu trực tiếp từ nguốn dữ liệu nên phải duy trì kết nối đến khi đọc xong cú pháp. SqlDataReader As SqlDataReader; = .ExecuteReader; VD: SqlDataReader reader As SqlDataReader; reader = cmd.ExecuteReader; Phƣơng thức ExcuteNoneQuery: Dùng để thực thi các phát biểu T-Sql như: Insert, Update, Delete, Create, Phƣơng thức ExcuteScalar: Trả về từ phát biết SQL dạng Select chỉ có một cột một hàng. 3. Đối tƣợng Datareader Là đối tượng truy cập dữ liệu trực tiếp, sử dụng con trỏ phía Server và duy trì kết nối với Server trong suốt quá trình đọc dữ liệu, DataReader thuộc tên miền System.data.OleDbDatReader hoặc System.Data.SqlDataRaeder Các thuộc tính FieldCout: Số Connectionột trên dòng hiện hành của DataReader IsClosed : Cho biết dataReader đã đóng Item:Trị của cột truyền vào. Tham số truyền vào là tên cột hoặc số thứ tự từ 0. Các phƣơng thức Close: Đóng DataReader GetFieldType: Trả về kiểu dữ liệu của cột truyền vào. GetName: Trả về tên của cột truyền vào GetValue: Tar3 về trị của cột truyền vào Read : Di chuyển đến dòng kế tiếp và trả về true nếu còn dòng để di chuyển, ngược lại trả về False. Trong khi dataReader đang mở các thao tác dữ liệu trên nguồn dữ liệu đều không thể cho đến khi dataRaeder đóng lại bằng lệnh Close. 4. Đối tƣợng DataAdapter Để lầy dữ liệu từ nguồn dữ liệu về cho ứng dụng, chúng ta sử dụng một đối tượng gọi là DataAdapter. Đối tượng này cho phép ta lấy cấu trúc và dữ liệu của các bảng trong nguồn dữ liệu. DataAdapte là một bộ gồm 4 đối tượng: Trang 92
  8. - SelectCommand: Cho phép lấy thông tin từ nguồn dữ liệu về. - InsertCommand cho phép thêm dữ liệu vào bảng trong nguồn dữ liệu. - UpdateCommand cho phép điều chỉnh dữ liệu của bảng trong nguồn dữ liệu. - DeleteCommand cho phép xóa dữ liệu của bảng trong nguồn dữ liệu. a. Tạo DataAdapter Khai báo rõ DataAdapter sử dụng theo DataProvider nào: sqlDataAdapter hay OledbDataAdapter hai lớp này thuộc tên miền: System.Data.OleDb.OleDbDataAdapter System.Data.SqlClient.SqlDataAdapter Cú pháp tạo DataAdapter New DataAdapter(); New DataAdapter( ); : Có sẳn với nội dụng lệnh truy xuất. New DataAdapter( , ) DataAdapter chỉ thao tác với một nguồn dữ liệu qua một đối tượng connection đang kết nối, khi Connection chưa mở thì DataAdapter sẽ tự động mở kết nối khi cần và đóng lại. VD: OleDbDataAdapter DA As New OleDbDataAdapter(); DA.SelectCommand.CommandText=”Select * From Sinhvien”; AD.SelectCommand.Connection.ConnectionString=”Provider=MicroSoft.Jet.OleDb.4.0; Data Source=c:\QuanLySV.mdb”; b. Các thuộc tín chính của DataAdapter DeleteCommand : Đối tượng Command chứa nội dung lệnh hủy các mẫu tin trên nguồn dữ liệu. InsertCommand : Đối tượng Command chứa nội dung lệnh thêm các mẫu tin trên nguồn dữ liệu. SelectCommand: Đối tượng Command chứa nội dung lệnh truy xuất các mẫu tin trên nguồn dữ liệu. UpdateCommand : Đối tượng Command chứa nội dung lệnh sửa các mẫu tin trên nguồn dữ liệu. c. Các chức năng của DataAdapter - Lấy dữ liệu từ nguồn: Sử dụng DataAdapter để lấy dữ liệu về cho các đối tượng o DataTable: Fill( ) o DataSet: Fill( ) Dữ liệu lấy về DataSet dưới dạng các dataTable với tên mặc định là: Table,Table1, Table2. . .: o Đổ dữ liệu vào Datset cho bảng DataTable nếu chưa có sẽ tạo mới: Fill( , ) - Phương thức trả về mẫu tin lấy về được Trang 93
  9. Dim DS as New Dataset() Dim so As Integer so= DA.Fill(DS,”Sinhvien ”) - Để cập nhật dữ liệu về nguồn Update( ): Cập nhật các dòng (Các đối tượng DataRow) vào nguồn dữ liệu. Update( ): Cập nhật các thay đổi trên tất cả các bảng của Dataset vào nguồn dữ liệu. Update( ): Cập nhật tất cả các thay đổi trên DataTable vào nguồn dữ liệu. Update( , ) Cập nhật các they đổi trên bảng trong Dataset vào nguồn dữ liệu 5. Đối tƣợng DataSet Dataset là một mô hình CSDL quan hệ thu nhỏ đáp ứng nhu cầu của ứng dụng. Dataset chứa các bảng (DataTable) các quanhệ (DataRelation) và các ràng buộc (constraint) Dataset thuộc tên miền: System.Data.Dataset. a. Khai báo New System.Data.Dataset() Hoặc New System.Data.Dataset( ) b. Các phƣơng thức - Thêm một bảng vào Dataset Tables.Add() Một bảng mới tự động được tạo ra với tên mặc định Table1, Table2 . . . Tables.Addd( ) Một bảng mới tạo ra theo đúng Ghi chú: Tên bảng có phân biệt chữ in, thường - Xóa bảng ra khỏi Dataset Tables.Remove( ) Xóa bảng ra khỏi tập hợp Table. - Kiểm tra bảng có thuộc về Dataset Tables.Contains( ) - Lấy chỉ số của bảng Tables.IndexOf( ) - Lấy số bảng trong Dataset Tables.Count - Lấy ra một bảng trong Dataset Tables( ) - Để cập nhật các thay đổi trên Dataset AcceptChanges() - Để hủy các thay đổi trên Dataset Trang 94
  10. RejectChanges() - Để xóa bỏ mọi dữ liệu trên dataSet Clear() - Để tạo một bản sau của Dataset Clone() - Để xóa bỏ Dataset Gọi phương thức Dispone để giải phóng mọi tài nguyên trên vùng nhớ Dataset đang sử dụng. - Tạo quan hệ giữa hai bảng trong Dataset. Relations.Add( , ) - Xóa quan hệ giữa hai bảng trong Dataset. Relations.Remove( ) 6. Đối tƣợng Datatable Dữ liệu các bảng trong nguồn dữ liệu được lấy về và đưa vào các DataTable. DataTable thuộc tên miền : System.Data.dataTable. Cú pháp: New DataTable(); New DataTable( ); DataTable được hình thành từ các DataColumn, DataRow. III. Một số minh họa 1. Kết nối cơ sở dữ liệu protected void Button1_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); //Mở kết nối cnn.Open(); // Thực hiện các câu lệnh SELECT, INSERT, DELETE, UPDATE. TextBox1.Text = "State = " + cnn.State; //Đóng kết nối cnn.Close(); } 2. Kết nối, thao tác dữ liệu, sử dụng đối tượng Command với câu lệnh SELECT Trang 95
  11. protected void Button2_Click(object sender, EventArgs e) { try { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); //Khai báo và khởi tạo biến Command SqlCommand cmd = new SqlCommand(); //Khai báo biến Command sử dụng Connection nào để đến database? cmd.Connection = cnn; //Biến Commnad thao tác với database bằng //(1.Câu lệnh, 2.Tên bảng, 3.Tên Store) nào? cmd.CommandText = "SELECT COUNT(*) FROM Chude"; //Cho biết CommandText chính là câu lệnh. cmd.CommandType = CommandType.Text; //Mở kết nối cnn.Open(); // Lấy dữ liệu về bằng phương thức ExecuteScalar. int count = (int)cmd.ExecuteScalar(); //Xuất kết quả ra WebForm TextBox2.Text = count.ToString(); //Đóng kết nối. cnn.Close(); } catch (Exception) { //Xuất kết quả ra WebForm TextBox2.Text = "Không thành công!"; } } 3. Kết nối, thao tác dữ liệu, sử dụng đối tượng Command với câu lệnh INSERT, UPDATE, DELETE protected void Button3_Click(object sender, EventArgs e) { try { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); SqlCommand cmd = new SqlCommand(); cmd.Connection = cnn; //Biến Commnad thao tác với database bằng câu lệnh //(INSERT, UPDATE, DELETE) cmd.CommandText = "INSERT INTO CHUDE(TenCD) VALUES(N'Văn hóa')"; cmd.CommandType = CommandType.Text; cnn.Open(); //Thao tác dữ liệu (INSERT, UPDATE, DELETE) //bằng phương thức ExecuteNonQuery. cmd.ExecuteNonQuery(); //Xuất kết quả ra WebForm TextBox3.Text = "Thành công!"; cnn.Close(); } catch (Exception) { //Xuất kết quả ra WebForm TextBox3.Text = "Không thành công!"; } } 4. Kết nối, thao tác dữ liệu, sử dụng đối tượng Command với câu lệnh INSERT, UPDATE, DELETE + Truyền tham số. Trang 96
  12. protected void Button4_Click(object sender, EventArgs e) { try { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); SqlCommand cmd = new SqlCommand(); cmd.Connection = cnn; //Khai báo và khởi tạo tham số SqlParameter parTenLinhVuc = new SqlParameter("@TENCHUDE", SqlDbType.NVarChar, 50); cmd.CommandText = "INSERT INTO CHUDE VALUES(@TENCHUDE)"; cmd.CommandType = CommandType.Text; //Thêm biến tham số cho Command cmd.Parameters.Add(parTenchude); //Gán giá trị cho biến tham số parTenLinhVuc.Value = TextBox1.Text; cnn.Open(); cmd.ExecuteNonQuery(); cnn.Close(); lbThongbao.Text = "Thành công!"; } catch (Exception) { lbThongbao.Text = "Không thành công!"; } } 5. Kết nối, thao tác dữ liệu, sử dụng đối tượng Command với câu lệnh INSERT, UPDATE, DELETE + Truyền tham số. protected void Button5_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); SqlCommand cmd = new SqlCommand(); cmd.Connection = cnn; cmd.CommandText = "SELECT * FROM Nhaxuatban"; cmd.CommandType = CommandType.Text; cnn.Open(); //Lấy danh sách nhà xuất bản bỏ vào biến DataReader IDataReader dr = cmd.ExecuteReader(); String list = ""; //Duyệt qua DataReader while (dr.Read()) { list = list + dr["TenNXB"].ToString().Trim() + " "; } dr.Close(); TextBox6.Text = list.ToString(); cnn.Close(); } 6. Kết nối cơ sở dữ liệu + gọi store để lấy dữ liệu. Trang 97
  13. CREATE PROCEDURE GetNhaxuatban AS BEGIN SELECT * FROM Nhaxuatban END GO protected void Button6_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); SqlCommand cmd = new SqlCommand("Getnhaxuatban", cnn); cmd.Connection = cnn; cmd.CommandType = CommandType.StoredProcedure; cnn.Open(); IDataReader dr = cmd.ExecuteReader(); String list = ""; while (dr.Read()) { list = list + dr["TenNXB"].ToString(); } dr.Close(); TextBox7.Text = list.ToString(); cnn.Close(); } 7. Kết nối cơ sở dữ liệu + gọi store để lấy dữ liệu + truyền tham số. CREATE PROCEDURE GetchudeByMachude @Machude char(15) AS BEGIN SELECT * FROM CHUDE WHERE MaCD=@Machude END GO protected void Button7_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); SqlCommand cmd = new SqlCommand("GetchudeByMachude", cnn); cmd.Connection = cnn; cmd.CommandType = CommandType.StoredProcedure; //Khai báo và khởi tạo biến Command SqlParameter parMALINHVUC = new SqlParameter("@Machude", SqlDbType.NChar, 10); parMAVHUDE.Value = TextBox1.Text; cmd.Parameters.Add(parMACHUDE); cnn.Open(); IDataReader dr = cmd.ExecuteReader(); String list = ""; while (dr.Read()) { list = list + dr["Tenchude"].ToString(); } dr.Close(); TextBox2.Text = list.ToString(); cnn.Close(); } 8. Kết nối cơ sở dữ liệu + sử dụng DataAdapter + update dữ liệu Trang 98
  14. protected void Button8_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); SqlDataAdapter da = new SqlDataAdapter("select * from CHUDE", cnn); SqlCommandBuilder commandBuilder = new SqlCommandBuilder(da); DataSet ds = new DataSet(); da.Fill(ds); foreach (DataRow row in ds.Tables[0].Rows) if (row["MaCD"]=="1") { row["TENCHUDE"] = "BBB"; } TextBox1.Text = ds.Tables[0].Rows[2].ItemArray[1].ToString(); GridView1.DataSource = ds.Tables[0]; GridView1.DataBind(); //Không sử dụng SqlCommandBuilder thì không thể update dữ liệu. da.Update(ds); } 9. Kết nối cơ sở dữ liệu + sử dụng DataAdapter + gọi store protected void Button9_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); //Khai báo và khởi tạo SqlDataAdapter SqlDataAdapter da = new SqlDataAdapter("GETNHAXUATBAN", cnn); //Khai báo và khởi tạo DataSet DataSet ds = new DataSet(); //Lấy dữ liệu trả về đổ vào dataset ds da.Fill(ds); TextBox11.Text = ds.Tables[0].Rows[2].ItemArray[1].ToString(); GridView2.DataSource = ds.Tables[0]; GridView2.DataBind(); } 10. Kết nối cơ sở dữ liệu + sử dụng DataAdapter + gọi store + truyền tham số protected void Button10_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); SqlCommand cmd = new SqlCommand("GetchudeByMachude", cnn); cmd.Connection = cnn; cmd.CommandType = CommandType.StoredProcedure; //Khai báo và khởi tạo tham số SqlParameter parMACD =new SqlParameter("@MACD", SqlDbType.NChar, 10); parMACD.Value = "1"; cmd.Parameters.Add(parMACD); cnn.Open(); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmd; DataSet ds = new DataSet(); da.Fill(ds); GridView1.DataSource = ds.Tables[0]; GridView1.DataBind(); cnn.Close(); } 11. Kết nối cơ sở dữ liệu + sử dụng DataAdapter + đối số là Command Trang 99
  15. protected void Button10_Click(object sender, EventArgs e) { //Khai báo và khởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=(local); Initial Catalog=QLbansach;User ID=sa;Password="); SqlCommand cmd = new SqlCommand("GETNHAXUATBAN ", cnn); cmd.Connection = cnn; cmd.CommandType = CommandType.StoredProcedure; cnn.Open(); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmd; //da.InsertCommand = cmd; //da.DeleteCommand = cmd; //da.UpdateCommand = cmd; DataSet ds = new DataSet(); da.Fill(ds); GridView1.DataSource = ds.Tables[0]; GridView1.DataBind(); cnn.Close(); } } Trang 100
  16. Bài 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU • Sử dụng các điều khiển Data List, DataGrid và Repeater để hiển thị dữ liệu. • Liên kết dữ liệu với các kiểu tập hợp:ArrayList, SortedList, HashTable, I. Điều khiển DataGrid DataGrid là một điều khiển khá linh hoạt và hiệu quả trong việc hiển thị, định dạng và thao tác với dữ liệu. Bên cạnh đó, chúng ta có thể thực hiện sắp xếp dữ liệu, thực hiện phân trang với sự hỗ trợ khá tốt của VS .Net trong quá trình thiết kế. Bổ sung Control DataGrid vào Thanh ToolBox (Nếu chưa có): Click phải thanh toolbox chọn Choose Items. Đánh dấu vào mục DataGrid (System.Web.UI.WebControls) Ok 1. Tạo DataGrid vào trang Kéo Control DataGrid vào trang Định dạ ng tự động Kế t nố i nguồ n dữ liệ u Thiế t lậ p thuộ c tính 2. Định dạng tự động Thực hiện chọn những mẫu định dạng có sẳn quy định về khung viền màu nền bằng cách Chọn Auto Format từ khung DataGrid Task Trang 101
  17. 3. Kế t nố i nguồ n dữ liệ u Chọ n New Data Source t ừ m ục Choose Data Source Chọn lọai nguồn dữ liệu (DataBase) Đặt tên cho nguồn dữ liệu (Sieuthi) Trang 102
  18. Chọn New Connection Chọn Microsoft SQL Server Continue Khai báo các thông số của CSDL => Chọn Test Connection để kiểm tra. Chọn Ok để đồng ý kết nối. Trang 103
  19. Trang 104
  20. Khai báo dữ liệu cần truy xuất. Chọn Test Query để kiểm tra kết quả. Chọn Finish để hòan tất 4. Thiết lập các thuộc tính Để thực hiện các thao tác thiết lập các thuộc tính, chúng ta chọn chức năng Property Builder từ khung DataGrid Task. a. Trang General Trong trang này, có các mục chọn sau: • Show header: Qui định dòng tiêu đề trên có được phép hiển thị hay không. (mặc định là có hiển thị dòng tiêu đề) Trang 105
  21. • Show footer: Qui định dòng tiêu đề dưới có được phép hiển thị hay không. (mặc định là không hiển thị dòng tiêu đề dưới) • Allow sorting: Có cho phép sắp xếp dữ liệu hay không. (mặc định là không cho phép sắp xếp) Các mục chọn trong Tab General b. Trang Columns (Quản lý thông tin các cột) Trang Columns quản lý thông tin các cột sẽ hiển thị trên lưới. Trang Columns • Create columns automatically at runtime: Khi chọn chức năng này, DataGrid sẽ tự động phát sinh đầy đủ các cột có trong nguồn dữ liệu. Nếu chúng ta muốn qui định các cột cần hiển thị, chúng ta không chọn chức năng này. • Column list: Qui định các cột được hiển thị trong lưới. Trang 106
  22. o Bound Column: Cột có liên kết với nguồn dữ liệu. o Button Column: Cột dạng nút lệnh đã được thiết kế sẵn. Điều khiển DataGrid cung cấp cho chúng ta 3 loại cột dạng này: . Select: Nút lệnh chọn dòng dữ liệu . Edit, Cancel, Update: Các nút lệnh hỗ trợ chức năng cập nhật dữ liệu trực tiếp trên lưới. . Delete: Nút lệnh xóa dòng dữ liệu Chúng ta sẽ có dịp tìm hiểu kỹ hơn về các nút lệnh này trong phần Cập nhật dữ liệu trực tiếp trên lưới. o Hyperlink Column: Cột có liên kết dữ liệu dạng liên kết. o Template Column: Cột do người dùng tự thiết kế. Đây là loại cột có khả năng làm việc khá linh họat. Ví dụ bạn cần hiển thị danh sách khách hàng. Tại cột Phái, bạn không muốn hiển thị Nam/Nữ, thay vào đó, bạn muốn hiển thị điều khiển checkbox thay thế, nếu checkbox được chọn - thể hiện phái Nam và ngược lại. Trong tình huống này, TemplateColumn là sự chọn lựa tốt dành cho bạn. Chúng ta sẽ tìm hiểu sâu hơn về Template Column ở phần sau. • BoundColumn properties: Qui định thông tin chi tiết cho các cột o HeaderText, Footer Text: Thông tin tiêu đề trên/dưới của cột o Header Image: Hình hiển thị trên tiêu đề cột (thay thế thông tin tiêu đề cột Header Text). o Sort Expression: Biểu thức sắp xếp của cột. o Visible: Qui định cột có được hiển thị hay không. o DataField: Qui định tên field hay tên thuộc tính của đối tượng dữ liệu cần hiển thị. o Data formatting expression: Biểu thức định dạng dữ liệu. Mẫu định dạng: {0: }. Ví dụ: + Định dạng số: {0:000.00}, {0:0.##} + Định dạng ngày giờ: {0:dd/MM/yyyy}, {0:hh/mm/ss tt} o Read Only: Chọn giá trị này để cột chỉ được phép đọc, không cho phép cập nhật dữ liệu. o Convert this column into a Template Column: Chuyển cột hiện hành thành cột dạng Template Column. c. Trang Paging (Quản lý phân trang) Trang này quản lý việc phân trang của DataGrid. Trang 107
  23. • Allow paging: Có cho phép phân trang hay không. • Page size: Qui định số dòng của mỗi trang. • Show navigation buttons: Có hiển thị bộ nút để di chuyển từ trang này qua trang khác hay không. Giá trị mặc định là True. • Possition: Qui định vị trí hiển thị của bộ nút di chuyển. Ở phía trên thanh tiêu đề, ở phía dưới hay cả hai. • Mode: Qui định hình thức hiển thị của bộ nút di chuyển. Hiển thị dạng số trang hay là các chuỗi ký tự đại diện (Next page/Previous page button text). Trong trường hợp hiển thị dạng số, Numeric buttons qui định số nút lệnh được hiển thị tối đa. Google hiển thị kết quả đƣợc phân trang theo dạng số d. Trang Format (Định dạng) Trang Format quản lý việc định dạng hiển thị trên điều khiển DataGrid. Các định dạng chung như: Màu chữ, màu nền, Font chữ, kích cỡ, in đậm /in nghiêng/gạch dưới và canh lề. Trang 108
  24. Trang Format DataGrid: Qui định các định dạng chung cho lưới Header: Định dạng cho dòng tiêu đề. • Footer: Định dạng cho dòng tiêu đề dưới. • Pager: Định dạng cho dòng chứa các nút lệnh phân trang. • Items o Normal Items: Định dạng cho các dòng dữ liệu. o Alternating Items: Định dạng hiển thị cho các dòng lẻ. o Selected Items:Định dạng hiển thị cho dòng đang được chọn. o Edit Mode Items: Định dạng hiển thị cho dòng đang ở trạng thái hiệu chỉnh dữ liệu. • Columns: Qui định độ rộng và các định dạng riêng cho từng cột. e. Trang Borders (Khung viền) Trang Borders quản lý việc kẻ khung viền cho lưới. Trang 109
  25. • Cell margin o Cell padding: Qui định khoảng cách giữa nội dung trong ô với đường viền của ô. o Cell spacing: Qui định khoảng cách giữa các ô Thi hành 2. Xử lý sắp xếp Sắp xếp dữ liệu trên lưới là một công việc rất cần thiết đối với người sử dụng. Hãy thử tưởng tượng xem trong trường hợp chúng ta có khá nhiều dữ liệu hiển thị trên màn hình (giả sử là danh sách nhân viên chẳng hạn), thật khó để chọn ra các nhân viên có thâm niên làm việc lâu nhất Trang 110
  26. hay các nhân viên có số giờ tham gia đề án nhiều nhất . Với chức năng sắp xếp trên lưới sẽ giúp cho người dùng dễ dàng chọn ra các nhân viên thỏa mãn các yêu cầu trên. Để thực hiện được thao tác sắp xếp dữ liệu trên lưới, chúng ta cần phải thực hiện các công việc sau: Giá trị thuộc tính Allow sorting = True Nhập giá trị cho thuộc tính Sort expression của các cột cần sắp xếp. Xử lý sự kiện SortCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls. DataGridSortCommandEventArgs) Trong sự kiện trên, giá trị e.SortExpression cho biết thông tin của cột được chọn sắp xếp. Ví dụ: Private Sub Page_Load( ) Handles MyBase.Load If Not IsPostBack Then dtgKhach_hang.DataSource = Doc_ds_khach_hang() dtgKhach_hang.DataBind() End If End Sub Private Sub dtgKhach_hang_SortCommand( ,e ) dtgKhach_hang.DataSource = Doc_ds_khach_hang(e.SortExpression) dtgKhach_hang.DataBind() End Sub Public Function Doc_ds_khach_hang(Optional ByVal pChuoi_sap_xep As String = "") As DataTable Dim sKet_noi As String sKet_noi = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & _ Server.MapPath(" \Data\QlBanSach.mdb") Dim cnKet_noi As New OleDbConnection(sKet_noi) Dim dsCSDL As New DataSet Dim sLenh_sql As String = "Select * From KHACH_HANG" sLenh_sql &= IIf(pChuoi_sap_xep = "", _ "", " Order by " & pChuoi_sap_xep) 'Mở và đóng kết nối ngay khi thực hiện xong cnKet_noi.Open() Dim daBo_doc_ghi As New OleDbDataAdapter(sLenh_sql, cnKet_noi) cnKet_noi.Close() daBo_doc_ghi.Fill(dsCSDL, "KHACH_HANG") Return dsCSDL.Tables("KHACH_HANG") End Function Sắp xếp khách hàng tăng dần theo tên 3. Xử lý phân trang Phân trang dữ liệu không những giúp cho việc xem và tìm kiếm thông tin được dễ dàng mà còn giảm được khối lượng dữ liệu cần được truyền tải từ Server về Client. Việc phân trang trong ASP.Net được thực hiện khá dễ dàng, chỉ với một số thao tác đơn giản. Để thực hiện phân trang, chúng ta cần phải thực hiện các công việc sau: Trang 111
  27. Qui định các thông số cần thiết cho việc phân trang (xem Quản lý phân trang ở phần Các thao tác định dạng lưới). Xử lý sự kiện PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI. WebControls.DataGridPageChangedEventArgs) Trong sự kiện trên, giá trị e.NewPageIndex cho biết trang được chọn để hiển thị dữ liệu. Định dạng phân trang Mã lệnh xử lý: Private Sub Page_Load( ) Handles MyBase.Load If Not IsPostBack Then Lien_ket_du_lieu() End If End Sub Private Sub dtgKhach_hang_PageIndexChanged( , e ) dtgKhach_hang.CurrentPageIndex = e.NewPageIndex Lien_ket_du_lieu() End Sub Dữ liệu hiển thị đƣợc phân trang 4. Tùy biến các cột Trong phần này, chúng tôi sẽ hướng dẫn các bạn tùy biến các cột trên lưới, cụ thể hơn, chúng ta sẽ hiển thị checkbox thay cho giá trị True/False của cột giới tính. Để thực hiện việc tùy biến các cột, chúng ta cần phải thực hiện 2 giai đoạn sau: Giai đoạn 1: Thiết kế Trong giai đoạn này, chúng ta tùy biến cột theo một yêu cầu cụ thể. Thay vì phải hiển thị ô dữ liệu bình thường (như họ khách hàng, tên khách hàng, ), chúng ta có thể sử dụng điều khiển Checkbox để thay thế cho cột có giá trị luận lý, sử dụng điều khiển Image, Image button hay Hyperlink để hiển thị hình ảnh thay cho chuỗi đường dẫn dẫn đến hình ảnh đó, Giai đoạn 2: Xử lý Sau khi thực hiện hoàn tất giai đoạn thiết kế, đây là lúc chúng ta phải viết các lệnh xử lý để hiển thị dữ liệu theo yêu cầu của mình. I.4.1. Giai đoạn 1: Thiết kế Bước 1. Thêm mới cột Phái, kiểu Template Column. Nhập giá trị Header text, Sort expression cho cột này (nếu cần) Bổ sung cột Phái kiểu Template Column Bước 2. Từ thực đơn ngữ cảnh, chọn Edit Template \ Column[X] –YYY (X: Số thứ tự của cột; Y: Chuỗi tiêu đề của cột) Chúng ta chọn cột cần hiệu chỉnh. Chọn chức năng hiệu chỉnh cột Phái Bước 3. Thêm điều khiển checkbox chkPhai, vào mục ItemTemplate Tùy biến cột Phái Bước 4. Chọn End Template Editing từ thực đơn ngữ cảnh sau khi thiết kế xong. Trang 112
  28. Điều khiển lƣới sau khi đã đƣợc tùy biến cột Phái I.4.2. Giai đoạn 2: Xử lý Khác với Bound column, cột kiểu Template column không tự động hiển thị dữ liệu. Mà làm sao hiển thị dữ liệu được khi chính bản thân các điều khiển (mới được tạo khi thiết kế) không có qui định field cần được hiển thị từ nguồn dữ liệu. Do đó, để hiển thị dữ liệu (theo ý đồ của chúng ta), ta phải viết lệnh các xử lý trong sự kiện ItemDataBound Mã lệnh xử lý: (1)Private Sub dtgKhach_hang_ItemDataBound( ,e ) (2) If e.Item.ItemIndex = 0: Đây là dòng dữ liệu. Giá trị của thuộc tính này cho biết chỉ số của dòng dữ liệu hiện hành. Dòng lệnh (3,4): Nhiệm vụ chính ở 2 dòng lệnh này là chúng ta khai báo các điều khiển ứng với Trang 113
  29. các điều khiển được đặt vào lúc thiết kế. Sử dụng phương thức e.Item.FindControl( ) để lấy điều khiển hiện có trong dòng đang xảy ra sự kiện. chkPhai = e.Item.FindControl("chkPhai") 'hay chkPhai =Ctype(e.Item.FindControl("chkPhai"),CheckBox) Bảng KHACH_HANG Dòng lệnh (5): Sau khi lấy được điều khiển ứng với dòng đang xảy ra sự kiện, tùy theo dữ liệu mà ta sẽ hiển thị lên điều khiển giá trị tương ứng. Để lấy được dữ liệu của dòng hiện hành, ta sử dụng thuộc tính e.Item.DataItem( ) chkPhai.Checked = e.Item.DataItem("Gioi_tinh") Kết quả hiển thị Đối với những xử lý phức tạp, sự kiện ItemDataBound sẽ là sự lựa chọn hàng đầu trong việc tùy biến hiển thị dữ liệu. Tuy nhiên, đối với những xử lý đơn giản, chúng ta có thể thực hiện liên kết dữ liệu trong quá trình thiết kế. Chọn Edit Template cột Phái, chọn điều khiển chkPhai. Chọn điều khiển chkPhai trong lúc thiết kế Trên cửa sổ thuộc tính, chọn (DataBindings) Chọn chức năng DataBidings Trên cửa sổ thuộc tính, chọn (DataBindings). Hộp thoại DataBindings của điều khiển chkPhai xuất hiện. Các thuộc tính có thể liên kết dữ liệu của điều khiển xuất hiện trong Danh sách bên trái hộp thoại. Chọn thuộc tính cần liên kết, chọn loại liên kết là Custom binding expression, nhập chuỗi liên kết dữ liệu trong điều khiển bên dưới theo cú pháp: Container.DataItem("Tên field") Ở ví dụ này, chúng ta thực hiện liên kết thuộc tính Checked của điều khiển chkPhai với field Gioi_tinh có trong nguồn dữ liệu của lưới. I.5. Cập nhật dữ liệu trực tiếp trên lƣới Cập nhật dữ liệu trực tiếp trên lưới trong ASP.Net được hỗ trợ khá tốt về giao diện. Công việc còn lại của chúng ta là thiết kế các nút lệnh như: Chọn, Sửa/Ghi - Không, Hủy, và viết các lệnh cập nhật dữ liệu. I.5.1. Giai đoạn thiết kế Trong cửa sổ thuộc tính của lưới, chúng ta tạo bộ nút lệnh cần thiết hỗ trợ cho việc cập nhật dữ liệu. Ở ví dụ này, chúng tôi tạo bộ nút (Select - chọn), (Edit, Update, Cancel - Sửa, Ghi, Không) và (Delete - Hủy) Đối với các nút lệnh trên, các bạn cần chú ý đến giá trị của thuộc tính Command name. Ứng với mỗi nút lệnh có giá trị CommandName khác nhau, nhờ đó, ta viết lệnh xử lý với chức năng tương ứng được chọn. Trang 114
  30. Select: Command name = "Select" Edit, Update/Cancel: Command name = "Edit", "Update"/"Cancel" Delete: Command name = "Delete" Tạo bộ nút lệnh Thêm - Sửa/Ghi/Không - Hủy Tìm hiểu về thuộc tính Command Name Cũng cần bàn thêm một chút ở đây về thuộc tính Command Name. Như các bạn cũng biết, các nút lệnh ở trên (Chọn, Thêm - Sửa / Ghi / Không - Hủy) là do VS.Net hỗ trợ, giá trị thuộc tính CommandName của các nút lệnh trên là những giá trị mặc định được qui định sẵn. Ứng với mỗi CommandName mặc định, sẽ có các sự kiện để ta thực hiện các xử lý tương ứng: Command name="Edit" Sự kiện EditCommand Command name="Update" Sự kiện UpdateCommand Command name="Cancel" Sự kiện CancelCommand Command name="Delete" Sự kiện DeleteCommand Chắc hẳn các bạn sẽ thắc mắc tại sao không có sự kiện SelectCommand? Bốn sự kiện được liệt kê trên là 4 sự kiện dành riêng, tương ứng với giá trị của các Command name mặc định là Edit, Update, Cancel, Delete. Đối với những CommandName có giá trị khác, chúng ta sẽ sử dụng sự kiện dành chung cho tất cả các nút lệnh có thuộc tính CommandName (Button, Linkbutton, ImageButton) được đặt trên lưới - sự kiện ItemCommand. Tại sao vậy? Vì khi ta đặt các nút lệnh vào lưới (sử dụng cột Template column), chúng (các nút lệnh) không còn sự kiện Click nữa, thay vào đó, tất cả các nút lệnh khi được nhấn sẽ gây ra sự kiện ItemCommand. Dựa vào giá trị e.CommandName (tham số trong sự kiện) để chúng ta xác định nút lệnh nào đã được nhấn. Cũng cần lưu ý thêm ở đây là bất kỳ nút lệnh nào khi được nhấn đều gây ra sự kiện ItemCommand. Do đó, đối với các nút lệnh có giá trị thuộc tính CommandName là Edit, Update, Cancel, Delete khi được nhấn vẫn gây ra sự kiện ItemCommand trước khi gây ra các sự kiện dành riêng cho chúng. Giao diện lƣới sau khi thêm bộ nút lệnh I.5.2. Giai đoạn xử lý Xử lý chọn mẩu tin Chọn mẫu tin trên lƣới Private Sub dtgKhach_hang_ItemCommand( , e ) If e.CommandName = "Select" Then dtgKhach_hang.SelectedIndex = e.Item.ItemIndex Lien_ket_du_lieu() End If End Sub Trang 115
  31. Xử lý sửa, ghi, không Muốn cập nhật dữ liệu, ta cần xác định khách hàng được cập nhật thông qua Mã khách hàng. Để lấy Mã khách hàng: Gán thuộc tính DataKeyField của điều khiển lưới = "MKH" .DataKeys( ) Trả về Mkh tại dòng Chọn mẫu tin để cập nhật dữ liệu Private Sub Page_Load( ) If Not IsPostBack Then dtgKhach_hang.DataKeyField = "MKH" Lien_ket_du_lieu() End If End Sub Private Sub dtgKhach_hang_EditCommand( , e ) dtgKhach_hang.EditItemIndex = e.Item.ItemIndex Lien_ket_du_lieu() End Sub Private Sub dtgKhach_hang_UpdateCommand( , e ) 'Khai báo và khởi tạo biến kết nối: cnKet_noi 'Lấy dữ liệu mà người dùng vừa cập nhật Dim lHo_kh As TextBox = e.Item.Cells(0).Controls(0) Dim lTen_kh As TextBox = e.Item.Cells(1).Controls(0) Dim lPhai As CheckBox = e.Item.FindControl("chkPhai") Dim lMkh As Integer = dtgKhach_hang.DataKeys(e.Item.ItemIndex) 'Tạo đối tượng Command để cập nhật dữ liệu Dim cmdLenh As New OleDbCommand cmdLenh.Connection = cnKet_noi cmdLenh.CommandText = "Update KHACH_HANG " & _ "Set Ho_khach_hang=?, Ten_khach_hang=?, " & _ "Gioi_tinh=? Where MKH=?" 'Truyền tham số cho đối tượng Command cmdLenh.CommandType = CommandType.Text cmdLenh.Parameters.Add("Ho_kh", lHo_kh.Text) cmdLenh.Parameters.Add("Ten_kh", lTen_kh.Text) cmdLenh.Parameters.Add("Phai", lPhai.Checked) cmdLenh.Parameters.Add("Mkh", lMkh) 'Thi hành Command cnKet_noi.Open() Trang 116
  32. cmdLenh.ExecuteNonQuery() cnKet_noi.Close() 'Tắt chế độ cập nhật dữ liệu dtgKhach_hang.EditItemIndex = -1 'Hiển thị dữ liệu mới cập nhật lên lưới Lien_ket_du_lieu() End Sub Private Sub dtgKhach_hang_CancelCommand( , e ) dtgKhach_hang.EditItemIndex = -1 Lien_ket_du_lieu() End Sub Hiệu chỉnh độ rộng của các Textbox khi dòng ở trạng thái sửa Bạn có thể bổ sung đoạn lệnh sau (trong sự kiện ItemDataBound) để hiệu chỉnh độ rộng các Textbox của dòng ở trạng thái sửa. If e.Item.ItemType = ListItemType.EditItem Then CType(e.Item.Cells(0).Controls(0),TextBox).Width = New Unit(133) CType(e.Item.Cells(1).Controls(0), TextBox).Width = New Unit(63) End If Xử lý hủy mẫu tin Private Sub dtgKhach_hang_DeleteCommand( , e ) 'Thực hiện xóa dòng dữ liệu ở đây 'Xử lý tương tự như Update Command 'Hiển thị dữ liệu mới cập nhật lên lưới Lien_ket_du_lieu() End Sub II. Điều khiển DataList II.1. Sử dụng DataList để hiển thị dữ liệu Như điều khiển DataGrid, điều khiển DataList được sử dụng để hiển thị dữ liệu. Tuy nhiên, đối với DataList, chúng ta phải tự thiết kế hình thức hiển thị dữ liệu (giống như Template Column của DataGrid). Huy Cận Về Tác Giả Và Tác Phẩm NXB: Giáo dục Cuốn Huy Cận Về Tác Gia Và Tác Phẩm tập hợp những bài nghiên cứu, phê bình của các nhà văn, nhà thơ, các cán bộ giảng dạy, các nhà nghiên cứu phê bình văn học, các nhà nghiên cứu văn hóa nước ngoài đã được công bố trên sách, báo, tạp chí. Các bài viết này được sắp xếp theo thứ tự thời gian và chủ đề, để bạn đọc có thể hình Trang 117
  33. Giá: 45,500.00 VND [Đặt hàng] [Xem Tiếp] Địa Chất Công Trình (Giáo Trình Dùng Cho Sinh Viên Ngành Xây Dựng Cầu Đƣờng) NXB: Giao thông vận tải Địa chất công trình là một môn được đưa vào chương trình đào tạo kỹ sư ngành Xây dựng cầu đường của trường Đại học GTVT từ lâu. Những hiểu biết về địa chất công trình sẽ giúp ích nhiều cho kỹ sư cầu đường trong khảo sát, thiết kế và thi công các công trình giao thông Giá: 14,000.00 VND [Đặt hàng] [Xem Tiếp] Sử dụng DataList hiển thị thông tin sách Một số thuộc tính cần chú ý của DataList RepeatDirection: Qui định hướng hiển thị dữ liệu Horizontal: Hiển thị dữ liệu theo chiều ngang RepeatDirection = Horizontal Vertical (mặc định): Hiển thị dữ liệu theo chiều đứng RepeatDirection = Vertical RepeatColumns: Qui định số cột hiển thị của DataList L'Enquête Corse Đặt mua Unspeakable Đặt mua Bottle Rocket Đặt mua Ripper Đặt mua Enduring Love Đặt mua The Good Thief Đặt mua RepeatColumns = 3 Thiết kế hình thức hiển thị cho DataList cũng tương tự như thiết kế cho cột Template Column của DataGrid. Chọn Edit Template | ItemTemplate từ thực đơn ngữ cảnh để thực hiện thiết kế hình thức hiển thị cho DataList. Chọn chức năng thiết kế cho DataList Trang 118
  34. Trong quá trình thực hành, để công việc thiết kế được dễ dàng, các bạn thực hiện thiết kế ở bên ngoài điều khiển DataList. Sử dụng Table (thực đơn Insert Table) để định vị trí hiển thị của các điều khiển. Sau khi hoàn tất công việc thiết kế, chúng ta kéo kết quả đã thiết kế vào vị trí cần hiển thị trong DataList. Ví dụ: Hiển thị thông tin sách với DataList Thiết kế thông tin sách với DataList Như cột Template Column của DataGrid, xử lý hiển thị dữ liệu cho DataList được viết trong sự kiện ItemDataBound. Xử lý nhấn của các Button đặt trong DataList được viết trong sự kiện ItemCommand. Private Sub Page_Load( , e ) Handles MyBase.Load If Not IsPostBack Then Lien_ket_du_lieu() End If End Sub Public Sub Lien_ket_du_lieu() dtSach = Doc_danh_sach_Sach() dtlSach.DataSource = dtSach dtlSach.DataKeyField = "Ms" dtlSach.DataBind() End Sub Private Sub dtlSach_ItemDataBound( , e ) Dim lDong as Integer = e.Item.ItemIndex If lDong < 0 Then Exit Sub 'Hiển thị Tên sách Dim lnkTs As LinkButton lnkTs = e.Item.FindControl("lnkTen_sach") lnkTs.Text = e.Item.DataItem("Ten_sach") 'Hiển thị thông tin mô tả tóm tắt nội dung Label HyperLink LinkButton Tài liệu hướng dẫn giảng dạy Học phần 3 - Lập trình ứng dụng web với ASP.NET Trang 82/174 Dim lblMt As Label Trang 119
  35. lblMt = e.Item.FindControl("lblMo_ta") lblMt.Text = Left(e.Item.DataItem("Mo_ta"), 200) & " " 'Hiển thị hình ảnh minh họa Dim hplHinh As HyperLink hplHinh = e.Item.FindControl("hplHinh_mh") hplHinh.ImageUrl = " /Data_Pic/" & e.Item.DataItem("Hinh_minh_hoa") 'Hiển thị giá bán sách Dim lblGia As Label lblGia = e.Item.FindControl("lblGia_ban") lblGia.Text = e.Item.DataItem("Don_gia") End Sub Kết quả hiển thị thông tin sách trên trang Web Kết quả trên trang Web Tài liệu hướng dẫn giảng dạy Học phần 3 - Lập trình ứng dụng web với ASP.NET Trang 83/174 II.2. Cập nhật dữ liệu với DataList Ngoài việc hiển thị dữ liệu, DataList cũng hỗ trợ các thao tác cập nhật dữ liệu. Để thực hiện chức năng cập nhật dữ liệu với DataList, chúng ta cần phải thiết kế thêm vùng EditIemTemplate cho DataList. (xem hình) II.2.1. Các bƣớc xử lý a. Thiết kế Thiết kế cả 2 vùng ItemTemplate và EditItemTemplate. Thực hiện các thao tác liên kết dữ liệu cho các điều khiển trong vùng EditItemTemplate thông qua cửa sổ thuộc tính tương tự như trong ItemTemplate. Chú ý: Chúng ta hoàn toàn có thể thực hiện việc liên kết dữ liệu trong sự kiện ItemDataBound. Chọn chức năng DataBindings cho ô Đơn giá Liên kết dữ liệu với cột Don_gia Yêu cầu thiết kế Tên điều khiển Thiết lập thuộc tính Hieu_chinh: ImageButton CommandName: Edit Ghi_nhan: ImageButton CommandName: Update CommandArgument: DataBinder.Eval(Container, "DataItem.Ms") Lưu lại mã số của sách đang hiệu chỉnh. Bo_qua: ImageButton CommandName: Cancel Tài liệu hướng dẫn giảng dạy Học phần 3 - Lập trình ứng dụng web với ASP.NET Trang 85/174 b. Xử lý lệnh để cập nhật dữ liệu Trang 120
  36. Xử lý các sự kiện EditCommand, CancelCommand, UpdateCommand để thực hiện/bỏ qua việc thay đổi dữ liệu. Private Sub Page_Load( , e ) Handles MyBase.Load 'Put user code to initialize the page here If Not IsPostBack Then Lien_ket_du_lieu() End If End Sub Private Sub dtlHang_hoa_EditCommand( , e ) dtlHang_hoa.EditItemIndex = e.Item.ItemIndex Lien_ket_du_lieu() End Sub Private Sub dtlHang_hoa_CancelCommand( , e ) dtlHang_hoa.EditItemIndex = -1 Lien_ket_du_lieu() End Sub Private Sub dtlHang_hoa_UpdateCommand( , e ) 'Xử lý cập nhật dữ liệu tại đây Dim Don_gia_sua As TextBox Don_gia_sua = e.Item.FindControl("Don_gia_sua") 'Don_gia_sua.Text Trả về đơn giá mới được sửa ' dtlHang_hoa.EditItemIndex = -1 Lien_ket_du_lieu() End Sub Tài liệu hướng dẫn giảng dạy Học phần 3 - Lập trình ứng dụng web với ASP.NET Trang 86/174 DataList ở chế độ đang hiệu chỉnh III. Điều khiển Repeater Như 2 điều khiển DataList & DataGrid, điều khiển Repeater cũng được dùng để hiển thị dữ liệu. Tuy nhiên, để hiển thị dữ liệu, chúng ta phải tự thiết kế hình thức hiển thị thông qua các tag HTML. Điều khiển Repeater có các tag sau: (tùy chọn) Qui định hình thức hiển thị cho tiêu đề. (Chỉ xuất hiện 1 lần, phía trên của điều khiển) (Bắt buộc phải có) Qui định hình thức hiển thị cho các mục dữ liệu trong điều khiển. (tùy chọn) Trang 121
  37. Qui định hình thức hiển thị cho các mục dữ liệu trong điều khiển. Nội dung được qui định trong cặp tag này sẽ hiển thị xen kẽ với các nội dung trong cặp tag (tùy chọn) Qui định hình thức hiển thị giữa các dòng dữ liệu (tùy chọn) Qui định hình thức hiển thị cho tiêu đề dưới. (Chỉ xuất hiện 1 lần, phía dưới của điều khiển) Ví dụ: Bước 1. Tạo mới điều khiển Repeater: rptKhach_hang vào trang Web. Điều khiển rptKhach_hang trên trang Web Bước 2. Chuyển qua xem trang Web dưới dạng HTML Bước 3. Bổ sung các tag sau Họ khách hàng Tên khách hàng Địa chỉ Điện thoại Trang 122
  38. Bước 4. Xem lại màn hình thiết kế Bước 5. Tạo nguồn dữ liệu cho điều khiển Private Sub Page_Load( ) Handles MyBase.Load 'Tạo dữ liệu cho đối tượng DataTable: dtKhach_hang rptKhach_hang.DataSource = dtKhach_hang rptKhach_hang.DataBind() End Sub Trang 123
  39. Bước 6. Thi hành ứng dụng Tài liệu hướng dẫn giảng dạy Học phần 3 - Lập trình ứng dụng web với ASP.NET Trang 90/174 IV. Các ví dụ mở rộng IV.1. Xử lý đảo hƣớng sắp xếp trong DataGrid Ví dụ minh họa dưới đây xử lý đảo hướng sắp xếp trong DataGrid. Đồng thời, trong ví dụ này, chúng tôi thực hiện liên kết dữ liệu qua đối tượng DataView để thực hiện sắp xếp trên nguồn dữ liệu. Private Sub Page_Load( , e ) Handles MyBase.Load If Not IsPostBack Then Lien_ket_du_lieu() End Sub Public Sub Lien_ket_du_lieu() Dim dtKhach_hang As DataTable = Doc_ds_khach_hang() Dim dvKhach_hang As New DataView(dtKhach_hang) dvKhach_hang.Sort = ViewState("SortExpression") If ViewState("SortAscending") = "false" Then dvKhach_hang.Sort &= " desc" End If dtgKhach_hang.DataSource = dvKhach_hang dtgKhach_hang.DataBind() End Sub Public Function Doc_ds_khach_hang() As DataTable Dim sKet_noi As String sKet_noi = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & _ Server.MapPath(" \Data\QlBanSach.mdb") Dim cnKet_noi As New OleDbConnection(sKet_noi) Dim dsCSDL As New DataSet 'Mở và đóng kết nối ngay khi thực hiện xong cnKet_noi.Open() Dim daBo_doc_ghi As New OleDbDataAdapter _ ("Select * From KHACH_HANG", cnKet_noi) cnKet_noi.Close() daBo_doc_ghi.Fill(dsCSDL, "KHACH_HANG") Return dsCSDL.Tables("KHACH_HANG") End Function Private Sub dtgKhach_hang_SortCommand( , e ) Dim sSap_xep As String = ViewState("SortExpression") Tài liệu hướng dẫn giảng dạy Học phần 3 - Lập trình ứng dụng web với ASP.NET Trang 91/174 Trang 124
  40. Dim sHuong As String = ViewState("SortAscending") ViewState("SortExpression") = e.SortExpression If (e.SortExpression = sSap_xep) Then ViewState("SortAscending") = IIf(sHuong = "false", "true", "false") End If Lien_ket_du_lieu() End Sub IV.2. Tạo biểu tƣợng sắp xếp trong cột cho DataGrid Sắp xếp tăng dần theo tên khách hàng Private Sub dtgKhach_hang_ItemDataBound( , e ) If e.Item.ItemType = ListItemType.Header Then Dim sSap_xep As String = ViewState("SortExpression") Dim sHuong As String = ViewState("SortAscending") Dim sKy_hieu As String = IIf(sHuong = "false", " 6", " 5") Dim i% For i = 0 To dtgKhach_hang.Columns.Count - 1 If sSap_xep = _ dtgKhach_hang.Columns(i).SortExpression Then Dim cell As TableCell = e.Item.Cells(i) Dim lblKy_hieu As New Label lblKy_hieu.Text = sKy_hieu lblKy_hieu.Font.Name = "webdings" lblKy_hieu.Font.Size = FontUnit.XSmall cell.Controls.Add(lblKy_hieu) End If Next End If End Sub IV.3. Định dạng hình thức hiển thị cho dòng dữ liệu thỏa điều kiện trên DataGrid Trong ví dụ sau, chúng ta thực hiện tô màu cho những khách hàng có tên bắt đầu bằng ký tự H. Private Sub dtgKhach_hang_ItemDataBound( , e ) If e.Item.ItemIndex < 0 Then Exit Sub Dim sTen_kh As String sTen_kh = e.Item.DataItem("Ten_khach_hang") 'Tiến hành kiểm tra điều kiện, 'nếu thỏa thực hiện các xử lý định dạng Trang 125
  41. If sTen_kh.StartsWith("H") Then e.Item.BackColor = Color.LemonChiffon e.Item.Cells(1).Font.Bold = True End If End Sub Tô màu những khách hàng có tên bắt đầu bằng ký tự H IV.4. Tạo hiệu ứng chọn khi rê chuột qua các dòng dữ liệu Private Sub dtgKhach_hang_ItemDataBound( , e ) If e.Item.ItemIndex < 0 Then Exit Sub e.Item.Attributes("onMouseOver") = _ "this.style.backgroundColor='#FFF8DC'" e.Item.Attributes("onMouseOut") = _ "this.style.backgroundColor=''" End Sub Tạo hiệu ứng chọn dòng dữ liệu trên lƣới Kinh nghiệm giảng dạy: Các điều khiển liên kết dữ liệu (DataGrid, DataList, Repeater) hỗ trợ khá tốt việc hiển thị dữ liệu trên trang web. Do hỗ trợ khá nhiều chức năng, giáo viên nên hướng dẫn học viên sử dụng tuần tự từng chức năng mà các điều khiển hỗ trợ. Sau khi nắm vững các thao tác của từng chức năng, học viên có thể phối hợp các chức năng lên cùng một bài tập. Trang 126
  42. TÀI LIỆU THAM KHẢO 1. MSDN Library - April 2003 & MSDN Library - July 2005 2. MSDN Traning: Developing Microsoft ASP.NET Web Applications Using Visual Studio.NET 3. MSDN Traning: Programming with Microsoft ADO.NET 4. ASP.NET Web Developer’s Guide 5. ASP.NET By Example [Steven A. Smith] 6. Developing Web Applications with Visual Basic .NET and ASP.NET [John Alexander, Billy Hollis] 7. Programming ASP.NET, 2nd Edition [Dan Hurwitz, Jesse Liberty] 8. Inside ASP.NET [Scott Worley] 9. ASP NET Bible [Mridula Parihar] 10. ASP.NET for Web Designers [Peter Ladka] 11. Professional ADO.NET Programming [Wrox] 12. Cascading Style Sheets - The Designer's Edge [Molly E. Holzschlag ] 13. JavaScript Bible - Gold Edition [Danny Goodman] 14. Real World Web Services [Yasser Shohoud] 15. Trang chủ ASP.Net: 16. Trường học trực tuyến của W3C: Trang 127