Giáo trình Xây dựng ứng dụng Windows - Trường Cao đẳng kinh tế kỹ thuật Thành phố Hồ Chí Minh

pdf 123 trang Gia Huy 16/05/2022 3610
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Xây dựng ứng dụng Windows - Trường Cao đẳng kinh tế kỹ thuật Thành phố Hồ Chí Minh", để 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_xay_dung_ung_dung_windows_truong_cao_dang_kinh_te.pdf

Nội dung text: Giáo trình Xây dựng ứng dụng Windows - Trường Cao đẳng kinh tế kỹ thuật Thành phố Hồ Chí Minh

  1. ỦY BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG CAO ĐẲNG KINH TẾ KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH  GIÁO TRÌNH MÔ ĐUN /MÔN HỌC : XÂY DỰNG ỨNG DỤNG WINDOWS NGHỀ: HỆ THỐNG THÔNG TIN TRÌNH ĐỘ: CAO ĐẲNG Thành phố Hồ Chí Minh, năm 2020
  2. ỦY BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG CAO ĐẲNG KINH TẾ KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH  GIÁO TRÌNH MÔ ĐUN /MÔN HỌC: XÂY DỰNG ỨNG DỤNG WINDOWS NGHỀ: HỆ THỐNG THÔNG TIN TRÌNH ĐỘ: CAO ĐẲNG THÔNG TIN CHỦ NHIỆM ĐỀ TÀI Họ tên: Huỳnh Khắc Duy Học vị: Thạc sỹ Đơn vị: Khoa Công Nghệ Thông Tin Email: huynhkhacduy@gmail.com TRƯỞNG KHOA TỔ TRƯỞNG CHỦ NHIỆM BỘ MÔN ĐỀ TÀI Huỳnh Khắc Duy HIỆU TRƯỞNG DUYỆT Năm 2020
  3. TUYÊN BỐ BẢN QUYỀN Tài liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo. Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu lành mạnh sẽ bị nghiêm cấm.
  4. LỜI GIỚI THIỆU Giới thiệu xuất xứ của giáo trình, quá trình biên soạn, mối quan hệ của giáo trình với chương trình đào tạo và cấu trúc chung của giáo trình. Lời cảm ơn của các cơ quan liên quan, các đơn vị và cá nhân đã tham gia. ., ngày tháng năm Tham gia biên soạn 1. Huỳnh Khắc Duy KHOA CÔNG NGHỆ THÔNG TIN 4
  5. MỤC LỤC CHƯƠNG 1. WINDOWS CONTROLS 12 1.1 Tổng quan controls 12 1.2 Property & layout của control 12 1.3 Các control thông dụng 17 1.4 Mouse Even handling 47 1.5 Keyboard event handing 49 1.6 Tổng quan ứng dụng document Interface 54 1.7 Single Document Interface (SDI) 54 1.8 Multiple Document Interface (MDI) 55 1.9 GUI hỗ trợ 57 CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET 61 2.1. Tổng quan về ADO.NET 61 2.2. Các đối tượng trong ADO.NET 62 2.3. Đối tượng Command 66 2.4. Đối tượng DataAdapter 67 2.5. Đối tượng DataSet 68 CHƯƠNG 3. CÁC THÀNH PHẦN CỦA DATASET 70 3.1. Đối tượng DataTable 70 3.2. Đối tượng DataRow, DataColumn và DataRelation 70 CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU 78 4.1. ComboBox, ListBox, CheckListBox 78 4.2. DataGrid 92 CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG 94 5.1. Xây dựng ứng dụng với mô hình 3-layer 94 5.1.1. Tổ chức cây thư mục 95 5.1.2. Mô hình đa tầng 97 5.1.3. Xây dựng lớp xử lý lưu trữ 98 5.1.4. Xây dựng các lớp xử lý nghiệp vụ 102 5.1.5. Hiển thị dữ liệu và thao tác trên màn hình 103 CHƯƠNG 6. CRYSTAL REPORT 109 6.1 Crystal report 109 6.1.1. Tạo mới report 109 6.1.2. Sử dụng crystal report để hiển thị report 112 6.1.3. Tạo nguồn dữ liệu cho report từ DataSet 113 6.1.4. Tạo nguồn dữ liệu cho report từ nguồn CSDL 114 6.1.5. Lọc dữ liệu trên report 114 6.1.6. Truyền tham số cho report 115 6.1.7. Xuất report ra máy in 115 6.1.8. Xuất report ra tập tin 116 6.1.9. Đóng gói project 119 KHOA CÔNG NGHỆ THÔNG TIN 5
  6. CHƯƠNG 2: GIÁO TRÌNH MÔN HỌC/MÔ ĐUN Tên môn học/mô đun: Xây dựng ứng dụng Windows Mã môn học/mô đun: MH3101344 Vị trí, tính chất, ý nghĩa và vai trò của môn học/mô đun: - Vị trí: là môn học chuyên ngành, học kỳ 4. - Tính chất: môn học lý thuyết, môn bắt buộc. - Ý nghĩa và vai trò của môn học/mô đun: Mục tiêu của môn học/mô đun: - Về kiến thức: + Trình bày được về chức năng và cách thức sử dụng của các điều khiển (windows controls) trong lập trình ứng dụng trên windows. + Trình bày được cách thức kết hợp sử dụng của các điều khiển trong lập trình ứng dụng trên windows. + Thiết kế một ứng dụng windows forms cho một bài toán cụ thể. + Trình bày được thành phần của một ứng dụng có lien quan đến cơ sở dữ liệu + Nhận diện được các bước cần thiết để kết nối đến cơ sở dữ liệu từ ngôn ngữ lập trình + Trình bày được các các phương pháp để tạo các biểu mẫu nhập dữ liệu thông dụng + Trình bày được các các phương pháp để tạo các báo cáo. - Về kỹ năng: + Xây dựng được các giao diện tương tác trực quan với người sử dụng Windows. + Xây dựng một ứng dụng Winform hoàn chỉnh ở mức độ vừa phải sử dụng công nghệ .NET + Gắn kết được các tương tác qua giao diện với các nguyên tắc nghiệp vụ để kiểm tra tính hợp lệ của dữ liệu nhập. + Xây dựng được ứng dụng có sử dụng cơ sở dữ liệu. + Xây dựng được ứng dụng theo mô hình 3-layer. + Lập được các báo cáo thống kê (Crystal Report). - Về năng lực tự chủ và trách nhiệm: + Cẩn thận, nghiêm túc trong nghiên cứu. + Có khả năng xem các tài liệu hướng dẫn, đọc sách. + Cẩn thận và chính xác khi làm việc với cơ sở dữ liệu. + Khả năng phân tích và xây dựng một ứng dụng thông tin quản lý trên windows. III. Nội dung môn học: 1. Nội dung tổng quát và phân bổ thời gian: KHOA CÔNG NGHỆ THÔNG TIN 6
  7. Thời gian (giờ) Số Tên chương, mục Tổn Lý Kiểm TT Thực hành g số thuyết Tra Chương 1. Windows Controls 15 10 5 1.1 Tổng quan controls 1.2 Property & layout của control 1.3 Các control thông dụng 1.4 Mouse Even handling 1 1.5 Keyboard event handing 1.6 Tổng quan ứng dụng document Interface 1.7 Single Document Interface (SDI) 1.8 Multiple Document Interface (MDI) 1.9 GUI hỗ trợ Chương 2. Tổng quan về ADO.NET 10 6 4 2.1. Tổng quan về ADO.NET 2.2. Các đối tượng trong ADO.NET 2 2.3. Đối tượng Command 2.4. Đối tượng DataAdapter 2.5. Đối tượng DataSet Chương 3. Các thành phần của DataSet 10 6 2 2 3.1. Đối tượng DataTable 3 3.2. Đối tượng DataRow, DataColumn và DataRelation Chương 4. Các điều khiển liên kết dữ liệu 10 6 4 4 4.1. ComboBox, ListBox, CheckListBox 4.2. DataGrid Chương 5. Xây dựng ứng dụng với mô hình đa tầng 15 8 5 2 5.1. Xây dựng ứng dụng với mô hình 3-layer 5.1.1. Tổ chức cây thư mục 5 5.1.2. Mô hình đa tầng 5.1.3. Xây dựng lớp xử lý lưu trữ 5.1.4. Xây dựng các lớp xử lý nghiệp vụ 5.1.5. Hiển thị dữ liệu và thao tác trên màn hình Chương 6. Crystal report 15 9 6 6.1 Crystal report 6.1.1. Tạo mới report 6.1.2. Sử dụng crystal report để hiển thị report 6 6.1.3. Tạo nguồn dữ liệu cho report từ DataSet 6.1.4. Tạo nguồn dữ liệu cho report từ nguồn CSDL 6.1.5. Lọc dữ liệu trên report 6.1.6. Truyền tham số cho report
  8. Thời gian (giờ) Số Tên chương, mục Tổn Lý Kiểm TT Thực hành g số thuyết Tra 6.1.7. Xuất report ra máy in 6.1.8. Xuất report ra tập tin 6.1.9. Đóng gói project Cộng 75 45 26 4 2. Nội dung chi tiết: Chương 1. Windows Controls Thời gian: 15 giờ Mục tiêu: - Trình bày được về chức năng và cách thức sử dụng của các điều khiển (windows controls) trong lập trình ứng dụng trên windows. - Trình bày được cách thức kết hợp sử dụng của các điều khiển trong lập trình ứng dụng trên windows. - Thiết kế một ứng dụng windows forms cho một bài toán cụ thể. Nội dung: 1.1 Tổng quan controls 1.2 Property & layout của control 1.3 Các control thông dụng 1.4 Mouse Even handling 1.5 Keyboard event handing 1.6 Tổng quan ứng dụng document Interface 1.7 Single Document Interface (SDI) 1.8 Multiple Document Interface (MDI) 1.9 GUI hỗ trợ Chương 2. Tổng quan về ADO.NET Thời gian: 10 giờ Mục tiêu: - Trình bày được các đối tượng của ADP.NET. Sử dụng được đối tượng Connection để kết nối tới nguồn dữ lieu. - Thực hiện được các thao tác trên nguồn dữ liệu bằng đối tượng Command. - Sử dụng được đối tượng DataAdapter để lấy cấu trúc và dữ liệu của các bảng trong nguồn dữ liệu. Nội dung: 2.1. Tổng quan về ADO.NET 2.2. Các độ tượng trong ADO.NET 2.3. Đối tượng Command 2.4. Đối tượng DataAdapter 2.5. Đối tượng DataSet Chương 3. Các thành phần của DataSet Thời gian: 10 giờ Mục tiêu:
  9. - Trình bày được các thành phần của đối tượng DataSet. Sử dụng được DataSet để xây dựng ứng dụng. Nội dung: 3.1. Đối tượng DataTable 3.2. Đối tượng DataRow, DataColumn và DataRelation Chương 4. Các điều khiển liên kết dữ liệu Thời gian: 10 giờ Mục tiêu: - Trình bày được các thuộc tính các điều khiển lien kết dữ liệu. - Trình bày được các phương thức của các điều khiển lien kết dữ liệu. - Sử dụng được các điều khiển để xây dựng ứng dụng Nội dung: 4.1. ComboBox, ListBox, CheckListBox 4.2. DataGrid Chương 5. Xây dựng ứng dụng với mô hình đa tầng Thời gian: 15 giờ Mục tiêu: - Trình bày được các kiến thức của mô hình đa tầng. - Sử dụng được mô hình đa tầng để xây dựng ứng dụng. Nội dung: 5.1. Xây dựng ứng dụng với mô hình 3-layer 5.1.1. Tổ chức cây thư mục 5.1.2. Mô hình đa tầng 5.1.3. Xây dựng lớp xử lý lưu trữ 5.1.4. Xây dựng các lớp xử lý nghiệp vụ 5.1.5. Hiển thị dữ liệu và thao tác trên màn hình Chương 6. Crystal report Thời gian: 15 giờ Mục tiêu: - Trình bày được các kiến thwucs về Crystal Report - Tạo được các kiểu Report - Xây dựng được ứng dụng có sử dụng Report - Đóng gói được một phần mềm. Nội dung: 6.1 Crystal report 6.1.1. Tạo mới report 6.1.2. Sử dụng crystal report để hiển thị report 6.1.3. Tạo nguồn dữ liệu cho report từ DataSet 6.1.4. Tạo nguồn dữ liệu cho report từ nguồn CSDL 6.1.5. Lọc dữ liệu trên report 6.1.6. Truyền tham số cho report 6.1.7. Xuất report ra máy in 6.1.8. Xuất report ra tập tin 6.1.9. Đóng gói project
  10. IV. Điều kiện thực hiện môn học: 1. Phòng học chuyên môn hóa/nhà xưởng: Phòng học thực hành. 2. Trang thiết bị máy móc: Máy chiếu, máy tính có phần mềm Visual Studio. 3. Học liệu, dụng cụ, nguyên vật liệu: Bảng, bút viết bảng. 4. Các điều kiện khác: máy tính có kết nối Internet. V. Nội dung và phương pháp, đánh giá: 1. Nội dung: - Kiến thức: Được đánh giá qua bài kiểm tra và thực hành cuối môn đạt được các yêu cầu sau: + Trình bày được các thành phần của một ứng dụng có lien quan đến cơ sở dữ liệu + Nhận diện được các bước cần thiết để kết nối đến cơ sở dữ liệu từ ngôn ngữ lập trình + Trình bày được các các phương pháp để tạo các biểu mẫu nhập dữ liệu thông dụng + Phương thức, thuộc tính của các đối tượng tương tác, xử lý dữ liệu trên các cơ sở dữ liệu. - Kỹ năng: Đánh giá kỹ năng thực hành của sinh viên trong các bài thực hành: + Viết và thực thi ứng dụng ADO.Net. + Xây dựng được ứng dụng có sử dụng có sử dụng cơ sở dữ liệu. + Thực hiện các thao tác xử lý dữ liệu trên cơ sở dữ liệu: thêm mới, xóa, sửa đổi, hiển thị, + Xây dựng ứng dụng với mô hình 3-layer. - Năng lực tự chủ và trách nhiệm: + Cẩn thận, tự giác, kiên trì + Chấp hình các nội quy của phòng thực hành. 2. Phương pháp: Thời gian STT Phương pháp Hình thức Số cột thi Thực hành trên máy 01 Kiểm tra thường xuyên 2 tính Thực hành trên máy 90 phút 02 Kiểm tra định kỳ 2 tính Thực hành trên máy 90 phút 03 Thi kết thúc môn học tính VI. Hướng dẫn thực hiện môn học: 1. Phạm vi áp dụng môn học: Áp dụng cho khóa học trình độ cao đẳng. 2. Hướng dẫn về phương pháp giảng dạy, học tập môn học: - Đối với giáo viên, giảng viên:
  11. + Giáo viên có thể vận dụng phương pháp thuyết trình, giảng giải kết hợp phương pháp gợi mở, phát vấn để người học nghề có thể tham gia tích cực vào bài giảng. + Phương tiện, dụng cụ giảng dạy: Ngoài phương tiện giảng dạy truyền thống giáo viên còn có thể sử dụng Máy chiếu Projector, Laptop, sơ đồ, tranh ảnh minh hoạ giúp làm rõ và sinh động nội dung bài học. + Trong điều kiện có thể kết hợp giảng dạy lý thuyết và thực hành trong cùng một phòng học chuyên môn hoá có máy tính được nối mạng LAN và mạng Internet, có sử dụng các phương tiện dạy học bằng hình ảnh. - Đối với người học: + Thực hiện đầy đủ và nghiêm túc các qui định đối với môn học và của giáo viên. + Hoàn thành đầy đủ các bài thực hành và tham dự các buổi kiểm tra trên lớp. + Kết thúc khóa học, người học sẽ làm một bài kiểm tra để xác định việc họ có hoàn thành chương trình học hay không + Học sinh tham gia đầy đủ các buổi lên lớp (không nghỉ quá 30% thời lượng học) 3. Những trọng tâm cần chú ý: - Trình độ giáo viên: ít nhất phải có bằng cử nhân hoặc bằng cấp tương đương tính theo kinh nghiệm dạy học trước đó. Có chứng chỉ dạy nghề. - Nguồn lực đào tạo: Những nguồn lực sau đây được khuyến khích sử dụng để bổ trợ những phương pháp giảng dạy đề xuất. + Cơ sở vật chất, trang thiết bị giảng dạy: Lớp học có đầy đủ máy vi tính cho học sinh thực tập. + Sách, giáo trình và tài liệu tham khảo. + Kế hoạch giảng dạy và giáo án chi tiết của giáo viên đóng vai trò tài liệu chính được sử dụng trong quá trình giảng dạy. - Phương pháp đào tạo: Giáo viên kết hợp nhiều chiến lược giảng dạy để giúp tất cả người học thuộc mọi đối tượng có những tiến bộ nhất định nào đó.
  12. CHƯƠNG 2: CHƯƠNG 1. WINDOWS CONTROLS 1.1 Tổng quan controls Control là một thành phần cơ bản trên form Có các thành phần o Thuộc tính o Phương thức o Sự kiện Tất cả các control chứa trong namespace:System.Windows.Forms Một số thuộc tính của control Text: mô tả text xuất hiện trên control Focus: phương thức chuyển focus vào control TabIndex: thứ tự của control nhận focus o Mặc định được VS.NET thiết lập Enable: thiết lập trạng thái truy cập của control Visible: ẩn control trên form, có thể dùng phương thức Hide Anchor: o Neo giữ control ở vị trí xác định o Cho phép control di chuyển theo vị trí Size: xác nhận kích thước của control 1.2 Property & layout của control Common Properties Description BackColor Màu nền của control BackgroundImage Ảnh nền của control ForeColor Màu hiển thị text trên form Enabled Xác định khi control trạng thái enable Focused Xác định khi control nhận focus Font Font hiển thị text trên control TabIndex Thứ tự tab của control TabStop Nếu true, user có thể sử dụng tab để select control Text Text hiển thị trên form TextAlign Canh lề text trên control Visible Xác định hiển thị control KHOA CÔNG NGHỆ THÔNG TIN 12
  13. CHƯƠNG 1. WINDOWS CONTROLS Khi FormBorderStyle = Sizable, form cho phép thay đổi kích thước khi Runtime o Sự bố trí của control cũng thay đổi! Sử dụng thuộc tính Anchor o Cho phép control phản ứng lại với thao tác resize của form Control có thể thay đổi vị trí tương ứng với việc resize của form Control cố định không thay đổi theo việc resize của form Các trạng thái neo Left: cố định theo biên trái Right: cố định theo biên phải Top: cố định theo biên trên Bottom: cố định theo biên dưới. KHOA CÔNG NGHỆ THÔNG TIN 13
  14. CHƯƠNG 1. WINDOWS CONTROLS Các control có thể gắn (dock) với một cạnh nào đó của form, hoặc container của control. KHOA CÔNG NGHỆ THÔNG TIN 14
  15. CHƯƠNG 1. WINDOWS CONTROLS KHOA CÔNG NGHỆ THÔNG TIN 15
  16. CHƯƠNG 1. WINDOWS CONTROLS KHOA CÔNG NGHỆ THÔNG TIN 16
  17. CHƯƠNG 1. WINDOWS CONTROLS 1.3 Các control thông dụng Label, TextBox, Button Label - Cung cấp chuỗi thông tin chỉ dẫn - Chỉ đọc - Được định nghĩa bởi lớp Label - Dẫn xuất từ Control TextBox - Thuộc lớp TextBox - Vùng cho phép user nhập dữ liệu - Cho phép nhập dạng Password Button - cho phép cài đặt 1 hành động. - Checkbox và RadioButton - Dẫn xuất từ ButtonBase Label Thuộc tính thường dùng Font Font hiển thị của text Text Nội dung text hiển thị TextAlign Canh lề text ForeColor Màu text Visible Trạng thái hiển thị TextBox Thuộc tính thường dùng Nếu true: nhấn enter tạo thành dòng mới AcceptsReturn trong chế độ multiline Nếu true: textbox ở chế độ nhiều dòng, mặc Multiline định là false PasswordChar Chỉ hiển thị ký tự đại diện cho text Nếu true: textbox hiển thị nền xám, và ko ReadOnly cho phép nhập liệu, mặc định là false ScrollBars Thanh cuộn cho chế độ multiline Event thường dùng Kích hoạt khi text bị thay đổi, trình xử lý TextChanged được khởi tạo mặc định khi kích đúp vào textbox trong màn hình design view Button Thuộc tính thường dùng Text Chuỗi hiển thị trên bề mặt button Event thường dùng KHOA CÔNG NGHỆ THÔNG TIN 17
  18. CHƯƠNG 1. WINDOWS CONTROLS Kích hoạt khi user kích vào button, khai báo mặc định khi người lập trình Click kích đúp vào button trong màn hình Design View của Form. Chỉ cho nhập số ListBox & ComboBox ListBox - Cung cấp một danh sách các item cho phép user chọn - ListBox cho phép hiển thị scroll nếu các item vượt quá vùng thể hiện của ListBox KHOA CÔNG NGHỆ THÔNG TIN 18
  19. CHƯƠNG 1. WINDOWS CONTROLS KHOA CÔNG NGHỆ THÔNG TIN 19
  20. CHƯƠNG 1. WINDOWS CONTROLS Thuộc tính Items cho phép thêm item vào ListBox ListBox hiển thị dạng Multi Column KHOA CÔNG NGHỆ THÔNG TIN 20
  21. CHƯƠNG 1. WINDOWS CONTROLS Demo ListBox Kiểm tra xem chuỗi nhập có trong list box? - Nếu có: select item đó - Ngược lại: thêm chuỗi mới vào list box Sự kiện SelectedIndexChanged ComboBox - Kết hợp TextBox với một danh sách dạng drop down - Cho phép user kích chọn item trong danh sách drop down KHOA CÔNG NGHỆ THÔNG TIN 21
  22. CHƯƠNG 1. WINDOWS CONTROLS DropDownStyle KHOA CÔNG NGHỆ THÔNG TIN 22
  23. CHƯƠNG 1. WINDOWS CONTROLS Mỗi khi kích chọn một item - hiển thị item được chọn trên MessageBox KHOA CÔNG NGHỆ THÔNG TIN 23
  24. CHƯƠNG 1. WINDOWS CONTROLS Tính năng AutoComplete ListView Dạng control phổ biến hiện thị một danh sách item - Các item có thể có các item con gọi là subitem Windows Explorer hiển thị thông tin thư mục, tập tin - Có thể hiển thị thông tin theo nhiều dạng thông qua thuộc tính View o Xem dạng chi tiết thông tin o Xem dạng icon nhỏ o Xem dạng icon lớn o Xem dạng tóm tắt Lớp ListView dẫn xuất từ System.Windows.Forms.Control KHOA CÔNG NGHỆ THÔNG TIN 24
  25. CHƯƠNG 1. WINDOWS CONTROLS Các dạng thể hiện của ListView KHOA CÔNG NGHỆ THÔNG TIN 25
  26. CHƯƠNG 1. WINDOWS CONTROLS Large Icons Mỗi item xuất hiện với 1 icon kích thước lớn và một label bên dưới Small Icons Mỗi item xuất hiện với icon nhỏ và một label bên phải KHOA CÔNG NGHỆ THÔNG TIN 26
  27. CHƯƠNG 1. WINDOWS CONTROLS List Mỗi item xuất hiện với icon nhỏ với label bên phải, item được sắp theo cột nhưng không có tiêu đề cột Tile Mỗi item xuất hiện với icon kích thước lớn, bên phải có label chứa item và subitem KHOA CÔNG NGHỆ THÔNG TIN 27
  28. CHƯƠNG 1. WINDOWS CONTROLS Detail Mỗi item xuất hiện trên một dòng, mỗi dòng có các cột chứa thông tin chi tiết List View Tạo các cột cho ListView – Details qua - Cửa sổ properties -> Columns để tạo. - Sử dụng code trong chương trình. KHOA CÔNG NGHỆ THÔNG TIN 28
  29. CHƯƠNG 1. WINDOWS CONTROLS Thêm các item vào ListView Thêm item trong màn hình thiết kế form Thêm item thông qua code Các lớp định nghĩa Item System.Windows.Forms.ListViewItem Mỗi item trong ListView có các item phụ gọi là subitem o Lớp ListViewItem.ListViewSubItem định nghĩa các subitem của ListView o Lớp ListViewSubItem là inner class của ListViewItem Minh họa thêm item qua code KHOA CÔNG NGHỆ THÔNG TIN 29
  30. CHƯƠNG 1. WINDOWS CONTROLS Sự kiện SelectedIndexChanged GroupBox, Panel & TabControl Bố trí controls trên GUI GroupBox Hiển thị một khung bao quanh một nhóm control Có thể hiển thị một tiêu đề o Thuộc tính Text KHOA CÔNG NGHỆ THÔNG TIN 30
  31. CHƯƠNG 1. WINDOWS CONTROLS Khi xóa một GroupBox thì các control chứa trong nó bị xóa theo Lớp GroupBox kế thừa từ System.Windows.Forms.Control Panel Chứa nhóm các control Không có caption Có thanh cuộn (scrollbar) o Xem nhiều control khi kích thước panel giới hạn GroupBox Mô tả Thuộc tính thường dùng Controls Danh sách control chứa trong GroupBox. Text Caption của GroupBox Panel Thuộc tính thường dùng AutoScroll Xuất hiện khi panel quá nhỏ để hiển thị hết các control, mặc định là false BorderStyle Biên của panel, mặc định là None, các tham số khác như Fixed3D, FixedSingle Controls Danh sách control chứa trong panel Minh họa GroupBox Minh họa Panel KHOA CÔNG NGHỆ THÔNG TIN 31
  32. CHƯƠNG 1. WINDOWS CONTROLS TabControl Dạng container chứa các control khác Cho phép thể hiện nhiều page trên một form duy nhất Mỗi page chứa các control tương tự như group control khác. o Mỗi page có tag chứa tên của page o Kích vào các tag để chuyển qua lại giữa các page Ý nghĩa: o Cho phép thể hiện nhiều control trên một form o Các control có cùng nhóm chức năng sẽ được tổ chức trong một tab (page) TabControl có thuộc tính TabPages Chứa các đối tượng TabPage KHOA CÔNG NGHỆ THÔNG TIN 32
  33. CHƯƠNG 1. WINDOWS CONTROLS Thuộc tính Appearance Thuộc tính, phương thức & sự kiện thường dùng KHOA CÔNG NGHỆ THÔNG TIN 33
  34. CHƯƠNG 1. WINDOWS CONTROLS Thêm/Xóa TabPage Chỉnh sửa các TabPage Chọn thuộc tính TabPages của TabControl Sử dụng màn hình TabPage Collection Editor để chỉnh sửa KHOA CÔNG NGHỆ THÔNG TIN 34
  35. CHƯƠNG 1. WINDOWS CONTROLS Bổ sung Control vào TabControl Chọn TabPage cần thêm control Kéo control từ ToolBox thả vào TabPage đã chọn Sử dụng code để thêm các TabPage vào TabControl KHOA CÔNG NGHỆ THÔNG TIN 35
  36. CHƯƠNG 1. WINDOWS CONTROLS CheckBox, CheckedListBox, RadioButton & TrackBar CheckBox Control đưa ra một giá trị cho trước và user có thể Chọn giá trị khi Checked = true Không chọn giá trị: Checked = false Lớp đại diện CheckBox ThreeState = true : cho phép thiết lập 3 trạng thái: Checkstate = Indeterminate: không xác định CheckState= Checked: chọn CheckState= Unchecked: không chọn KHOA CÔNG NGHỆ THÔNG TIN 36
  37. CHƯƠNG 1. WINDOWS CONTROLS RadioButton Cho phép user chọn một option trong số nhóm option Khi user chọn 1 option thì tự động option được chọn trước sẽ uncheck Các radio button chứa trong 1 container (form, GroupBox, Panel, TabControl) thuộc một nhóm. Lớp đại diện: RadioButton Khác với nhóm CheckBox cho phép chọn nhiều option, còn RadioButton chỉ cho chọn một trong số các option. KHOA CÔNG NGHỆ THÔNG TIN 37
  38. CHƯƠNG 1. WINDOWS CONTROLS CheckedListBox Tương tự như list box nhưng mỗi item sẽ có thêm checkbox. Thuộc tính Items lưu trữ danh sách item Có thể bổ sung vào thời điểm Design time Run time MultiColumn = true KHOA CÔNG NGHỆ THÔNG TIN 38
  39. CHƯƠNG 1. WINDOWS CONTROLS Sự kiện SelectedIndexChanged TrackBar Cho phép user thiết lập giá trị trong khoảng cố định cho trước Thao tác qua thiết bị chuột hoặc bàn phím KHOA CÔNG NGHỆ THÔNG TIN 39
  40. CHƯƠNG 1. WINDOWS CONTROLS Bổ sung Label hiển thị giá trị của TrackBar PictureBox & ImageList PictureBox Sử dụng để hiển thị ảnh dạng bitmap, metafile, icon, JPEG, GIF. Sử dụng thuộc tính Image để thiết lập ảnh lúc design hoặc runtime. KHOA CÔNG NGHỆ THÔNG TIN 40
  41. CHƯƠNG 1. WINDOWS CONTROLS Các thuộc tính Image: ảnh cần hiển thị SizeMode: o Normal o StretchImage o AutoSize o CenterImage o Zoom ImageList KHOA CÔNG NGHỆ THÔNG TIN 41
  42. CHƯƠNG 1. WINDOWS CONTROLS Demo NumericUpDown & DomainUpDown NumericUpDown Cho phép user chọn các giá trị trong khoảng xác định thông qua Nút up & down Nhập trực tiếp giá trị Các thuộc tính Minimum Maximum Value KHOA CÔNG NGHỆ THÔNG TIN 42
  43. CHƯƠNG 1. WINDOWS CONTROLS Increment Sự kiện ValueChanged Phương thức DownButton UpButton Đoạn code thêm control NumericUpDown Demo DomainUpDown KHOA CÔNG NGHỆ THÔNG TIN 43
  44. CHƯƠNG 1. WINDOWS CONTROLS Cho phép user chọn item trong số danh sách item thông qua Button Up & Down Nhập từ bàn phím Properties Items: danh sách item ReadOnly: true chỉ cho phép thay đổi giá trị qua Up & Down SelectedIndex: chỉ mục của item đang chọn SelectedItem: item đang được chọn Sorted: sắp danh sách item Text: text đang hiển thị trên DomainUpDown. Event SelectedItemChanged Nhập item cho DomainUpDown Graphic & RichText Controls DateTimePicker Cho phép chọn ngày trong khoảng xác định thông qua giao diện đồ họa dạng calendar Kết hợp ComboBox và MonthCalendar Properties Format: định dạng hiển thị KHOA CÔNG NGHỆ THÔNG TIN 44
  45. CHƯƠNG 1. WINDOWS CONTROLS o long, short, time, custom CustomFormat: o dd: hiển thị 2 con số của ngày o MM: hiển thị 2 con số của tháng o yyyy: hiển thị 4 con số của năm o (xem thêm MSDN Online) MaxDate: giá trị ngày lớn nhất MinDate: giá trị ngày nhỏ nhất Value: giá trị ngày hiện tại đang chọn Demo KHOA CÔNG NGHỆ THÔNG TIN 45
  46. CHƯƠNG 1. WINDOWS CONTROLS MonthCalendar Cho phép user chọn một ngày trong tháng hoặc nhiều ngày với ngày bắt đầu và ngày kết thúc Một số thuộc tính thông dụng MaxDate, MinDate SelectionStart: ngày bắt đầu chọn SelectionEnd: ngày kết thúc RichTextBox Chức năng mở rộng từ TextBox, có thể hiển thị text dạng rich text format (RTF) Các text có thể có các font chữ và màu sắc khác nhau. Đoạn text có thể được canh lề Có thể chứa các ảnh Ứng dụng WordPad là dạng RichTextBox KHOA CÔNG NGHỆ THÔNG TIN 46
  47. CHƯƠNG 1. WINDOWS CONTROLS 1.4 Mouse Even handling Sự kiện chuột với tham số kiểu EventArgs MouseEnter Xuất hiện khi con trỏ chuột đi vào vùng biên của control MouseLeave Xuất hiện khi con trỏ chuột rời khỏi biên của control Sự kiện chuột với tham số kiểu MouseEventArgs MouseDown/ Xuất hiện khi button được nhấn/thả và con trỏ chuột đang ở MouseUp trong vùng biên của control Xuất hiện khi chuột di chuyển và con trỏ chuột ở trong vùng MouseMove biên của control Thuộc tính của lớp MouseEventArgs Button được nhấn {Left, Right, Middle, none} có kiểu là Button MouseButtons Clicks Số lần button được nhấn X Tọa độ x của con trỏ chuột trong control Y Tọa độ y của con trỏ chuột trong control KHOA CÔNG NGHỆ THÔNG TIN 47
  48. CHƯƠNG 1. WINDOWS CONTROLS Demo thao tác: kích chuột trái tại một điểm A, giữ chuột trái và di chuyển chuột, chương trình sẽ vẽ đường thẳng từ điểm A đến vị trí hiện tại chuột. Các sự kiện cần xử lý MouseDown: Xác định điểm A ban đầu MouseMove Kiểm tra nếu Left button của chuột đang giữ o Sử dụng Graphics để vẽ đường thẳng từ A đến vị trí hiện tại Bước 1 Tạo biến lưu trữ điểm A khi user kích chuột trái Biến pA có kiểu Point là biến thành viên của Form1 KHOA CÔNG NGHỆ THÔNG TIN 48
  49. CHƯƠNG 1. WINDOWS CONTROLS Bước 2 Khai báo xử lý sự kiện MouseDown trong Form1 Trong cửa sổ event của Form1, kích đúp vào sự kiện MouseDown Bước 3 Cài đặt xử lý sự kiện MouseMove Kiểm tra nếu LeftButton được nhấn o Vẽ đường thẳng từ pA đến vị trí hiện tại 1.5 Keyboard event handing Phát sinh khi một phím được nhấn hoặc thả Có 3 sự kiện KeyPress KeyUp KeyDown KeyPress phát sinh kèm theo với mã ASCII của phím được nhấn KeyPress không cho biết trạng thái các phím bổ sung {Shift, Alt, Ctrl } Sử dụng KeyUp & KeyDown để xác định trạng thái các phím bổ sung. KHOA CÔNG NGHỆ THÔNG TIN 49
  50. CHƯƠNG 1. WINDOWS CONTROLS Sự kiện với tham số kiểu KeyEventArgs KeyDown Phát sinh khi phím được nhấn KeyUp Phát sinh khi phím được thả Sự kiện với tham số kiểu KeyPressEventArgs KeyPress Khởi tạo khi phím được nhấn Thuộc tính của lớp KeyPressEventArgs KeyChar Chứa ký tự ASCII của phím được nhấn Handled Cho biết sự kiện KeyPress có được xử lý chưa Thuộc tính của lớp KeyEventArgs Alt, Control, Shift Trạng thái các phím bổ sung Handled Cho biết sự kiện đã xử lý Trả về mã ký tự được định nghĩa trong Keys KeyCode enumeration KeyData Chứa mã ký tự với thông tin phím bổ sung Trả về số int, đây chính là mã Windows Virtual KeyValue Key Code Modifier Trả về giá trị của phím bổ sung Keys Enumeration Minh họa các sự kiện: KeyPress, KeyDown, KeyUp Khi user nhấn một phím o Bắt sự kiện KeyPress: xuất ra phím được nhấn o Bắt sự kiện KeyDown: xuất ra các tham số trong KeyEventArgs Khi user thả phím o Xóa các thông tin mô tả phím được nhấn trong các label Cách thực hiện Tạo một form minh họa Thiết kế trên form có 2 Label: o lblChar: hiển thị ký tự được nhấn trong KeyPress o lblKeyInfo: hiển thị các thông tin của KeyEventArgs khi KeyDown KHOA CÔNG NGHỆ THÔNG TIN 50
  51. CHƯƠNG 1. WINDOWS CONTROLS Bước 1: tạo Windows Form như hình mô tả Bước 2: Tạo KeyPress Event Handling cho form Bước 3: Tạo KeyDown Event Handling cho form KHOA CÔNG NGHỆ THÔNG TIN 51
  52. CHƯƠNG 1. WINDOWS CONTROLS KHOA CÔNG NGHỆ THÔNG TIN 52
  53. CHƯƠNG 1. WINDOWS CONTROLS CT Calculator (BT3) mở rộng cho phép xử lý các phím Form nhận xử lý thông điệp KeyDown Xác định các phím tương ứng rồi gọi sự kiện click của button o VD: user gõ phím 1, tương tự như button “1” được nhấn Cách thực hiện Khai báo trình xử lý sự kiện KeyDown cho Form chính Thiết lập thuộc tính KeyPreviewcho Form để nhận sự kiện bàn phím. Viết phần xử lý cho sự kiện KeyDown Xác định các phím tương ứng để gọi sự kiện click của các button. KHOA CÔNG NGHỆ THÔNG TIN 53
  54. CHƯƠNG 1. WINDOWS CONTROLS 1.6 Tổng quan ứng dụng document Interface Dạng ứng dụng làm việc với các document: Document chứa nội dung dữ liệu, được lưu trữ trên file hoặc trong CSDL. Các dạng document: Soạn thảo văn bản; Xử lý ảnh đồ họa; Bảng tính; Làm việc csdl Ứng dụng dạng DI sẽ cung cấp các chức năng Mở file (hoặc CSDL), xử lý nội dung và lưu file (hoặc CSDL) Có 2 dạng ứng dụng DI: - Single Document Interface - Multiple Document Interface 1.7 Single Document Interface (SDI) Chỉ hỗ trợ một document hoặc một cửa sổ tại một thời điểm. Dạng ứng dụng như NotePad, MS Paint với các đặc tính xử lý ảnh và văn bản giới hạn. Để làm việc với nhiều tài liệu thì phải mở các instance khác của ứng dụng. Việc quản lý ứng dụng SDI khá đơn giản KHOA CÔNG NGHỆ THÔNG TIN 54
  55. CHƯƠNG 1. WINDOWS CONTROLS 1.8 Multiple Document Interface (MDI) Ứng dụng cho phép xử lý nhiều document tại một thời điểm. Các ứng dụng hiện tại thường là dạng MDI: MS Office; MS Studio.NET; Adobe Photoshop Ứng dụng MDI thường phức tạp và chức năng xử lý đa dạng Xử lý một cùng một dạng document: MS Word, Adobe Photoshop. Xử lý nhiều dạng document: Visual Studio: code, design, KHOA CÔNG NGHỆ THÔNG TIN 55
  56. CHƯƠNG 1. WINDOWS CONTROLS MDI Parent Window – MDI Child Window KHOA CÔNG NGHỆ THÔNG TIN 56
  57. CHƯƠNG 1. WINDOWS CONTROLS Đặc điểm của MDIParent Form Được sử dụng làm cửa sổ chính cho ứng dụng. Trong một ứng dụng chỉ có một cửa sổ MDI. Các cửa sổ con bên trong MDI chỉ có thể di chuyển trong phạm vi của cửa sổ MDI chứa nó. Khi cửa sổ con bên trong MDI được maximize thì click thước cũng chỉ bằng vùng làm việc của MDI Tiêu đề của cửa sổ con được ghép với tiêu đề của cửa sổ MDI. Nếu có menu, lúc này menu của cửa sổ con sẽ thay thế menu của cửa sổ MDI. Khi cửa sổ con được minimize, biểu tượng của cửa sổ con nó nằm trong cửa sổ MDI. 1.9 GUI hỗ trợ MenuStrip Menu cung cấp nhóm lệnh có quan hệ với nhau cho các ứng dụng Windows Thuộc tính của MenuStrip, ToolStripMenuItem MenuStrip Items Chứa những top menu item MdiWindowListItem Chọn top menu item hiển thị tên các cửa sổ con ToolStripMenuItem KHOA CÔNG NGHỆ THÔNG TIN 57
  58. CHƯƠNG 1. WINDOWS CONTROLS Checked Xác định trạng thái check của menu item Index Chỉ mục menu item trong menu cha DropDownItems Chứa những menu item con ShortcutKeys Phím tắt Text Tiêu đề menu item ShowShortcutKeys Xác định trạng thái hiện thị phím tắt bên cạnh menu item ContextMenuStrip Xuất hiện khi user kích chuột phải Thông thường menu này xuất hiện tùy thuộc vào đối tượng trong vùng kích chuột phải. Trong ToolBox kéo ContextMenuStrip thả vào form Kích vào ContextMenuStrip để soạn thảo các menuitem ContextMenuStrip tạm thời thể hiện trên cùng của form Khi run thì sẽ không hiển thị cho đến khi được gọi Khai báo sử dụng Context Menu Mỗi control đều có property là: ContextMenuStrip Khai báo thuộc tính này với ContextMenuStrip Khi đó user kích chuột phải lên control thì sẽ hiển thị context Menu đã cài đặt sẵn Khai báo trình xử lý sự kiện Click cho ContextMenu Kích đúp vào menu item của Context Menu để tạo Hoặc trong cửa sổ Properties -> Event kích đúp vào sự kiện Click. ToolStrip ToolStrip là sự thay thế cho ToolBar trong các ứng dụng trước đây Vị trí thường xuất hiện là ngay bên dưới thanh menu KHOA CÔNG NGHỆ THÔNG TIN 58
  59. CHƯƠNG 1. WINDOWS CONTROLS Cung cấp các button cho phép thực hiện các chức năng thường dùng trong menu ToolStrip là dạng container cho phép chứa các control Các control này dẫn xuất từ ToolStripItem Các control bao gồm ToolStripSplitButton ToolStripDropDownbutton ToolStripLabel ToolStripProgressBar ToolStripSeparator ToolStripComboBox ToolStripTextBox Cách tạo button trên ToolStrip Kéo ToolStrip thả vào form Add ToolStripButton StatusStrip Hiển thị thông tin trạng thái của ứng dụng Nằm bên dưới cùng của Form. Các lớp liên quan StatusStrip: là container chứa control khác ToolStripStatusLabel: control có thể add vào StatusStrip KHOA CÔNG NGHỆ THÔNG TIN 59
  60. CHƯƠNG 1. WINDOWS CONTROLS KHOA CÔNG NGHỆ THÔNG TIN 60
  61. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET 2.1. Tổng quan về ADO.NET Kiến trúc của ADO.NET được mô tả như hình dưới, bao gồm hai thành phần chính: Thành phần truy cập nguồn dữ liệu và thành phần lưu trữ xử lý dữ liệu. Thành phần thứ nhất:.NET Framework Data Provider được thiết kế để thực hiện các thao tác kết nối, gửi các lệnh xử lý đến CSDL (thành phần này còn được gọi với một tên khác là lớp kết nối – Connectectivity Layer). Trong ADO.NET, có 4 đối tượng chính với các chức năng cơ bản như sau: Connection: giúp thực hiện kết nối đến các CSDL Command: giúp truy cập đến CSDL và thực hiện các phát biểu SQL hay thủ tục lưu trữ sẵn (stored procedure) của CSDL DataReader: dùng để đọc nhanh nguồn dữ liệu, chỉ được duyệt tuần tự theo chiều tiến của các record DataAdapter: dùng để chuyển dữ liệu truy vấn được cho các đối tượng lưu trữ và xử lý (DataSet, DataTable). DataAdapter chủ yếu thực hiện các thao tác như SELECT, INSERT, UPDATE, DELETE Về mặt thực chất, thành phần .NET Framework Data Provider cung cấp giao diện lập trình chung để làm việc với các nguồn dữ liệu. Mỗi nhà cung cấp 3 đặc thù sẽ đưa ra một loại data provider riêng. Dưới đây là bảng mô tả giao diện lập trình cùng với các lớp cơ bản của các data provider mà ADO.NET cung cấp sẵn: KHOA CÔNG NGHỆ THÔNG TIN 61
  62. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET Interface SQL Server Oracle Provider OLEDB Provider ODBC Provider Provider IDbConnection SqlConnection OracleConnection OledbConnection OdbcConnection IDbDataAdapter SqlDataAdapter OracleDataAdapter OledbDataAdapter OdbcDataAdapter IDbCommand SqlCommand OracleCommand OledbCommand OdbcCommand IDbDataReader SqlDataReader OracleDataReader OledbDataReader OdbcDataReader Để sử dụng data provider nào, chúng ta phải tiến hành khái báo using namspace tương ứng. Chẳng hạn, using System.Data.SqlClient; Ngoài những data provider mô tả ở bảng trên, chúng ta có thể reference đến các data provider khác không được tích hợp sẵn bởi ADO.NET trong Visual Studio .NET, chẳng hạn như data provider dùng cho MySQL, Postgre, Thành phần thứ hai trong kiến trúc ADO.NET – DataSet – được xem như là container dùng để lưu trữ đối tượng liên quan đến dữ liệu như DataTable, DataRelation, DataView. Thành phần này còn được gọi là lớp không kết nối (disconected layer). DataSet như là một CSDL thu nhỏ tại máy client, có thể chứa các đối tượng table, view, constaint, ralationship giữa các table, Tất cả dữ liệu từ nguồn dữ liệu thực sẽ được nạp vào DataSet dưới dạng các DataTable, đó là một snapshot của nguồn dữ liệu thực. Khối dữ liệu này sẽ được chỉnh sửa độc lập, sau đó nếu cần sẽ được cập nhật trở lại nguồn dữ liệu thực. Theo nguyên tắc này, chúng ta không cần duy trì kết nối liên tục một cách không cần thiết với nguồn dữ liệu thực trong suốt quá trình thao tác với nó. 2.2. Các đối tượng trong ADO.NET Mô hình Kết nối Trong mô hình kết nối của ADO.NET, có một connection hoạt động được duy trì giữa đối tượng DataReader của ứng dụng và một data source (nguồn dữ liệu). Một dòng dữ liệu (data row) được trả về từ data source mỗi khi phương thức Read của đối tượng DataReader được thực thi. Điểm quan trọng nhất của mô hình kết nối đó là dữ liệu được lấy từ tập dữ liệu (các record được trả về bởi một lệnh SQL nào đó) theo kiểu từng record một cho một lần đọc, chỉ đọc (read-only), và chỉ theo một hướng tiến (forward-only). Hình dưới đây mô tả cách sử dụng DataReader trong chế độ kết nối. KHOA CÔNG NGHỆ THÔNG TIN 62
  63. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET Các bước điển hình để làm việc với đối tượng DataReader là như sau: 1. Tạo đối tượng Connection bằng cách truyền một chuỗi Connection string cho hàm khởi dựng của nó. 2. Khởi tạo một biến chuỗi và gán cho câu lệnh SQL dựa theo dữ liệu muốn nạp về. 3. Khởi tạo một đối tượng Command từ với nội dung câu lệnh SQL đã xác định ở trên. 4. Tạo đối tượng DataReader bằng cách thực thi phương thức Command.ExecuteReader(). Đối tượng này sau đó sẽ được dùng để đọc kết quả của câu truy vấn mỗi dòng một lần. Đoạn code sau minh họa các bước trên với Data Provider SqlClient. Đoạn code sẽ đọc danh sách họ tên các sinh viên trong một bảng SinhVien của cơ sở dữ liệu và hiển thị lên một điều khiển ListBox. Chi tiết về các đối tượng DataReader, Command, Connection sẽ được đề cập chi tiết sau. Tham số được sử dụng trong phương thức ExecuteReader xác định đối tượng Connection sẽ được đóng sau khi DataReader được đóng. Mô hình Ngắt Kết nối Triết lý của mô hình Ngắt kết nối đó là: Dữ liệu được nạp – sử dụng một lệnh SQL – từ nguồn dữ liệu bên ngoài vào bộ nhớ đệm tại máy client; tập kết quả được xử lý tại máy cục bộ; mọi cập nhật sau đó sẽ được truyền từ dữ liệu trong bộ nhớ ngược trở lại nguồn dữ liệu. Mô hình được gọi là “ngắt kết nối” bởi vì đối tượng kết nối chỉ được mở đủ lâu để đọc dữ liệu từ nguồn dữ liệu và tiến hành các thao tác cập nhật. Bằng cách đưa dữ liệu về phía máy client, tài nguyên của server – chẳng hạn như thông tin dữ liệu Connection, bộ nhớ, thời gian xử lý – sẽ được giải phóng bớt. Tuy vậy, mô hình này cũng có nhược điểm về thời gian cần để nạp tập dữ liệu và bộ nhớ dùng để chứa dữ liệu tại máy client. Như hình dưới đây minh họa, các thành phần chính của mô hình ngắt kết nối đó là DataApdapter và DataSet. DataAdapter làm nhiệm vụ như là cầu nối giữa nguồn dữ liệu và DataSet, nạp dữ liệu vào các bảng của DataSet và đẩy các thay đối ngược trở lại nguồn dữ liệu. Một DataSet đóng vai trò như là một cơ sở dữ liệu quan hệ nằm trong bộ nhớ, chứa một hay nhiều DataTables, giữa các DataTable này cũng có thể có các mối quan hệ với nhau như trong một cơ sở dữ liệu quan hệ thực. Một DataTable chứa các dòng và các cột dữ liệu thường được lấy từ cơ sở dữ liệu nguồn. KHOA CÔNG NGHỆ THÔNG TIN 63
  64. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET Trong số các phương thức và thuộc tính của DataAdapter thì Fill() và Update() là hai phương thức quan trọng nhất. Fill() chuyển một query đến cơ sở dữ liệu và lưu tập kết quả trả về trong một DataTable nào đó; phương thức Update() thực hiện một thao tác thêm, xóa, cập nhật dựa trên những thay đối của đối tượng DataSet. Các lệnh cập nhật thực sự được chứa trong các thuộc tính của DataAdapter. Chi tiết về DataAdapter sẽ được đề cập ở phần sau. Để minh họa cách thức làm việc với DataAdapter và DataSet, đoạn code dưới đây giới thiệu cách tạo ra một đối tượng DataTable, nạp dữ liệu từ một cơ sở dữ liệu, và đưa nó vào một DataSet. Trong số các phương thức và thuộc tính của DataAdapter thì Fill() và Update() là hai phương thức quan trọng nhất. Fill() chuyển một query đến cơ sở dữ liệu và lưu tập kết quả trả về trong một DataTable nào đó; phương thức Update() thực hiện một thao tác thêm, xóa, cập nhật dựa trên những thay đối của đối tượng DataSet. Các lệnh cập nhật thực sự được chứa trong các thuộc tính của DataAdapter. Chi tiết về DataAdapter sẽ được đề cập ở phần sau. Để minh họa cách thức làm việc với DataAdapter và DataSet, đoạn code dưới đây giới thiệu cách tạo ra một đối tượng DataTable, nạp dữ liệu từ một cơ sở dữ liệu, và đưa nó vào một DataSet. Bước đầu tiên là tạo ra một thể hiện của SqlDataAdapter bằng cách truyền một câu lệnh SELECT và chuỗi kết nối cho phương thức khởi dựng của lớp này. DataAdapter sẽ lo đến việc tạo ra đối tượng Connection cũng như việc mở, đóng Connection khi cần thiết. Sau khi một DataSet rỗng sẽ được tạo ra, phương thức Fill() của DataAdapter sẽ tạo ra một DataTable có tên là “SinhVien” trong DataSet và nạp các dòng dữ liệu vào DataTable này (bằng câu lện SQL dạng SELECT của DataAdapter). Mỗi column của DataTable sẽ tương ứng với một column trong bảng của cơ sở dữ liệu nguồn. Dữ liệu trong bảng dữ liệu sau đó được đưa vào một ListBox bằng cách duyệt qua danh sách các dòng của DataTable. Lớp Connection Có nhiều lớp Connection trong ADO.NET – mỗi lớp tương ứng với một Data Provider – bao gồm SqlConnection, OracleConnection, OleDbConnection, OdbcConnection. Mặc dù mỗi lớp có thể gồm những đặc tính riêng, nhưng các lớp này đều phải implement interface IDbConnection. Bảng dưới đây tóm tắt các thành phần được định nghĩa bởi interface này. KHOA CÔNG NGHỆ THÔNG TIN 64
  65. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET Loại Tên Mô tả Property ConnectionString Get/Sets chuỗi kết nối đến data source. Property ConnectionTimeout Khoảng thời gian tối đa tính bằng giây để chờ thực hiện việc kết nối đến data source Property Database Tên CSDL ứng với Connection hiện tại Property State Trạng thái hiện tại của Connection. Trả về một giá trị kiểu liệt kê (enumeration): Broken, Closed, Connecting, Executing, Fetching, hoặc Open Method Open Mở một Connection. Roll back mọi thao tác đang làm Close dở. Đóng Connection – trả Connection cho Connection Pool nếu như có sử dụng Connection Pool Method BeginTransaction Khởi tạo một database transaction Method ChangeDatabase Thay đối CSDL hiện tại cho Connection đang mở. Chuỗi mô tả tên CSDL mới được truyền cho phương thức này Method CreateCommand Tạo ra một đối tượng Command ứng với Connection Connection string Thuộc tính ConnectionString xác định data source và các thông tin cần thiết để truy xuất data source, chẳng hạn như User ID và Password, Ngoài những thông tin cơ bản này, Connection string còn có thể chứa các giá trị cho các trường dữ liệu đặc trưng cho data provider. Ví dụ, Connection string cho Ms Sql Server có thể chứa các giá trị để quy định Connection Timeout và Packet Size. Dưới đây là các ví dụ về cách thành lập chuỗi kết nối cho các data provider thường gặp. Danh sách đầy đủ về cách thành lập các chuỗi kết nối được cho ở Error! Reference source not found • SqlConnection sử dụng cơ chế xác thực kiểu SQL Server: “server=(1);database=(2);uid=(3);pwd=(4)” hoặc “Data Source=(1);Initial Catalog=(2);User ID=(3);Password=(4)” • SqlConnection sử dụng cơ chế xác thực kiểu Windows: “Server=(1);Database=(2);Trusted_Connection=yes” Ở đây, (1) là tên/máy chủ chứa CSDL, (2) là tên CSDL, (3) là tên đăng nhập, (4) là mật khẩu tương ứng. Ví dụ: “server=192.168.0.1;database=qlnhanvien;uid=k28;pwd=spider ” hoặc “Server=192.168.0.1;Database=qlnhanvien;Trusted_Connection=yes” KHOA CÔNG NGHỆ THÔNG TIN 65
  66. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET 2.3. Đối tượng Command Sau khi một đối tượng connection được tạo ra, bước tiếp theo trong quá trình truy xuất CSDL – đối với mô hình Kết nối – đó là tạo ra một đối tượng Command để gửi một query (select) hay một action command (thêm, xóa, sửa) đến data source. Có nhiều loại lớp Command ứng với các data provider; các lớp này đều implement interface IDbCommand. Tạo đối tượng Command Bạn có thể dùng một trong nhiều hàm khởi dựng để tạo đối tượng Command một cách trực tiếp hoặc sử dụng cách tiếp cận ProviderFactory. Đoạn code dưới đây minh họa các tạo ra một đối tượng Command và thiết lập các thuộc tính của nó. SqlConnection conn = new SqlConnection(connstr); conn.open(); string sql = "INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES (@pMaSinhVien, @pHoTen)"; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.commandText = sql; cmd.Parameters.AddWithValue ("@pMaSinhVien", 12); cmd.Parameters.AddWithValue ("@pHoTen", "tnv spider"); Trong trường hợp ứng dụng có thể phải sử dụng nhiều data provider, bạn nên sử dụng cách tiếp cận provider factory. Factory được tạo ra bằng cách truyền chuỗi data provider cho hàm khởi dựng của nó. Tiếp đến, phương thức CreateCommand được gọi để trả về một đối tượng command. string provider = "System.Data.SqlClient"; DBProviderFactory factory = DbProviderFactories.GetFactory(provider); DbCommand cmd = factory.CreateCommand(); // DbCommand là một lớp trừu tượng cmd.CommandText = sql; // sql là một chuỗi query hay command cmd.Connection = conn; // conn là một Connection Thực thi một Command Lệnh SQL được gán trong thuộc tính CommandText của đối tượng Command sẽ được thực thi bằng một trong các phương thức được chỉ ra ở bảng dưới đây ExecuteNonQuery Thực thi truy vấn hành động (action query) và trả về số lượng dòng dữ liệu bị ảnh hưởng bởi truy vấn đó: cmd.CommandText = "DELETE SinhVien WHERE MaSinhVien=12"; int soLuong = cmd.ExecuteNonQuery(); ExecuteReader Thực thi một query và trả về đối tượng KHOA CÔNG NGHỆ THÔNG TIN 66
  67. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET DataReader để có thể truy cập tập kết quả của query đó. Phương thức này nhận một tham số tùy chọn kiểu CommandBehavior để có thể tăng hiệu năng thực thi query. cmd.CommandText = "SELECT * FROM SinhVien” + “WHERE YEAR(NgaySinh) > 1981”; ExecuteScalar Thực thi một query và trả về giá trị của cột đầu tiên trong dòng đầu tiên của tập kết quả. cmd.CommandText="SELECT COUNT(MaSinhVien) FROM SinhVien"; int soSinhVien = (int)cmd.ExecuteScalar(); ExecuteXmlReader Chỉ có cho data provider SQL Server. Trả về một đối tượng XmlReader dùng để truy xuất tập dữ liệu. Tham khảo thông tin về XmlReader trong MSDN ExecuteReader là phương thức quan trọng nhất trong các phương thức kể trên. Phương thức này trả về một đối tượng DataReader giúp truy xuất đến các dòng dữ liệu trả về bởi query. 2.4. Đối tượng DataAdapter DataAdapter là đối tượng làm trung gian lấy dữ liệu về cho DataSet, để DataSet thực hiện xử lý ngắt kết nối. Do vậy, mặc dù DataAdapter được liệt kê là đối tượng hướng kết nối nhưng thực chất nó phục vụ cho việc ngắt kết nối. Hay nói cách khác, để 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. Các đối tượng không kết nối (hay các đối tượng chứa dữ liệu) cho phép – Lưu trữ một bản sao thông tin lấy từ cơ sở dữ liệu. – Khi đã ngắt kết nối tới cơ sở dữ liệu. – Đọc các dòng theo thứ tự bất kỳ – Tìm kiếm, sắp xếp hay trích lọc các dòng một cách linh hoạt. – Tạo ra các thay đổi trên dữ liệu, sau đó đồng bộ (cập nhật) các thay đổi này vào cơ sở dữ liệu. Cầu nối giữa các lớp kết nối và các lớp không kết nối là DataAdapter DataAdapte là một bộ gồm 4 đối tượng: 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. KHOA CÔNG NGHỆ THÔNG TIN 67
  68. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET 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. 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.SqlDataAdapte 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 phương thức 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. . .: Đổ dữ liệu vào Datset cho bảng DataTable nếu chưa có sẽ tạo mới: o Fill( , ) Phương thức trả về mẫu tin lấy về được DataSet DS = New Dataset(); int so= DA.Fill(DS,”Sinhvien”) ; Để cập nhật dữ liệu về nguồn o Update( ): Cập nhật các dòng (Các đối tượng DataRow) vào nguồn dữ liệu. o 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. o Update( ): Cập nhật tất cả các thay đổi trên DataTable vào nguồn dữ liệu. o Update( , ) Cập nhật các they đổi trên bảng trong Dataset vào nguồn dữ liệu. 2.5. Đối tượng DataSet DataSet đóng vai trò của một CSDL in-memory (CSDL nằm trong bộ nhớ). Thuộc tính Tables của DataSet là một tập hợp các DataTable chứa dữ liệu và lược đồ dữ liệu (data schema) mô tả dữ liệu trong DataTable. Thuộc tính Relations chứa tập hợp các đối tượng DataRelation xác định cách thức liên kết các đối tượng DataTable của DataSet. Lớp DataSet cũng hỗ trợ việc KHOA CÔNG NGHỆ THÔNG TIN 68
  69. CHƯƠNG 2. TỔNG QUAN VỀ ADO.NET sao chép, trộn, và xóa DataSet thông qua các phương thức tương ứng là Copy, Merge, và Clear. DataSet và DataTable là phần lõi của ADO.NET và chúng không là đặc trưng của một data provider nào (giống như ở các lớp Connection, DataReader, DataAdapter). Một ứng dụng có thể định nghĩa và nạp dữ liệu từ nguồn bất kỳ (chứ không nhất thiết là từ một CSDL) vào DataSet. Bên cạnh các DataTable và các DataRelation, một DataSet còn có thể chứa các thông tin tùy biến khác được định nghĩa bởi ứng dụng. Hình dưới đây mô tả cả lớp chính trong DataSet. Trong số các thuộc tính này, chú ý thuộc tính PropertyCollection; đó là các thuộc tính được lưu trữ dưới dạng một hash table (bảng băm), thường chứa một giá trị time stamp hay các thông tin đặc tả như các yêu cầu hợp lệ hóa (validation requirements) cho column trong các DataTable trong DataSet. KHOA CÔNG NGHỆ THÔNG TIN 69
  70. CHƯƠNG 3: CÁC THÀNH PHẦN CỦA DATASET CHƯƠNG 3. CÁC THÀNH PHẦN CỦA DATASET 3.1. Đối tượng DataTable Thuộc tính DataSet.Tables chứa các đối tượng DataTable. Mỗi đối tượng trong tập hợp này có thể được truy xuất bằng chỉ số hoặc bằng tên. Các DataTable trong tập hợp DataSet.DataTables mô phỏng các Table trong CSDL quan hệ (các row, column, ). Các thuộc tính quan trọng nhất của lớp DataTable là Columns và Rows định nghĩa cấu trúc và nội dung bảng dữ liệu. 3.2. Đối tượng DataRow, DataColumn và DataRelation DataRows Dữ liệu được đưa vào table bằng cách tạo mới một đối tượng DataRow, gán giá trị cho các column của nó, sau đó bổ sung đối tượng DataRow này vào tập hợp Rows gồm các DataRow của table. DataRow row; row = tb.NewRow(); // Tạo mới DataRow row["DonGia"] = 22.95; row["SoLuong"] = 2; row["MaSo"] = 12001; tb.Rows.Add(row); // Bổ sung row vào tập Rows Console.WriteLine(tb.Rows[0]["ThanhTien"].ToString()); // 45.90 Một DataTable có các phương thức cho phép nó có thể commit hay roll back các thay đổi được tạo ra đối với table tương ứng. Để thực hiện được điều này, nó phải nắm giữ trạng thái của mỗi dòng dữ liệu bằng thuộc tính DataRow.RowState. Thuộc tính này được thiết lập bằng một trong 5 giá trị kiểu enumeration DataRowState sau: Added, Deleted, Detached, Modifed, hoặc Unchanged. Xem xét ví dụ sau: tb.Rows.Add(row); tb.AcceptChanges(); Console.Write(row.RowState); tb.Rows[0].Delete(); // Undo deletion tb.RejectChanges(); tb.RejectChanges(); Console.Write(tb.Rows[0].RowState); // Unchanged DataRow myRow; MyRow = tb.NewRow(); // Detached Hai phương thức AcceptChanges và RejectChanges của DataTable là tương đương với các thao tác commit và rollback trong một CSDL. Các phương thức này sẽ cập nhất mọi thay đổi xảy ra kể từ khi table được nạp, hoặc từ khi phương thức AcceptChanges được triệu gọi trước đó. Ở ví dụ trên, chúng ta có thể khôi phục lại dòng bị xóa do thao tác xóa là chưa được commit trước khi phương thức RejectChanges được gọi. Điều KHOA CÔNG NGHỆ THÔNG TIN 70
  71. CHƯƠNG 3: CÁC THÀNH PHẦN CỦA DATASET đáng lưu ý nhất đó là, những thay đổi được thực hiện là ở trên table chứ không phải là ở data source. ADO.NET quản lý 2 giá trị - ứng với 2 phiên bản hiện tại và nguyên gốc - cho mỗi column trong một dòng dữ liệu. Khi phương thức RejectChanges được gọi, các giá trị hiện tại sẽ được đặt khôi phục lại từ giá trị nguyên gốc. Điều ngược lại được thực hiện khi gọi phương thức AcceptChanges. Hai tập giá trị này có thể được truy xuất đồng thời thông qua các giá trị liệt kê DataRowVersion là: Current và Original: DataRow r = tb.Rows[0]; r["DonGia"]= 14.95; r.AcceptChanges(); r["DonGia"]= 16.95; Console.WriteLine("Current: {0} Original: {1} ", r["Price", DataRowVersion.Current], r["Price", DataRowVersion.Original]); Kết quả in ra: Current: 16.95 Original: 14.95 KHOA CÔNG NGHỆ THÔNG TIN 71
  72. CHƯƠNG 3: CÁC THÀNH PHẦN CỦA DATASET DataColumn Thuộc tính DataTable.Columns chứa một tập các đối tượng DataColumn biểu diễn các trường dữ liệu trong DataTable. Bảng dưới đây tóm tắt các thuộc tính quan trọng của lớp DataColumn. Phương thức Mô tả ColumnName Tên column DataType Kiểu của dữ liệu chứa trong column này Ví dụ: col1.DataType = MaxLength Độ dài tối đa của một text column. -1 nếu không xác định độ dài tối đa System.Type.GetType("System.String") ReadOnly Cho biết giá trị của column có được chỉnh sửa hay không Phương thức Mô tả AllowDBNull Giá trị Boolean cho biết column này có được chứa giá trị NULL hay không Unique Giá trị Boolean cho biết column này có được chứa các giá trị trùng nhau hay không Expression Biểu thức định nghĩa cách tính giá trị của một column Ví dụ: colTax.Expression = "colSales * .085"; Caption Tiêu đề hiển thị trong thành phần điều khiển giao diện đồ họa DataTable Tên của đối tượng DataTable chứa column này Các column của DataTable được tạo ra một cách tự động khi table được nạp dữ liệu từ kết quả của một database query hoặc từ kết quả đọc được ở một file XML. Tuy nhiên, chúng ta cũng có thể viết code để tạo động các column. Đoạn code dưới đây sẽ tạo ra một đối tượng DataTable, sau đó tạo thêm các đối tượng DataColumn, gán giá trị cho các thuộc tính của column, và bổ sung các DataColumn này vào DataTable. DataTable tb = new DataTable("DonHang"); DataColumn dCol = new DataColumn("MaSo", Type.GetType("System.Int16")); dCol.Unique = true; // Dữ liệu của các dòng ở column này không được trùng nhau dCol.AllowDBNull = false; tb.Columns.Add(dCol); dCol = new DataColumn("DonGia", Type.GetType("System.Decimal")); tb.Columns.Add(dCol); dCol = new DataColumn("SoLuong",Type.GetType("System.Int16")); tb.Columns.Add(dCol); dCol= new DataColumn("ThanhTien",Type.GetType("System.Decimal")); dCol.Expression= "SoLuong*DonGia"; tb.Columns.Add(dCol); // Liệt kê danh sách các Column trong DataTable foreach (DataColumn dc in tb.Columns) { Console.WriteLine(dc.ColumnName); Console.WriteLine(dc.DataType.ToString()); } KHOA CÔNG NGHỆ THÔNG TIN 72
  73. CHƯƠNG 3: CÁC THÀNH PHẦN CỦA DATASET Để ý rằng column MaSo được định nghĩa để chứa các giá trị duy nhất. Ràng buộc này giúp cho column này có thể được dùng như là trường khóa để thiết lập relationship kiểu parent-child với một bảng khác trong DataSet. Để mô tả, khóa phải là duy nhất – như trong trường hợp này – hoặc được định nghĩa như là một primary key của bảng. Ví dụ dưới đây mô tả cách xác định primary key của bảng: DataColumn[] col = {tb.Columns["MaSo"]}; tb.PrimaryKey = col; Nếu một primary key chứa nhiều hơn 1 column – chẳng hạn như HoDem và Ten – bạn có thể tạo ra một ràng buộc unique constraint trên các như ví dụ dưới đây: DataColumn[] cols = {tb.Columns["HoDem"], tb.Columns["Ten"]}; tb.Constraints.Add(new UniqueConstraint("keyHoVaTen", cols)); Chúng ta sẽ xem xét cách thức tạo relationship cho các bảng và trộn dữ liệu ở phần tiếp theo. DataRelation Tạo DataRelation: Khi bạn thêm các table vào DataSet thì giữa chúng chưa có relation nào. Để tạo ra một relation, bạn sử dụng property Relations của DataSet để thêm vào các đối tượng DataRelation. Ví dụ sau tạo ra một relation giữa hai table Group, User trong DataSet thông qua cột GroupID trong mỗi table với tên relation mà tôi đặt là Group_User. DataSet dataSet = LoadData(); DataTable userTable = dataSet.Tables["User"]; DataTable groupTable = dataSet.Tables["Group"]; DataRelation relation=new DataRelation("Group_User", groupTable.Columns["GroupID"], userTable.Columns["GroupID"]); dataSet.Relations.Add(relation); Phương thức GetChildRows(): Sau khi có relation, ta có thể dùng phương thức instance DataRow.GetChildRows() để lấy về một mảng các DataRow trong bảng con của bảng hiện tại. DataRow[] groupRows = groupTable.Select("GroupID='1'"); KHOA CÔNG NGHỆ THÔNG TIN 73
  74. CHƯƠNG 3: CÁC THÀNH PHẦN CỦA DATASET DataRow[] memberRows = groupRows[0].GetChildRows("Group_User"); foreach (var row in memberRows) Console.WriteLine(row["UserName"]); Output: Adon Balrog Bison Cammy ChunLi Dan DeeJay Dòng lệnh đầu tiên của đoạn mã trên lấy về một mảng DataRow bằng phương thức DataTable.Select(string filterExpression) với tham số là một câu lệnh lọc (giống biểu thức sau từ khóa “where” trong SQL). Dựa vào dữ liệu, ta biết mảng này thực chất chỉ chứa một phần tử, chính vì thế ta lấy phần tử đầu tiên của mảng groupRows và gọi phương thức GetChildRows(string relationName). Và kết quả in ra màn hình sẽ là những user nằm trong GroupID là 1, tức là “Member”. Phương thức GetParentRow(): Ngược với GetChildRows(), phương thức GetParentRow() trả về một DataRow từ bảng cha của bảng hiện tại dựa vào relation giữa chúng. Ví dụ sau cho thấy GroupName của user có UserID là “8”: DataRow[] childRows = userTable.Select("UserID='8'"); DataRow parentRow = childRows[0].GetParentRow("Group_User"); Console.WriteLine(parentRow["GroupName"]); Output: Admin Primary Key trong DataTable KHOA CÔNG NGHỆ THÔNG TIN 74
  75. CHƯƠNG 3: CÁC THÀNH PHẦN CỦA DATASET DataTable có thể dùng một hoặc nhiều DataColumn để tạo ra một Primary Key. Primary Key là định danh phân biệt các DataRow và tránh trùng lặp dữ liệu. Dựa vào PrimaryKey, bạn mới có thể dùng phương thức Find() của DataRowCollection. Đoạn code bên dưới sẽ tìm và trả về dòng dữ liệu với UserID là “1” trong table User: DataColumn[] primaryKeys=new DataColumn[] { table.Columns["UserID"] }; table.PrimaryKey = primaryKeys; DataRow row = table.Rows.Find("1"); Console.WriteLine(row["UserName"]); // Ouput: Adon Data Constraint trong DataTable Constraint là các “luật lệ” mà bạn có thể đặt cho DataColumn nhằm hạn chế và đảm bảo một vài quy tắc nào đó. Có hai loại constraint mà bạn có thể sử dụng: – UniqueConstraint: Các giá trị của cột phải là unique (duy nhất). – ForeignKeyConstraint: Duy trì liên kết giữa các DataTable trong DataSet. Hai lớp này đều thừa kế từ lớp abstract Constraint: UniqueConstraint: DataTable userTable = dataSet.Tables["User"]; Constraint constraint=new UniqueConstraint(userTable.Columns["UserID"],true); userTable.Constraints.Add(constraint); Ví dụ trên sẽ tạo constraint cho cột UserID của table User. Tham số thứ hai của constructor UniqueConstraint chỉ ra cột được sử dụng có phải là primary key không. Vì tôi đặt là true, cột UserID này sẽ trở thành primary key của table này. Bạn có thể đặt thêm UniqueConstraint này cho bất kì cột nào muốn bảo đảm giữ liệu không trùng nhau. Việc đặt constraint như trên tương đương với việc bạn gán property DataColumn.Unique = true. Và với tham số true để xác định primary key thì tương đương với việc bạn đặt DataTable.PrimaryKey như trong phần trên. KHOA CÔNG NGHỆ THÔNG TIN 75
  76. CHƯƠNG 3: CÁC THÀNH PHẦN CỦA DATASET Để xem DataTable có các constraint nào, bạn chỉ cần lặp qua các phần tử trong collection DataTable.Constraint. ForeignKeyConstraint Constraint này được dùng để tạo relation giữa hai cột thuộc hai table (tạo foreign key cho bảng). ForeignKeyConstraint phải được thêm vào table con vì đây là table chứa foreign key . Ví dụ ta tạo constraint này cho cột GroupID của hai table Group và User: DataColumn parent = dataSet.Tables["Group"].Columns["GroupID"]; DataColumn child = dataSet.Tables["User"].Columns["GroupID"]; ForeignKeyConstraint constraint = new ForeignKeyConstraint("FK_Group_User", parent, child); constraint.UpdateRule = Rule.Cascade; constraint.DeleteRule = Rule.SetNull; dataSet.Tables["User"].Constraints.Add(constraint); Sau khi đặt constraint này, nếu thử thêm một user có GroupID không nằm trong table Group, bạn sẽ nhận được một exception “InvalidConstraintException” dataSet.Tables[“User”].Rows.Add(13, “Test”, 999); InvalidConstraintException: ForeignKeyConstraint FK_Group_User requires the child key values (99) to exist in the parent table. Một điểm chú ý là constraint này không tương đương với việc bạn đặt relation trong DataSet. Vì vậy bạn không thể dùng các phương thức GetChildRows(), GetParentRow(). Enum Rule Enum này có bốn giá trị mà bạn có thể sử dụng, theo mô tả dưới đây. Rule setting Description Cascade Delete or update related rows. SetNull Set values in related rows to DBNull. SetDefault Set values in related rows to the default value. KHOA CÔNG NGHỆ THÔNG TIN 76
  77. CHƯƠNG 3: CÁC THÀNH PHẦN CỦA DATASET None Take no action on related rows. This is the default. Như ví dụ trên, thuộc tính UpdateRule của constraint được đặt mặc định là Rule.Cascade để nếu có thay đổi từ table cha, các dòng tương ứng trong table con sẽ tự động cập nhật lại. Hoặc các dòng dữ liệu tương ứng trong table con sẽ bị xóa nếu như table cha xóa một dòng dữ liệu. Bạn thử sửa GroupID đầu tiên của table Group từ 1 thành 9. Sau đó kiểm tra lại table User xem các dòng có GroupID ban đầu là 1 có chuyển thành 9 không: dataSet.Tables["Group"].Rows[0]["GroupID"] = 9; foreach(DataRow row in dataSet.Tables["User"].Select("GroupID='9'")) Console.WriteLine(row["UserName"]); Output: Adon Balrog Bison Cammy ChunLi Dan DeeJay Luật thứ hai DeleteRule = Rule.SetNull để quy định rằng nếu dữ liệu bên table cha bị xóa, các dòng tương ứng trong table con sẽ được gán bằng DBNull. KHOA CÔNG NGHỆ THÔNG TIN 77
  78. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU 4.1. ComboBox, ListBox, CheckListBox ComboBox Một ComboBox hiển thị như một Textbox kết hợp với một Listbox, cho phép người dùng lựa chọn các mục từ danh sách hoặc nhập một giá trị mới. THUỘC TÍNH CỦA COMBOBOX ComboBox cũng có các thuộc tính giống như các Control cơ bản khác. Nhưng có thêm các thuộc tính mới dạng DropDown như DropDownStyle, DropDownWidth, MaxDropDownItems KHOA CÔNG NGHỆ THÔNG TIN 78
  79. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Thuộc tính cơ bản của Control - DropDownStyle: Thuộc tính DropDownStyle xác định các mà danh sách được hiển thị. Thuộc tính DropDownStyle cũng xác định xem phần văn bản có thể được chỉnh sửa hay không. KHOA CÔNG NGHỆ THÔNG TIN 79
  80. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Với: - Simple: hiện ngay list item có sẵn. - DropDownList: là danh sách hiện ra cố định, không thể tự nhập/chỉnh sửa item trong ComboBox. - DropDown: có thể thêm item mới bằng tay và chỉnh sửa Item đã chọn. Các bạn hãy thử chỉnh sửa các thứ này ngay trong code của mình: Vd: comboBox1.DropDownStyle = ComboBoxStyle.DropDown; - MaxDropDownItems: Xác định số lượng Item tối đa khi mở danh sách sẽ hiện ra cho các bạn PHƯƠNG THỨC CỦA COMBOBOX Phương thức thường thấy nhất là các phương thức thêm/xóa/sửa dữ liệu trong ComboBox. Để thêm vào ta dùng phương thức Add, để xóa tất cả Item đã thêm ta dùng phương thức Clear, để xóa item cụ thể ta dùng phương thức Remove, //Thêm dữ liệu comboBox1.Items.Add("IceTea Việt"); comboBox1.Items.Add("Lập trình cuộc sống"); comboBox1.Items.Add("Xe đạp"); //Xóa dữ liệu cụ thể bằng chính Text của dữ liệu đó comboBox1.Items.Remove("Xe đạp"); //Ta cũng có thể xóa theo chỉ số của item đó trong List dữ liệu comboBox1.Items.RemoveAt(2); //Xóa item thứ 3 trong dữ liệu, vì 2 là index LẤY DỮ LIỆU TỪ COMBOBOX: Có thể lấy dữ liệu băng nhiều cách, tham khảo đoạn code sau //Lấy trực tiếp từ thuộc tính Text của ComboBox //Nhưng nếu ComboBox chưa được chọn thì sẽ không có giá trị string var; var = comboBox1.Text; //Lấy giá trị qua thuộc tính SelectedItem var item = this.comboBox1.GetItemText(this.comboBox1.SelectedItem); //Hoặc lấy theo Text mình muốn var item = this.comboBox1.GetItemText(this.comboBox1.FindStringExact("Xe đạp")); SỰ KIỆN CỦA COMBOBOX Sự kiện của ComboBox không nhiều, sự kiện mặc định của nó là comboBox_SelectedIndexChanged, xảy ra khi chúng ta chọn một Item mới trong ComboBox. Bài viết về ComboBox mình đến đây là dài đối với các bạn rồi, mình còn một sô vấn KHOA CÔNG NGHỆ THÔNG TIN 80
  81. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU đề muốn nói về ComboBox nữa, thôi thì để bài sau vậy. Như thường lệ là một đoạn code để các bạn đoán kết quá. Đoạn này có vẻ dễ nhỉ :D private void Form1_Load(object sender, EventArgs e) { comboBox1.Items.Add("weekdays"); comboBox1.Items.Add("year"); } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { comboBox2.Items.Clear(); if (comboBox1.SelectedItem == "weekdays") { comboBox2.Items.Add("Sunday"); comboBox2.Items.Add("Monday"); comboBox2.Items.Add("Tuesday"); } else if (comboBox1.SelectedItem == "year") { comboBox2.Items.Add("2012"); comboBox2.Items.Add("2013"); comboBox2.Items.Add("2014"); } } Bằng cách kết hợp Textbox và một danh sách drop-down thông thường, Combobox đại diện cho một control thực sự hữu ích, một hybrid widget trong C# Winform. Nó cũng tạo ra ý tưởng về các hộp thoại dialogs, nơi mà sẽ có các gợi ý cho người dùng từ danh sách drop-down và lại chấp nhận được tất cả giá trị input bất kì ListBox Điều khiển ListBox dùng để hiển thị một danh sách các giá trị và người dùng có thể thao tác trên các phần tử của danh sách như: Thêm, xóa, chọn, tìm kiếm, * Các thuộc tính thường dùng: Tên thuộc tính Diễn giải Name Tiền tố là lst Enabled Kích hoạt hoặc làm mờ điều khiển Quy định dũ liệu nguồn khi truy DataSource xuất CSDL SelectedValue Trả về giá trị đang chọn SelectedItem Trả về phần tử đang chọn SelectedItems Trả về các phần tử đang chọn KHOA CÔNG NGHỆ THÔNG TIN 81
  82. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU SelectedIndex Trả về vị trí phần tử đang chọn SelectedMod Lựa chọn phần tử trong danh sách Locked Khóa điều khiển ở chế độ thiết kế Visible Hiển thị hoặc ẩn ListBox MultiColumn Tùy chọn hiển thị nhiều cột * Tìm hiểu về tập hợp Items: Add: Thêm 1 phần tử vào danh sách, sử dụng phương thức: Items.Add Count: Trả về số mục (Item) có trong danh sách: Items.Count; Remove: Xóa đối tượng Item tại ra khỏi danh sách: Items.Remove( ); Trong trường hợp các đối tượng Item là kiểu chuỗi, ta truyền vào một chuỗi để xóa. Nếu có nhiều giá trị giống nhau trong danh sách, chỉ có mục chọn đầu tiên bị xóa. RemoveAt: Xóa một item tại vị trí index ra khỏi danh sách: Items.RemoveAt( ); Clear: Xóa tất cả những Item có trong danh sách: Items.Clear(). Contains(value): kiểm tra phần tử có trong danh sách không. * Một số sự kiện quan trọng tác động đến điều khiển ListBox: Thay đổi vị trí phần tử đang chọn qua thuộc SelectedIndexChanged tính SelectedIndex hoặc SelectedItem Thay đổi giá trị phần tử SelectedValueChanged đang chọn Điều khiển nhận được Focus tập trung Điểm làm việc được rời LosFocus khỏi điều khiển * Ví dụ: Thiết kế Form cho yêu cầu mượn sách Bước 1: Tạo form design KHOA CÔNG NGHỆ THÔNG TIN 82
  83. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Bước 2: Nhấn double vào Program.cs góc phải màn hình như dưới: Sau đó sẽ hiển thị ra tab mới, khi đó bạn có thể chạy chương trình Bước 3: Viết code thêm, xóa, chọn, chọn nhiều, hủy, hủy nhiều và thoát. KHOA CÔNG NGHỆ THÔNG TIN 83
  84. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Thêm Chọn Chọn nhiều KHOA CÔNG NGHỆ THÔNG TIN 84
  85. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Hủy KHOA CÔNG NGHỆ THÔNG TIN 85
  86. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Hủy nhiều Xóa KHOA CÔNG NGHỆ THÔNG TIN 86
  87. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Thoát KHOA CÔNG NGHỆ THÔNG TIN 87
  88. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU CheckListBox Điều khiển CheckedListBox cung cấp cho bạn tất cả khả năng của hộp danh sách và cũng cho phép bạn hiển thị check mark bên cạnh các mục trong hộp danh sách. Người dùng có thể đặt dấu kiểm theo một hoặc nhiều mục và các mục đã kiểm tra có thể được điều hướng bằng CheckedListBox.CheckedItemCollection và CheckedListBox.CheckedIndexCollection . Checkedlistbox add items public int Add (object item, bool isChecked); Bạn có thể thêm từng mục vào danh sách bằng phương pháp Thêm . Đối tượng CheckedListBox hỗ trợ ba trạng thái thông qua kiểu liệt kê CheckState: Đã kiểm tra, Không xác định và Không kiểm tra. checkedListBox1.Items.Add("Sunday", CheckState.Checked); checkedListBox1.Items.Add("Monday", CheckState.Unchecked); checkedListBox1.Items.Add("Tuesday", CheckState.Indeterminate); Nếu bạn muốn thêm đối tượng vào danh sách tại thời điểm chạy, hãy gán một mảng tham chiếu đối tượng bằng phương thức AddRange . Sau đó, danh sách sẽ hiển thị giá trị chuỗi mặc định cho mỗi đối tượng. string[] days = new[] { "Sunday", "Monday", "Tuesday" }; checkedListBox1.Items.AddRange(days); KHOA CÔNG NGHỆ THÔNG TIN 88
  89. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Theo mặc định, các mục trong hộp kiểm đã được bỏ chọn . Kiểm tra tất cả các mục trong Hộp kiểm tra Nếu bạn muốn kiểm tra một mục trong Checkedlistbox, bạn cần gọi SetItemChecked với mục có liên quan. public void SetItemChecked (int index, bool value); Thông số index (Int32) - Chỉ mục của mục để đặt trạng thái kiểm tra. value (Boolean) - true để đặt mục là đã chọn; ngược lại, sai. Nếu bạn muốn đặt tất cả các mục trong CheckedListBox thành được chọn, hãy thay đổi giá trị của phương thức SetItemChecked thành true. string[] days = new[] { "Sunday", "Monday", "Tuesday" }; checkedListBox1.Items.AddRange(days); for (int i = 0; i < checkedListBox1.Items.Count; i++) { checkedListBox1.SetItemChecked(i, true); } KHOA CÔNG NGHỆ THÔNG TIN 89
  90. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Bỏ chọn tất cả các mục trong Hộp kiểm tra Nếu bạn muốn đặt tất cả các mục trong CheckedListBox thành bỏ chọn, hãy thay đổi giá trị của phương thức SetItemChecked thành false. checkedListBox1.Items.Add("Sunday", CheckState.Checked); checkedListBox1.Items.Add("Monday", CheckState.Checked); checkedListBox1.Items.Add("Tuesday", CheckState.Checked); for (int i = 0; i < checkedListBox1.Items.Count; i++) { checkedListBox1.SetItemChecked(i, false); } CheckedListBox DataSource Ví dụ sau cho thấy cách liên kết một Nguồn dữ liệu với CheckedListBox DataTable dt = new DataTable(); DataColumn dc = new DataColumn("StringType", typeof(String)); dt.Columns.Add(dc); KHOA CÔNG NGHỆ THÔNG TIN 90
  91. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU DataRow dr = dt.NewRow(); dr[0] = "Item_1"; dt.Rows.Add(dr); this.checkedListBox1.DataSource = dt; this.checkedListBox1.DisplayMember = "StringType"; Làm thế nào để nhận giá trị của mục đã kiểm tra từ CheckedListBox? public System.Windows.Forms.CheckedListBox.ObjectCollection Items { get; } Ví dụ sau đây sử dụng thuộc tính Items để lấy CheckedListBox.ObjectCollection để lấy chỉ mục của một mục bằng phương thức ListBox.ObjectCollection.IndexOf. private void button1_Click_1(object sender, EventArgs e) { foreach (int indexChecked in checkedListBox1.CheckedIndices) { // The indexChecked variable contains the index of the item. MessageBox.Show("Index: " + indexChecked.ToString() + ", is checked. Checked state is:" + checkedListBox1.GetItemCheckState(indexChecked).ToString() + "."); } } KHOA CÔNG NGHỆ THÔNG TIN 91
  92. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU 4.2. DataGrid 1. Control DataGridView Là control được tổ chức dưới dạng bảng với các cột dọc (column) và hàng ngang (row), trên đầu mỗi cột có tên cột. DataGridView hữu ích trong trường hợp xuất dữ liệu có cấu trúc mảng 2 chiều, bảng dữ liệu, lưu trữ thống kê, database 2. Xử lý cột (Column) trong DataGridView Khi vừa khởi tạo từ ToolBox, DataGridView là bảng trống không có dòng và cột, trước tiên ta cần phải tạo cột, sau đó mới có thể thêm dữ liệu vào theo từng hàng. Đầu tiên ta sẽ tìm hiểu cách xử lý cột trong giao diện kéo thả của Visual Studio và sau đó là xử lý trên Code. Đầu tiên ta nhấm vào mũi tên nhỏ ở góc phải phía trên của control để xuất hiện bảng DataGridView Task, tại đây ta có thể thêm cột và thiết lập tùy chỉnh cho các cột đó. Thêm cột tại Add Column và chỉnh sửa cột tại Edit Column. Các checkbox bên dưới thiết lập cho phép (hoặc không) thêm, bớt, chỉnh sửa, xóa dữ liệu trên DataGridView trong quá trình chạy ứng dụng. Nhìn vào bảng Edit Column bên dưới ta thấy trình quản lý các column, tại đây ta có thể thay đổi tên, text hiển thị đầu dòng và một số tùy chỉnh layout tại nhóm chức năng Layout Control DataGridView trong Lập trình Windows Form C# 3. Xử lý cột trong Code. Bên dưới là cách thêm cột cho DataGridView. Trong ví dụ ta cần thêm 3 cột nên lần lượt tạo 3 đối tượng DataGridViewTextBoxColumn và thứ tự thiết lập thuộc tính cho mỗi cột và cuối cùng thông qua phương thức AddRange để Add các cột vào DataGridView. Trong ví dụ trên ta thấy còn có 1 cột nhỏ bên trái DataGridView, để ẩn cột này ta thiết lập giá trị False cho thuộc tính RowHeaderVisible. Control DataGridView trong Lập trình Windows Form C# 4. Thêm dữ liệu cho DataGridView Thông qua phương thức Rows.Add() ta có thể dễ dàng thêm dữ liệu cho DataGridView. Ta thấy DataGridView có 3 cột nên đối số của phương thức Rows.Add() cần có 3 chuỗi, nếu ít hơn thì những vị trí sau sẽ bị chừa trống. Control DataGridView trong Lập trình Windows Form C# 5. Truy xuất dữ liệu trong DataGridView DataGridView tổ chức dữ liệu giống như 1 mảng 2 chiều thông thường, ta có thể thiết lập và truy xuất dữ liệu dễ dàng thông qua chỉ số hàng và cột. Bên dưới ta tiến hành lấy dữ liệu trong DataGridView thông qua các chỉ số hàng, cột đưa vào ở các TextBox. Lưu ý: dữ liệu trong các Cell (ô) lưu trữ dưới kiểu string. Việc gán dữ liệu vào bảng cũng tiến hành tương tự. Control DataGridView trong Lập trình Windows Form C# 6. Event Cell Click Với sự kiện này sẽ trả về cho chúng ta vị trí của cell đang được chọn, từ đó ta có thể dễ dàng lấy được dữ liệu trong cell. Ở đây ta có thêm vào phần xử lý dữ liệu với KHOA CÔNG NGHỆ THÔNG TIN 92
  93. CHƯƠNG 4. CÁC ĐIỀU KHIỂN LIÊN KẾT DỮ LIỆU Clipboard. Khi có thao tác click vào 1 cell bất kỳ thì dữ liệu trong nó sẽ được copy vào bộ nhớ đệm, sau đó từ bộ nhớ đệm sẽ đổ dữ liệu vào label để hiển thị giá trị. KHOA CÔNG NGHỆ THÔNG TIN 93
  94. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG 5.1. Xây dựng ứng dụng với mô hình 3-layer C# – Mô hình 3 lớp đơn giản Đối với lập trình hiện đại, mọi thứ đều đi nhiều lớp, tương tự như C#, cũng có cả mô hình 3 lớp để chúng ta thực thi áp dụng. Ở C# chúng ta gọi là mô hình 3 lớp aka 3 Layers. Nó khá là nổi tiếng với sinh viên VN đang học C# (một số trường sẽ là Lập trình .NET, lập trình C#, lập trình ứng dụng) Cấu tạo của C# – Mô hình 3 lớp đơn giản: Gồm 3 lớp, đó là: GUI Layer: Lớp này là lớp hiển thị giao diện và các chức năng để người dùng cuối sử dụng. Business (BUS) Layer: Đây là lớp nhận các yêu cầu từ lớp GUI và truy xuất lên lớp Data để lấy thông tin và trả về GUI. Data Access Layer: Lớp này là lớp để truy xuất với CSDL, chỉ duy nhất lớp này được làm việc với database. (Ko cần thiết) DTO Layer: Lớp này chỉ là phụ thôi, đây là lớp định nghĩa các table trong database của bạn, định nghĩa cột của nó cũng như để ta gán data khi query lấy dữ liệu. Các bạn có thể hiểu nôm na là 1 dạng cơ bản ORM (Object Relation Mapping). Đây là cách hoạt động của mô hình 3 lớp: Nhìn sơ qua thì nó khá là giống MVC bên web nhỉ? Business như là Controller :D, GUI là View và Data Access là Model. Lợi thế của mô hình 3 lớp: KHOA CÔNG NGHỆ THÔNG TIN 94
  95. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG Phân loại rõ ràng các lớp có các nhiệm vụ khác nhau. Từ đó ta có thể quản lý và maintain project tốt hơn. Dễ dàng phân loại các hành động tại Business. Dễ dàng phân loại các hàm truy xuất tại Database, phân loại hàm theo table, Ứng dụng được cho các project lớn ở bên ngoài. Lưu ý khi xây dựng mô hình 3 lớp: Cần một solution riêng cho project. Cần 3 project khác nhau để làm nên 3 lớp, tên Project đặt như sau: Lớp GUI: GUI_* (VD: GUI_QuanLy) Lớp Business: BUS_* (VD: BUS_QuanLy) Lớp Data Access: DAL_* (VD: DAL_QuanLy) Lớp DTO: DTO_* (VD: DTO_QuanLy) Bên trong 3 lớp như trên các file đặt cần có các tiền tố như sau: Ví dụ mình có một table tên là ThanhVien Lớp GUI: GUI_* (VD: GUI_ThanhVien) Lớp Business: BUS_* (VD: GUI_ThanhVien) Lớp Data Access: DAL_* (VD: GUI_ThanhVien) Lớp DTO: DTO_* (VD: DTO_ThanhVien) C# – Mô hình 3 lớp đơn giản: Liên kết 3 lớp GUI liên kết tới dc Business Layer và DTO. Business Layer liên kết tới được Data Access và DTO. Data Access chỉ liên kết tới DTO 5.1.1. Tổ chức cây thư mục 1. Presentation Layer (GUI): Có hai thành phần chính sau đây với những tác vụ cụ thể : UI Components : gồm các thành phần tạo nên giao diện của ứng dụng (GUI). Chúng chịu trách nhiệm thu nhận và hiển thị dữ liệu cho người dùng Ví dụ : textbox, button, combobox, UI Process Components : là thành phần chịu trách nhiệm quản lý các quá trình chuyển đổi giữa các UI Ví dụ : Sắp xếp quá trình kiểm tra thông tin khách hàng: KHOA CÔNG NGHỆ THÔNG TIN 95
  96. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG 1.Hiển thị màn hình tra cứu ID 2.Hiển thị màn hình thông tin chi tiết khách hàng tương ứng 3.Hiển thị màn hình liên lạc với khách hàng. 2. Bussiness Layer (BLL) : Lớp này gồm 4 thành phần: Service Interface : là thành phần giao diện lập trình mà lớp này cung cấp cho lớp Presentation sử dụng. Bussiness Workflows : chịu trách nhiệm xác định và điều phối các quy trình nghiệp vụ gồm nhiều bước và kéo dài. Những quy trình này phải được sắp xếp và thực hiện theo một thứ tự chính xác. Ví dụ : Thực hiện mua một đơn hàng trên tiki qua nhiều bước : kiểm tra gói hàng còn không?, tính tổng chi phí, cho phép giao dịch và sắp xếp việc giao hàng. Bussiness Components : chịu trách nhiệm kiểm tra các quy tắc nghiệp vụ, ràng buộc logic và thực hiện các công việc . Các thành phần này cũng thực hiện các dịch vụ mà Service Interface cung cấp và Business Workflows sẽ sử dụng nó. Ví dụ : Tiếp tục ví dụ ở trên. Bạn sẽ cần một Bussiness Component để kiểm tra gói hàng có khả dụng không ? hay một component để tính tổng chi phí, Bussiness Entities : thường được sử dụng như Data Transfer Objects ( DTO ) . Bạn có thể sử dụng để truyền dữ liệu giữa các lớp (Presentation và Data Layer). Chúng thường là cấu trúc dữ liệu ( DataSets, XML, ) hay các lớp đối tượng đã được tùy chỉnh. Ví dụ : tạo 1 class Student lưu trữ các dữ liệu về tên, ngày sinh, ID, lớp. 3. Data Layer (DAL) : KHOA CÔNG NGHỆ THÔNG TIN 96
  97. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG Data Access Logic Components : chịu trách nhiệm chính lưu trữ và truy xuất dữ liệu từ các nguồn dữ liệu (Data Sources) như XML, file system, Hơn nữa còn tạo thuận lợi cho việc dễ cấu hình và bảo trì. Service Agents : giúp bạn gọi và tương tác với các dịch vụ từ bên ngoài một cách dễ dàng và đơn giản. 5.1.2. Mô hình đa tầng N-Tier Architecture? Kiến trúc N-tier còn được gọi là multi-tier architecture, một phương pháp kiến trúc ứng dụng trong phát triển phần mềm. Nó thích hợp cho việc xây dựng các ứng dụng lớn, đặc biệt là các ứng dụng doanh nghiệp, các ứng dụng đòi hỏi tính scalability, security, fault tolerance, reusability và maintainability. Gọi là N-tier điều đó có nghĩa kiến trúc này có thể có 1, 2, 3 hoặc hơn số các layer phụ thuộc vào cách phân chia kiến trúc hệ thống. Tuy nhiên 3-Tier vẫn là mẫu phổ biến nhất và được định nghĩa cụ thể về trách nhiệm từng tier như sau: Tầng Presentation: Chính là Giao diện người dùng, đây chính là phần mềm ứng dụng mà người dùng sẽ thấy và tương tác (Có thể là Website hoặc Mobile App, hoặc Window app). Khi người dùng nhập thông tin họ cần. Hành động người dùng được xử lí đi qua các tầng Logic, tầng Data. Tầng Logic: Đây là tầng chứa tất cả những phương pháp xử lý, đọc & ghi dữ liệu trước khi đưa đến UI người dùng, nó những gì được cho phép trong ứng dụng của bạn. KHOA CÔNG NGHỆ THÔNG TIN 97
  98. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG Tầng Data: Tầng Data là nơi lưu trữ tất cả dữ liệu trong ứng dụng, tại tầng này bạn thực hiện các phương thức lưu trữ dữ liệu vào DB, triển khai các giải pháp bảo mật, transaction cần thiết. 5.1.3. Xây dựng lớp xử lý lưu trữ Tại sao mình lại xây dựng Data Access trước? Đơn giản là đây là lớp mà ta xử lý bên database, làm trước thì design GUI xong chỉ việc bỏ vào sử dụng thôi Điều quan trọng đầu tiên, chúng ta cần tạo class DBConnect.cs với nội dung như sau: using System.Data.SqlClient; namespace DAL_QuanLy { public class DBConnect { protected SqlConnection _conn = new SqlConnection("Data Source=ADMINISTRATOR\SQLEXPRESS;Initial Catalog=ThanhVien;Integrated Security=True"); } } Copy Chúng ta sẽ tạo SqlConnection và khởi tạo luôn, sau này các class DAL chúng ta chỉ cần kế thừa class DBConnect là có thể sử dụng _conn thoải mái ko cần khởi tạo lại. Các bạn nhớ sửa lại connection string cho chuẩn bên máy của các bạn nhé. Ở đây vì bài tập đơn giản nên ta chịu khó hard-code vậy :D. Chúng ta có nhiều cách khác nhau để tránh hard-code nhưng mình sẽ nói sau ở các bài khác. Mình sẽ tạo file DAL_ThanhVien.cs (Class file) Ở đây mình sẽ làm sẵn luôn 4 methods là: Lấy tất cả, Thêm, Xóa, Sửa nhé DAL_ThanhVien.cs: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using DTO_QuanLy; namespace DAL_QuanLy { public class DAL_ThanhVien : DBConnect { /// KHOA CÔNG NGHỆ THÔNG TIN 98
  99. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG /// Get toàn bộ thành viên /// /// public DataTable getThanhVien() { SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM THANHVIEN", _conn); DataTable dtThanhvien = new DataTable(); da.Fill(dtThanhvien); return dtThanhvien; } /// /// Thêm thành viên /// /// /// public bool themThanhVien(DTO_ThanhVien tv) { try { // Ket noi _conn.Open(); // Query string - vì mình để TV_ID là identity (giá trị tự tăng dần) nên ko cần fải insert ID string SQL = string.Format("INSERT INTO THANHVIEN(TV_NAME, TV_PHONE, TV_EMAIL) VALUES ('{0}', '{1}', '{2}')", tv.THANHVIEN_NAME, tv.THANHVIEN_PHONE, tv.THANHVIEN_EMAIL); // Command (mặc định command type = text nên chúng ta khỏi fải làm gì nhiều). SqlCommand cmd = new SqlCommand(SQL, _conn); // Query và kiểm tra if (cmd.ExecuteNonQuery() > 0) return true; } catch (Exception e) { KHOA CÔNG NGHỆ THÔNG TIN 99
  100. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG } finally { // Dong ket noi _conn.Close(); } return false; } /// /// Sửa thành viên /// /// /// public bool suaThanhVien(DTO_ThanhVien tv) { try { // Ket noi _conn.Open(); // Query string string SQL = string.Format("UPDATE THANHVIEN SET TV_NAME = '{0}', TV_PHONE = '{1}', TV_EMAIL = '{2}' WHERE TV_ID = {3}", tv.THANHVIEN_NAME, tv.THANHVIEN_PHONE, tv.THANHVIEN_EMAIL, tv.THANHVIEN_ID); // Command (mặc định command type = text nên chúng ta khỏi fải làm gì nhiều). SqlCommand cmd = new SqlCommand(SQL, _conn); // Query và kiểm tra if (cmd.ExecuteNonQuery() > 0) return true; } catch (Exception e) { } finally KHOA CÔNG NGHỆ THÔNG TIN 100
  101. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG { // Dong ket noi _conn.Close(); } return false; } /// /// Xóa thành viên /// /// /// public bool xoaThanhVien(int TV_ID) { try { // Ket noi _conn.Open(); // Query string - vì xóa chỉ cần ID nên chúng ta ko cần 1 DTO, ID là đủ string SQL = string.Format("DELETE FROM THANHVIEN WHERE TV_ID = {0})", TV_ID); // Command (mặc định command type = text nên chúng ta khỏi fải làm gì nhiều). SqlCommand cmd = new SqlCommand(SQL, _conn); // Query và kiểm tra if (cmd.ExecuteNonQuery() > 0) return true; } catch (Exception e) { } finally { // Dong ket noi _conn.Close(); } KHOA CÔNG NGHỆ THÔNG TIN 101
  102. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG return false; } } } 5.1.4. Xây dựng các lớp xử lý nghiệp vụ Bước này là bước xử lý business logic (Business layer). Ở bước này, ta có thể lấy dữ liệu từ DAL về, xử lý ABC XYZ gì đó rồi trả về lại cho GUI sử dụng. Hoặc khi update dữ liệu trên DB, GUI gửi data lên BUS và rồi ta xử lý ABC XYZ gì đó cho data của chúng ta, rồi mới insert/update/delete chẳng hạn, Vì app mình build là app đơn giản, nên mình chỉ cần gọi lên DAL và trả về tương ứng cho GUI xài thui Mình sẽ tạo BUS_ThanhVien.cs (Class file): using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using DAL_QuanLy; using DTO_QuanLy; namespace BUS_QuanLy { public class BUS_ThanhVien { DAL_ThanhVien dalThanhVien = new DAL_ThanhVien(); public DataTable getThanhVien() { return dalThanhVien.getThanhVien(); } public bool themThanhVien(DTO_ThanhVien tv) { return dalThanhVien.themThanhVien(tv); } KHOA CÔNG NGHỆ THÔNG TIN 102
  103. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG public bool suaThanhVien(DTO_ThanhVien tv) { return dalThanhVien.suaThanhVien(tv); } public bool xoaThanhVien(int TV_ID) { return dalThanhVien.xoaThanhVien(TV_ID); } } } Chỉ đơn giản là gọi hàm và trả về thôi 5.1.5. Hiển thị dữ liệu và thao tác trên màn hình KHOA CÔNG NGHỆ THÔNG TIN 103
  104. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DTO_QuanLy; using BUS_QuanLy; namespace GUI_QuanLy { public partial class GUI_ThanhVien : Form { BUS_ThanhVien busTV = new BUS_ThanhVien(); public GUI_ThanhVien() { InitializeComponent(); } private void btnExit_Click(object sender, EventArgs e) { Application.Exit(); } private void btnAdd_Click(object sender, EventArgs e) { if (txtEmail.Text != "" && txtName.Text != "" && txtSDT.Text != "") { // Tạo DTo KHOA CÔNG NGHỆ THÔNG TIN 104
  105. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG DTO_ThanhVien tv = new DTO_ThanhVien(0, txtName.Text, txtSDT.Text, txtEmail.Text); // Vì ID tự tăng nên để ID số gì cũng dc // Them if (busTV.themThanhVien(tv)) { MessageBox.Show("Thêm thành công"); dgvTV.DataSource = busTV.getThanhVien(); // refresh datagridview } else { MessageBox.Show("Thêm ko thành công"); } } else { MessageBox.Show("Xin hãy nhập đầy đủ"); } } private void GUI_ThanhVien_Load(object sender, EventArgs e) { dgvTV.DataSource = busTV.getThanhVien(); // get thanh vien } private void btnEdit_Click(object sender, EventArgs e) { // Kiểm tra nếu có chọn table rồi if (dgvTV.SelectedRows.Count > 0) { if (txtEmail.Text != "" && txtName.Text != "" && txtSDT.Text != "") { KHOA CÔNG NGHỆ THÔNG TIN 105
  106. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG // Lấy row hiện tại DataGridViewRow row = dgvTV.SelectedRows[0]; int ID = Convert.ToInt16(row.Cells[0].Value.ToString()); // Tạo DTo DTO_ThanhVien tv = new DTO_ThanhVien(ID, txtName.Text, txtSDT.Text, txtEmail.Text); // Vì ID tự tăng nên để ID số gì cũng dc // Sửa if (busTV.suaThanhVien(tv)) { MessageBox.Show("Sửa thành công"); dgvTV.DataSource = busTV.getThanhVien(); // refresh datagridview } else { MessageBox.Show("Sửa ko thành công"); } } else { MessageBox.Show("Xin hãy nhập đầy đủ"); } } else { MessageBox.Show("Hãy chọn thành viên muốn sửa"); } } private void dgvTV_Click(object sender, EventArgs e) { KHOA CÔNG NGHỆ THÔNG TIN 106
  107. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG // Lấy row hiện tại DataGridViewRow row = dgvTV.SelectedRows[0]; // Chuyển giá trị lên form txtName.Text = row.Cells[1].Value.ToString(); txtSDT.Text = row.Cells[2].Value.ToString(); txtEmail.Text = row.Cells[3].Value.ToString(); } private void btnDelete_Click(object sender, EventArgs e) { // Kiểm tra nếu có chọn table rồi if (dgvTV.SelectedRows.Count > 0) { // Lấy row hiện tại DataGridViewRow row = dgvTV.SelectedRows[0]; int ID = Convert.ToInt16(row.Cells[0].Value.ToString()); // Xóa if (busTV.xoaThanhVien(ID)) { MessageBox.Show("Xóa thành công"); dgvTV.DataSource = busTV.getThanhVien(); // refresh datagridview } else { MessageBox.Show("Xóa ko thành công"); } } else KHOA CÔNG NGHỆ THÔNG TIN 107
  108. CHƯƠNG 5. XÂY DỰNG ỨNG DỤNG VỚI MÔ HÌNH ĐA TẦNG { MessageBox.Show("Hãy chọn thành viên muốn xóa"); } } } } KHOA CÔNG NGHỆ THÔNG TIN 108
  109. CHƯƠNG 6. CRYSTAL REPORT CHƯƠNG 6. CRYSTAL REPORT 6.1 Crystal report - .NET cung cấp CrystalReport như một phần của Project, chúng ta có thể thêm báo cáo (report) bằng cách chọn Project – Add New Item – CrystalReport. - CrystalReport cung cấp nhiều hình dạng cho phép hiển thị dữ liệu một cách trực quan theo các mẫu được thiết kế sẵn 6.1.1. Tạo mới report Bước 1: Từ một Project có sẵn, click phải chọn Add – New Item – chọn Crystal Report Bước 2: Chọn Using the Report Wizard KHOA CÔNG NGHỆ THÔNG TIN 109
  110. CHƯƠNG 6. CRYSTAL REPORT Bước 3: Tạo kết nối với CSDL KHOA CÔNG NGHỆ THÔNG TIN 110
  111. CHƯƠNG 6. CRYSTAL REPORT Bước 4: Chọn kiểu báo cáo KHOA CÔNG NGHỆ THÔNG TIN 111
  112. CHƯƠNG 6. CRYSTAL REPORT Bước 5: Hoàn tất và chỉnh sửa báo cáo 6.1.2. Sử dụng crystal report để hiển thị report - Sau khi thiết kế report thành công, chúng ta có thể tiếp tục thiết kế các report với nhiều hình thức khác nhau. Tuy nhiên khi làm việc với C#, điều chúng ta quan tâm là làm thế nào để tương tác với các report đã thiết kế với dữ liệu có chọn lọc, hình thức chọn lọc từ CSDL nguồn. - Trong phần này chúng ta sẽ tìm hiểu cách đọc và trình bày dữ liệu trên Crystal Report Viewer bằng các hình thức như: trực tiếp từ DataSet, DataTable, XML v.v KHOA CÔNG NGHỆ THÔNG TIN 112
  113. CHƯƠNG 6. CRYSTAL REPORT 6.1.3. Tạo nguồn dữ liệu cho report từ DataSet chúng ta sẽ chọn Project Data > ADO.NET DataSets > KHOA CÔNG NGHỆ THÔNG TIN 113
  114. CHƯƠNG 6. CRYSTAL REPORT 6.1.4. Tạo nguồn dữ liệu cho report từ nguồn CSDL 6.1.5. Lọc dữ liệu trên report crystalreportviewer.SelectionFomula = "{filed cần lọc} = " + {Điều kiện}; ví dụ: DataSet _ds = new DataSet(); string _strConnection = "server=.;database=Electronic;User Id =sa;Password=sa;"; System.Data.SqlClient.SqlConnection _sqlCon = new System.Data.SqlClient.SqlConnection(_strConnection); System.Data.SqlClient.SqlCommand _sqlCom = new System.Data.SqlClient.SqlCommand(); _sqlCom.CommandText = "SELECT * FROM [tbl_DanhMucSanPham]"; _sqlCom.Connection = _sqlCon; System.Data.SqlClient.SqlDataAdapter _sqlAdater = new System.Data.SqlClient.SqlDataAdapter(_sqlCom); _sqlAdater.Fill(_ds); _sqlAdater.Dispose(); CrystalReport7 _rpt7 = new CrystalReport7(); crystalReportViewer1.ReportSource = _rpt7; crystalReportViewer1.SelectionFormula = "{_dt.DanhMuc_ID} = DM01"; KHOA CÔNG NGHỆ THÔNG TIN 114
  115. CHƯƠNG 6. CRYSTAL REPORT 6.1.6. Truyền tham số cho report Có tham số: 6.1.7. Xuất report ra máy in KHOA CÔNG NGHỆ THÔNG TIN 115
  116. CHƯƠNG 6. CRYSTAL REPORT 6.1.8. Xuất report ra tập tin Crystal Report cho phép xuất dữ liệu từ báo cáo ra các định dạng khác như: Excel, Word, PDF, HTML, Text v.v Trong trường hợp này chúng ta tìm hiểu cách xuất dữ liệu từ Crystal Report ra PDF và Excel. KHOA CÔNG NGHỆ THÔNG TIN 116
  117. CHƯƠNG 6. CRYSTAL REPORT KHOA CÔNG NGHỆ THÔNG TIN 117
  118. CHƯƠNG 6. CRYSTAL REPORT KHOA CÔNG NGHỆ THÔNG TIN 118
  119. CHƯƠNG 6. CRYSTAL REPORT 6.1.9. Đóng gói project Sau khi chúng ta xây dựng được một ứng dụng, để chạy được ứng dụng này trên một máy tính khác, hoặc phân phối ứng dụng này đến nhiều người sử dụng khác, chúng ta cần phải đóng gói project thành một chương trình cài đặt (Setup hoặc Install). Bước 1: Tạo Project mới loại Setup and Deployment – Visual Studio Installer: Bước 2: Trong khung liệt kê các kiểu project chọn Setup Wizard, bấm OK: KHOA CÔNG NGHỆ THÔNG TIN 119
  120. CHƯƠNG 6. CRYSTAL REPORT Bước 3: Bấm Next: KHOA CÔNG NGHỆ THÔNG TIN 120
  121. CHƯƠNG 6. CRYSTAL REPORT Bước 4: Bấm Next: Bước 5: Bấm nút Add, sau đó tìm đến thư mục chứa file project QuanLySinhvien.sln, bấm OK: KHOA CÔNG NGHỆ THÔNG TIN 121
  122. CHƯƠNG 6. CRYSTAL REPORT Bước 6: Bấm nút Finish để hoàn tất: KHOA CÔNG NGHỆ THÔNG TIN 122
  123. GIÁO TRÌNH TÊN HỌC PHẦN (LƯU HÀNH NỘI BỘ) TÀI LIỆU THAM KHẢO TT Tên tác giả Tên sách – giáo trình NXB Năm XB Phạm Hữu Khang C# 2005 – Lập trình cơ sở dữ Lao động 2009 1 liệu – Tập 4 – Quyển 1 xã hội Pham Hữu Khang C# 2005 0 Lập trình cơ sở dữ Lao động 2009 2 liệu Report – Tập 4 – Quyển 2 xã hội KHOA CÔNG NGHỆ THÔNG TIN 123