Giáo trình Lập trình C# 2 - Trình độ: Cao đẳng - Trường Cao đẳng cơ giới Ninh Bình

doc 135 trang Gia Huy 16/05/2022 2680
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình C# 2 - Trình độ: Cao đẳng - Trường Cao đẳng cơ giới Ninh Bình", để 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:

  • docgiao_trinh_lap_trinh_c_2_trinh_do_cao_dang_truong_cao_dang_c.doc

Nội dung text: Giáo trình Lập trình C# 2 - Trình độ: Cao đẳng - Trường Cao đẳng cơ giới Ninh Bình

  1. BỘ NÔNG NGHIỆP VÀ PHÁT TRIỂN NÔNG THÔNG TRƯỜNG CAO ĐẲNG CƠ GIỚI NINH BÌNH GIÁO TRÌNH MÔ ĐUN: LẬP TRÌNH C# 2 NGHỀ: LẬP TRÌNH MÁY TÍNH TRÌNH ĐỘ: CAO ĐẲNG NGHỀ Ban hành kèm theo Quyết định số: /QĐ- ngày .tháng .năm 2018 của Trường Cao đẳng Cơ giới Ninh Bình Ninh Bình, năm 2018
  2. 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. 2
  3. LỜI GIỚI THIỆU Đây là tài liệu được biên soạn theo chương trình khung trình độ đào tạo Cao đẳng nghề Lập trình máy tính. Để học tốt môn học này, người học cần phải có kiến thức về lập trình trên Windows cơ bản, cụ thể là ngôn ngữ C#.NET. Lập trình Windows 2 là một mô đun lập trình nâng cao nhằm giúp người học có kiến thức và kỹ năng để xây dựng một ứng dụng chuyên nghiệp với cơ sở dữ liệu. Với phạm vi của tài liệu này, chúng tôi cung cấp cho người học các kiến thức và kỹ năng chính sau: - Tạo các ứng dụng trên nền Windows. - Tạo được các ứng dụng cơ sở dữ liệu trên nền Windows. - Lập trình và sử dụng được các đối tượng của .NET. - Tạo được ứng dụng cơ sở dữ liệu với các báo cáo bằng CrystalReport. - Tạo ra các ứng dụng MDI. Trong quá trình biên soạn, chúng tôi có tham khảo nhiều nguồn tài liệu trên Internet. Mặc dù rất cố gắng nhưng chắc chắn không tránh khỏi những thiếu sót, tác giả rất mong nhận được những ý kiến đóng góp để tài liệu ngày càng hoàn thiện hơn để cung cấp cho người học những kiến thức và kỹ năng thiết thực. Tài liệu này được thiết kế theo từng mô đun/ môn học thuộc hệ thống mô đun/ môn học của một chương trình để đào tạo hoàn chỉnh nghề Lập trình máy tính ở trình độ Cao đẳng. Tài liệu dùng làm giáo trình học tập cho sinh viên trong các khóa đào tạo và cũng có thể được sử dụng cho đào tạo ngắn hạn hoặc công nhân kỹ thuật đồng thời có thể làm tài liệu tham khảo cho các lập trình viên. Tam Điệp, ngày .tháng . năm Tham gia biên soạn 1. Phạm Thị Thoa 2. Nguyễn Xuân Khôi 3. Nguyễn Anh Văn 3
  4. MỤC LỤC Bài 1: Xửa lý ngoại lệ 11 1. Phát sinh và bắt giữ ngoại lệ 11 2. Những đối tượng ngoại lệ 15 Bài 2: Lập trình Visual Studio.Net 17 1. Lập trình với Visual Studiou.Net 17 2. Thêm và điều chỉnh các điều khiển 21 Bài 3: Tạo thực đơn 29 1. Tạo thực đơn chính 29 2. Tạo thực đơn nghữ cảnh 34 Bài 4: Tạo thanh trạng thái 39 1. Tạo thanh trạng thái 39 2. Bài tập 40 Bài 5: Tạo hộp thoại 42 1. Tạo hộp thoại thông điệp 42 2. Sử dụng phương thức Form.Close 44 3. Tạo hộp thoại Modal 45 4. Tạo hộp thoại Modaless 45 Bài tập 46 Bài 6: Các hộp thoại tập tin 47 6.1. Tập tin và đường dẫn 47 6.2. Tạo hộp thoại lưu tập tin 55 6. 3. Tạo hộp thoại mở tập in 58 Bài 7: Sử dụng các đối tượng 63 1. Sử dụng TextBox, Button, Label 63 2. Sử dụng ListBox 71 3. Sử dụng ComboBox 76 4. Sử dụng ListView 80 5. Sử dụng TreeView 88 Bài tập 95 Bài 8: Một số tính năng khác 100 Bài 9: Truy cập và xử lý cơ sở dữ liệu 105 1. Kết nối dữ liệu 105 2. Thao tác với dữ liêu: Thêm, sửa, xóa, lọc dữ liệu 112 Bài 10: Lập báo cáo với CrystalReport 129 1. Lập báo cáo bằng Winzard 129 2. Lập báo cáo không sử dụng Winzard 135 4
  5. MÔ ĐUN:LẬP TRÌNH C#2 Mã mô đun: MĐ 16 Vị trí, tính chất, ý nghĩa và vai trò của mô đun: Vị trí:Học sau mô đun Lập trình C# 1. Tính chất:Là mô đun chuyênmônngành lập trình máy tính. Ý nghĩa và vai trò: Đây là mô đun cung cấp các kiến thức chuyên sâu về lập trình Window Form. Mục tiêu của mô đun: - Kiến thức: + Trình bày được các lỗi phát sinh ngoại lệ và tầm ảnh hưởng của nó đến chương trình; + Trình bày được khái quát các thành phần của Visual Studio.NET; + Mô tả được các bước tạo thực đơn chính và thực đơn ngữ cảnh; + Trình bày được chức năng, các thuộc tính và trình tự sử dụng của các đối tượng để tạo Form; + Trình bày được các bước kết nối, truy cập và xử lý dữ liệu; + Mô tả được các bước lập báo cáo; - Kỹ năng + Tạo các ứng dụng trên nền Windows. + Tạo được các ứng dụng MDI. + Lập trình và sử dụng được các đối tượng của .NET. + Tạo được ứng dụng cơ sở dữ liệu với các chức năng thêm, sửa, xóa, thông kê, tim kiếm thông tin. - Về năng lực tự chủ và trách nhiệm Thực hiệnđược các biện pháp an toàn cho người và máy tính Nội dung của mô đun: Thời gian Số Tên các bài trong mô đun Tổng Lý Thực Kiểm TT số thuyết hành tra 1 Bài 1: Xử lý ngoại lệ 5 2 3 2 Bài 2: Lập trình với Visual Studio .NET 5 3 2 3 Bài 3: Tạo thực đơn 8 2 6 1 4 Bài 4: Tạo thanh trạng thái 7 2 5 5 Bài 5: Tạo các hộp thoại 10 2 8 6 Bài 6: Tạo các hộp thoại tập tin 15 4 9 1 7 Bài 7: Sử dụng các đối tượng 30 9 20 1 8 Bài 8: Tạo ứng dụng MDI 5 1 4 9 Bài 9: Truy cập và xử lý cơ sở dữ liệu 60 12 58 2 10 Bài 10: Lập báo cáo với CrystalReport 15 3 10 1 Cộng 160 40 114 6 5
  6. Bài 1: Xửa lý ngoại lệ Mã bài: MĐ16_B01 Giới thiệu: Bài học này bao gồm hai nội dung: Phát sinh và bắt giữ ngoại lệ và những lớp đối tượng ngoại lệ. Mục tiêu: - Trình bày được các lỗi phát sinh ngoại lệ và tầm ảnh hưởng của nó đến chương trình. - Sử dụng được các lớp đối tượng ngoại lệ. - Xây đựng được phần xử lý ngoại lệ trong chương trình. - Thực hiện được các biện pháp an toàn cho máy tính 1. Phát sinh và bắt giữ ngoại lệ Một Exception (ngoại lệ) là một vấn đề xuất hiện trong khi thực thi một chương trình. Một Exception trong C# là một phản hồi về một tình huống ngoại lệ mà xuất hiện trong khi một chương trình đang chạy, ví dụ như chia cho số 0. Exception cung cấp một cách để truyền điều khiển từ một phần của một chương trình tới phần khác. Exception Handling (Xử lý ngoại lệ) trong C# được xây dựng dựa trên 4 từ khóa là: try, catch, finally, và throw. ❖ try: Một try xác định một khối mã mà trường hợp ngoại lệ đặc biệt được kích hoạt. Nó được theo sau bởi một hoặc nhiều hơn các khối catch. ❖ catch: Một chương trình bắt một ngoại lệ với một ngoại lệ được xử lý tại chỗ. Từ khóa catch chỉ bắt một ngoại lệ. ❖ finally: Khóa finally được sử dụng để thực hiện một tập hợp các báo cáo, cho dù một ngoại lệ được ném hoặc không ném. Ví dụ, nếu bạn mở một tập tin, nó phải được đongs cho dù một ngoại lệ xảy ra hay không. ❖ throw: Một chương trình ném một ngoại lệ khi một vấn đề xuất hiện. Điều này được thực hiện bằng cách sử dụng từ khóa throw. 1.1. Câu lệnh catch  Dùng Try-catch để xử lý ngoại lệ ❖ Đặt code có khả năng dẫn đến ngoại lệ vào khối “try” ❖ Cung cấp các khối “catch” theo sau “try” ❖ Có thể cung cấp tất cả catch cho các lỗi nếu muốn xử lý, bằng cách sử dụng các lớp exception thích hợp 6
  7. ❖ Nếu không cung cấp catch cho một ngoại lệ, thì exception này đượn lan truyền lên trên. Cú pháp: Code có khả năng dẫn đến lỗi try { RiskyBussiness(); Tham số exception được catch } catch (SomeException e ) Đoạn xử lý với tình { huống có lỗi // Handle code } Khối try:  Bao gồm các phần ❖ Từ khóa try ❖ Theo sau khối “{ }” ❖ Khối “{ }” bắt buộc phải có, khác với “{ }” trong if hay for  Bên trong khối try ❖ Đặt bất cứ câu lệnh nào có khả năng phát sinh ra ngoại lệ Khối catch:  Đặt một hay nhiều ngay sau khối try ❖ Không có lệnh nào chen giữa hai khối catch của một try  Cú pháp khối catch như sau catch (Exception-class [var1]) { // xử lý ngoại lệ 1 } catch (Exception-class [var2]) { // xử lý ngoại lệ 2 } 7
  8. Ví dụ: 1.2. Câu lệnh Finally  Khi một exception được ném ra ❖ Luồng thực thi sẽ nhảy vào khối catch xử lý nó. ❖ Một số đoạn code giải phóng tài nguyên có thể bị bỏ qua Open File Read Data // ngoại lệ được phát sinh Close File // đoạn code này bị bỏ qua, dù file chưa đóng ❖ Khối try-catch có phần option là finally ❖ Luôn luôn được gọi ❖ Sử dụng để dọn dẹp các tài nguyên đang nắm giữ 8
  9. 1.3. Câu lệnh throw Phát sinh một ngoại lệ: sử dụng từ khóa throw throw new System.Exception(); Hoạt động: Khi phát sinh ngoại lệ thì ngay tức khắc sẽ làm ngừng việc thực thi trong khi CLR sẽ tìmkiếm một trình xử lý ngoại lệ. Nếu một trình xử lý ngoại lệ không được tìm thấy trongphương thức hiện thời, thì CLR tiếp tục tìm trong phương thức gọi cho đến khi nào tìm thấy.Nếu CLR trả về lớp Main() mà không tìm thấy bất cứ trình xử lý ngoại lệ nào, thì nó sẽ kết thúc chương trình. Ví dụ: 9
  10. 2. Những đối tượng ngoại lệ Lớp Exception  Có 2 loại ngoại lệ ❖ Ngoại lệ phát sinh bởi chương trình ❖ Ngoại lệ được tạo bởi CLR  Lớp System.Exception là cơ sở cho tất cả lớp trong C#  2 lớp kế thừa từ lớp này: ❖ ApplicationException: thường làm lớp cơ bản cho lớp ngoại lệ phát sinh từ ứng dụng ❖ SystemException: do CLR phát sinh Một số lớp Exception thường dùng Lớp ngoại lệ Mô tả System.IO.IOException Xử lý lỗi I/O System.IndexOutOfRangeException Xử lý các lỗi phát sinh khi một phương pháp đề cập đến một chỉ số mảng nằm ngoài phạm vi. System.ArrayTypeMismatchException Xử lý các lỗi phát sinh khi loại chưa phù hợp với các kiểu mảng. System.NullReferenceException Xử lý các lỗi phát sinh từ một đối tượng null. System.DivideByZeroException Xử lý các lỗi phát sinh từ việc chia cho số không. System.InvalidCastException Xử lý các lỗi phát sinh trong quá trình phân loại. System.OutOfMemoryException Xử lý các lỗi được tạo ra từ bộ nhớ không 10
  11. đủ. System.StackOverflowException Xử lý các lỗi phát sinh từ tràn stack. Bài tập 11
  12. Bài 2: Lập trình Visual Studio.Net Mã bài: MĐ16_B02 Giới thiệu: Trong bài học này chúng ta sẽ làm quen với giao diện tạo ứng dụng Windows Form Applicationtrong Visual Studio C# 2010 Express. Mục tiêu: - Trình bày được khái quát các thành phần của Visual Studio.NET. - Tạo được Project, tạo và sử dụng được form đơn giản - Thực hiện được các biện pháp an toàn cho máy tính 1. Lập trình với Visual Studiou.Net - Giao diện của Visual Studio C# 2010 Express +New Project: Tạo Project mới + Open Project: Mở Project đã tạo + Recent Projects: Các Project mới tạo gần đây nhất - Form + Các thuộc tính của Form: Chứa trong cửa sổ Properties 12
  13. Một số thuộc tính thường dùng Thuộc tính Chức năng (name) Tên Form. Nó như một biến vậy. Quan trọng AllowDrop Cho phép kéo thả +GrowOnly: cho phép thay đổi kích thước form +GrowAndShrink: không cho phép thay đôi kích AutoSizeMode thước form BackColor Màu nền Form ContexMenuStrip Menu xuất hiện khi chuột phải lên Form Cursor Con trỏ chuột khi rê trên form Cho phép nhận phím hay không (cái này kết hợp KeyPreview với sự kiện nhận phím) Opacity Độ trong suốt của form ShowInTaskbar Hiện thị ở thanh taskbar khi chạy form (true/false) Vị trí xuất hiện của form +CenterScreen: Giữa màn hình StartPosition +CenterParent: Giữa Form gọi ra nó (form cha) TopMost Hiển thị đè lên các form khác WindowState Trạng thái của form Text Chữ hiển thị khi form chạy 13
  14. Trình tự thực hiện TT Nội dung Yêu cầu Hình ảnh kỹ thuật Bước 1 Tạo mới Project Tạo + Khởi động Visual Studio C# Project 2010 Express với tên + Chọn New Project chính xác + Chọn Windows Forms Application + Gõ tên dự án vào mục Name + Nhấn OK Bước 2 Thêm Form mới vào Project + Chọn cửa sổ Reluion Explorer + Chuột phải vào tên Dự án + Chọn Add + Chọn Windows Form + Gõ tên Form trong mục Name + Chọn ADD 14
  15. Bước 3 Tùy chỉnh Form Thiết lập - Chọn Form chính xác - Chọn cửa sổ Properties thuộc tính Thay đổi thuộc tính Text: Chào mừng các bạn đến với Visual Studio C# 2010 Bước 4 Chạy Form - Chọn cửa sổ Solution Explorer - Chuột phải vào lớp Program.cs - Chọn View Code (F7) - Thay thế tên form cần chạy vào mục Application.Run(new Ten_form()); - Biên dịch Debug\ Build Solution (Nhấn F6) - Chạy Form Debug\ Start Debugging (Nhấn F5) Sai hỏng thường gặp, nguyên nhân và biện pháp phòng tránh/ khắc phục 15
  16. - Sai hỏng thường gặp Không ra ứng dụng Window Form - Nguyên nhân Ở bước 1, chọn sai loại Project - Biện pháp khắc phục Làm lại từ bước 1: + Chọn New Project + Chọn Windows Forms Application + Gõ tên dự án vào mục Name + Nhấn OK 2. Thêm và điều chỉnh các điều khiển * Các điều khiển Toolbox bao gồm các nhóm điều khiển - All Windows Form: bao gồm tất cả các điều khiển dùng để tạo windows form - Common Controls: Các điều khiển thông thường 16
  17. - Container bao gồm các điều khiển có thể chứa các điều khiển khác - Menu & Toolbars: Các điều khiển dùng để tạo thanh thực đơn và thanh trạng thái. - Datta: bao gồm các điều khiển làm việc với dữ liệu - Components 17
  18. - Printing: Điều khiển in ấn - Dialogs: Bao gồm các điều khiển tạo các loại hộp thoại * Sắp xếp các điều khiển - Sử dụng thanh Layout + Chọn các điều khiển + Chọn kiểu sắp xếp trên thanh Layout - Sử dụng thuộc tính Dock của điều khiển + Chọn đối tượng 18
  19. + Chọn thuộc tính Dock\ Chọn loại định vị điều khiển Top Right Left Bottom Fill Top:Điều khiển sẽ chiếm phần phía trên của Form hoặc điều khiển chứa nó Left: Điều khiển sẽ chiếm chọn phần bên trái của Form hoặc của điều khiển chứa nó. Right: Điều khiển sẽ chiếm chọn phần bên phải của Form hoặc của điều khiển chứa nó Bottom: Điều khiển sẽ chiếm chọn phần bên dưới của Form hoặc của điều khiển chứa nó Fill: Điều khiển sẽ chiếm chọn phần còn lại của Form hoặc của điều khiển chứa nó None: Không thay đổi Dock=Top Dock=Fill Dock=Left Dock=Right Dock=Bottom b. Trình tự thực hiện 19
  20. TT Nội dung Yêu cầu Hình ảnh kỹ thuật Bước Tạo Form mới trên Project 1 + Chọn cửa sổ Reluion Explorer + Chuột phải vào tên Dự án + Chọn Add + Chọn Windows Form + Gõ tên Form trong mục Name frmControl + Chọn ADD Bước Tạo giao diện Kéo và thả 2 * Thêm các điều khiển chính xác - Kéo và thả GroupBox 2 lần vào các điều form tạo groupBox1, groupBox2 khiển Thiết lập thuộc tính: groupBox1.Dock=Top groupBox2.Dock=Fill - Kéo và thả Lable 5 lần vào form tạo lable1, lable2, lable3, lable4, lable5. - Kéo và thả TextBox vào form 3 lần tạo textBox1, textBox2, textBox3 20
  21. - Kéo và thả 1 DateTimePicker và thiết lập thuộc tính Format=Short - Kéo và thả Button 2 lần tạo button1, button2 * Thiết lập các thuộc tính - Chọn đối tượng - Chọn cửa sổ Properties thiết lập các Thiết lập thuộc tính: chính xác groupBox1.Text=Thông tin thuộc tính groupBox2.Text=Đăng ký label1.Text=Họ và tên label2.Text= Địa chỉ label3.Text= Ngày sinh label4.Text=Giới tính textBox1.Name=txtHoten textBox2.Name=txtDiachi textBox3.Name=txtGioitinh dateTimePicker1.Name=dtNgaysinh button1 Text=Đăng ký Name=btDK button2 Text=Thoát Name=btThoat label5 Name = lbDK Text= “” Bước Viết code Viết code 3 - Click đúp chuột trái vào nút Đăng chính xác ký 21
  22. - Viết code privatevoid btDK_Click(object sender, EventArgs e) { lbDK.Text = "Họ tên: " + txtHoten.Text + "\n Địa chỉ: " + txtDiachi.Text + "\n Ngày sinh:" + dtNgaysinh.Text + "\n Giới tính:" + txtGioitinh.Text; } - Click đúp chuột trái vào nút Thoát - Viết code privatevoid btThoat_Click(object sender, EventArgs e) { this.Close(); } Bước Chạy Form 4 - Chọn cửa sổ Solution Explorer - Chuột phải vào lớp Program.cs - Chọn View Code (F7) - Thay thế tên form cần chạy vào mục Application.Run(new Ten_form()); - Biên dịch Debug\ Build Solution (Nhấn F6) 22
  23. - Chạy Form Debug\ Start Debugging (Nhấn F5) Bài tập 1. Tạo Project Modau có chứa - Form frmchao có dòng tiêu đề “CHÀO MỪNG ĐẾN VỚI LẬP TRÌNH C# 1 – LẬP TRÌNH WINDOWS FORM” Yêu cầu dòng tiêu đề chạy từ phải qua trái - Form frmlogin Yêu cầu khi nhấn kết nối sẽ hiển thị thông tin nhập vào thành một hàng dước mục Password 23
  24. Bài 3: Tạo thực đơn Mã bài: MĐ16_B03 Giới thiệu: Trong bài học này giới thiệu cho người học về cách tạo thực đơn chính (MenuStrip) và thực đơn ngữ cảnh (ContentMenuStrip). Mục tiêu : - Trình bày được các thuộc tính cơ bản của ContextmenuStrip, MenuStrip - Tạo được 2 loại thực đơn - Thực hiện được các biện pháp an toàn cho máy tính 1. Tạo thực đơn chính * Chức năng của MuneStrip - Dùng để nhóm các lệnh cùng nhau - Menu có thể chứa: menu ngang, menu dọc, menu con, các biểu tượng, các phím nóng, các đường phân các * Các thuộc tính thường dùng - Name: Tên menu được dùng trong mã lệnh - Checked: Có/Không dòng menu xuất hiện checked. Ngầm định là False - SortCutKey: Đặt phím nóng cho menu - ShowShortcut: Có/ Không phím nóng hiển thị trên dòng menu, ngầm định là true - Text: Xuất hiện trên dòng menu * Sự kiện thường dùng Click: Xảy ra khi một dòng của menu được click chuột hoặc ấn phím nóng. Ngầm định khi nháy đúp chuột trong chế độ thiết kế * Viết lệnh cho dòng của menu gọi 1 Form = new ; .Show() hoặc .ShowDialog(); Trình tự thực hiện 24
  25. TT Nội dung Yêu Hình ảnh cầu kỹ thuật Bước Tạo Form trên Project Tạo 1 Trong cửa sổ Solution Explorer form Chuột phải vào tên Project-> với Chọn Add -> Windows Form tên Gõ tên Form: form frmMenu.cs chính xác Bước Tạo giao diện menu Tạo 2 - Kéo và thả MenuStrip vào Form giao tạo menuStrip1 diện chính xác - Tạo menu cấp 1: + Gõ &File + Gõ &View 25
  26. - Tạo menu con của File (menu cấp 2) + Chọn File + Gõ &Load + Gõ &Exit - Tạo menu con của View + Chọn View + Gõ &Normal + Thay đổi thuộc tính Enabled=false + Gõ &Stretch + Thay đổi thuộc tính Enabled=false + Gõ & Center + Thay đổi thuộc tính Enabled=false - Kéo và thả PictureBox vào Form tạo pictureBox1 Thiết lập thuộc tính Dock=Fill Bước Viết code Viết 3 - Code cho sự kiện Click vào code Load: chính privatevoid loadToolStripMenuItem_Cli xác ck(object sender, EventArgs e) 26
  27. { OpenFileDialog dlg = newOpenFileDialog(); dlg.Title = "Load Photo"; dlg.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*"; if (dlg.ShowDialog() == DialogResult.OK) { try { pictureBox1.Image = newBitmap(dlg.OpenFile()) ; } catch (Exception ex) { MessageBox.Show("Unable to load file: "+ ex.Message); } normalToolStripMenuItem.E nabled = true; strecthToolStripMenuItem. Enabled = true; centerToolStripMenuItem.E nabled = true; } dlg.Dispose(); } - Code cho sự kiện click củaexitToolStripMenuItem privatevoid exitToolStripMenuItem_Cli 27
  28. ck(object sender, EventArgs e) { this.Close(); } - Code cho sự kiện click củanormalToolStripMenuItem privatevoid normalToolStripMenuItem_C lick(object sender, EventArgs e) { pictureBox1.SizeMode = PictureBoxSizeMode.Normal ; } - Code cho sự kiện click củastrecthToolStripMenuItem privatevoid strecthToolStripMenuItem_ Click(object sender, EventArgs e) { pictureBox1.SizeMode = PictureBoxSizeMode.Stretc hImage; } - Code cho sự kiện click củacenterToolStripMenuItem privatevoid centerToolStripMenuItem_C lick(object sender, EventArgs e) { pictureBox1.SizeMode = 28
  29. PictureBoxSizeMode.Center Image; } Bước Biên dịch Lựa 4 Debug\Build Solution – F6 chọn chính xác Bước Chạy Form Lựa 5 Debug\Start Debugging- F5 chọn chính xác. Chạy được form. 2. Tạo thực đơn nghữ cảnh * Chức năng: Menu ngữ cảnh hiển thị khi click chuột phải trên đối tượng của Form hoặc trên form * Để tạo ra menu ngữ cảnh chúng ta sử dụng công cụ ContextMenuStrip trong nhóm Menus & Toolbars trong Toolbox * Hiển thị menu ngữ cảnh - Chọn đối tượng hoặc Form - Đặt thuộc tính ContextMenuStrip cuả đối tượng được chọn là tên của menu ngữ cảnh. b. Trình tự thực hiện (TrênForm của phần tạo thực đơn chính) 29
  30. TT Nội dung Yêu Hình ảnh cầu kỹ thuật Bước Kéo và thả ContextMenuStrip Kéo 1 vào Form thả chính xác Bước Tạo các thành phần cho menu 2 ngữ cảnh bao gồm: View, Exit Tạo menu View bao gồm Normal, giao Stretch, Center diện chính xác Bước Gán Menu ngữ cảnh cho đối Chọn 3 tượng đúng - Chọn PictrureBox1 đối - Thiết lập thuộc tính tượng, ContextMenuStrip = Thiết contextMenuStrip1 lập đúng thuộc tính Bước Viết code Viết 4 privatevoid code normalToolStripMenuItem1 chính _Click(object sender, EventArgs e) xác { 30
  31. pictureBox1.SizeMode = PictureBoxSizeMode.Norma l; } privatevoid strecthToolStripMenuItem 1_Click(object sender, EventArgs e) { pictureBox1.SizeMode = PictureBoxSizeMode.Stret chImage; } privatevoid centeToolStripMenuItem_C lick(object sender, EventArgs e) { pictureBox1.SizeMode = PictureBoxSizeMode.Cente rImage; } privatevoid eToolStripMenuItem_Click (object sender, EventArgs e) { this.Close(); } Bước Biên dịch Lựa 5 Debug\Build Solution - F6 chọn chính xác 31
  32. Bước Chạy Form Lựa 6 Debug\Start Debugging- F5 chọn chính xác. Chạy được form. Bài tập 32
  33. 1. Tạo Project Menu chưa form sau 2. Tạo Project menu2 chứa Form có menu 3. Tạo menu ngữ cảnh 33
  34. Bài 4: Tạo thanh trạng thái Mã bài: MĐ16_B04 Giới thiệu: Trong bàu học này sẽ giới thiệu về thanh trạng thái và cách ta ra nó. Mục tiêu : - Hiểu rõ mục đích sử dụng thanh trạng thái; - Sử dụng được thanh trạng thái trong chương trình; - Thực hiện được các biện pháp an toàn cho máy tính. 1. Tạo thanh trạng thái - Thanh công trạng thái là thanh nằm ngang, bên dưới đáy cửa sổ, gồm nhiều phần tử nhằm thể hiện thông tin về các trạng thái hoạt động của ứng dụng. Mỗi phần tử có thể là một văn bản, một biểu tượng hay một thanh tiến trình. - Đối tượng Status Bar Bao gồm các loại 34
  35. + StatusLabel: là một văn bản + ProgressBar: Thanh tiến trình + DropDownButton: Nút nhấn trải ra một danh sách với biểu tượng là hình ảnh + SplitButton: Nút nhấn trải ra một danh sách với biểu tượng là hình ảnh Trình tự thực hiện - Nhấp chuột kéo và thả đối tượng Status vào form - Chọn loại trạng thái - Thay đổi thuộc tính cho loại trạng thái Bài tập Tạo form 35
  36. Bài 5: Tạo hộp thoại Mã bài: MĐ16_B05 Giới thiệu: Bài học này cung cấp các kiến thức về hộp thoại: Modal và Modaless. Mục tiêu : - Phân biệt được hai loại hộp thoại Modal và Modaless; - Biết cách sử dụng hộp thoại thông điệp; - Sử dụng được phương thức Form.Close; - Thực hiện được các biện pháp an toàn cho máy tính 1. Tạo hộp thoại thông điệp * Các dạng hộp hoại thông điệp * Cú pháp: MessageBox.Show(string text, string caption, MessageBoxButtons button, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton); - text: chuỗi hiển thị nội dung thông báo - caption: Tiêu đề hộp thoại - MessageBoxButtons: nút của hộp thoại bao gồm các giá trị + OK: hộp thoại chỉ có nút OK + OKCancel: Hộp thoại gồm 2 nút OK và Cancel + YesNo: Hộp thoại gồm 2 nút Yes và No + YesNoCancel: hộp thoại gồm 3 nút Yes, No và Cancel - MessageBoxIcon: Biểu tượng của hộp thoại + Error + Information 37
  37. + Quesstion + Warning - MessageBoxDefaultButton: Nút chọn mặc định button1 hoặc buton2 hoặc button3 * Những trường hợp sử dụng Message Box: - Trong từng trường hợp, các MessageBox sẽ có cách sử dụng khác nhau: + Thông báo cho người sử dụng biết không thể sử dụng chức năng hay lưu ý một vấn đề trong chương trình + Cần sự xác nhận của người sử dụng đối với một lệnh quan trọng như: - Xóa một dữ kiện quan trọng - Thoát nhưng chưa lưu trữ - Tắt một lúc nhiều ứng dụng - Và các trường hợp cần được xác nhận + Thông báo những thứ quan trong trong chương trình. * DialogResult có kết quả trả về từ MessageBox.Show bao gồm các giá trị có thể là: DialogResult.None DialogResult.OK DialogResult.Cancel DialogResult.Abort DialogResult.Retry DialogResult.Ignore DialogResult.Yes DialogResult.No b. Trình tự thực hiện 38
  38. Viết code cho sự kiện đóng Form. Nếu chọn nút Thoát sẽ xuất hiện hộp thoại hỏi người dùng có muốn đóng Form không? Nếu chọn Yes thì đóng Form, nếu chọn No thì không đóng. - Tạo nút Thoát - Viết sự kiện Click cho nút Thoát privatevoid btThoat1_Click(object sender, EventArgs e) { if (MessageBox.Show("Bạn có muốn đóng Form không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) this.Close(); } 2. Sử dụng phương thức Form.Close Sự kiện FormClosing: xảy ra khi Form đang đóng Khi gọi sự kiện này sẽ có tham số:FormClosingEventArgs e Ta sử dụng nó để xử lý việc tiếp tục đóng form hay không? e. Cancel=false thì tiếp tục đóng form e.Cancel= true thì ngừng đóng form Trình tự thực hiện Bước 1: Chọn Form\ Chọn Properties\Chọn Event Bước 2: Nhấn đúp chuột vào FormClosing Bước 3: Viết code privatevoid Form1_FormClosing(object sender, FormClosingEventArgs e) { 39
  39. if (MessageBox.Show("Bạn có muốn đóng Form không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { e.Cancel = false; } else { e.Cancel = true; } } Bước 4: Chạy Form 3. Tạo hộp thoại Modal Modal dialog : Hộp thoại trạng thái là loại hộp thoại chỉ trả giá trị (quyền điều khiển) về cho chương trình khi đóng hộpthoại, có nghĩa là khi hộp thoại hiển thị bạn không thể chuyển điều khiển đến các cửa sổ con khác trong cùng ứng dụng cho đến khi đóng hộp thoại, hoặc bạn không thể thực thi các lệnh bên dưới lệnh gọi hộp thoại cho tới khi đóng hộp thoại. Khi đóng hộp thoại modal, có giá trị trả về, chương trình mới tiếp tục thực hiện các câu lệnh bên dưới dòng lệnh gọi hộp thoại modal. Tạo hộp thoại Modal bằng cách gọi phương thức ShowDialog của Form Trình tự thực hiện Bước 1. Tạo Form chính: frmMain Bước 2: Tạo Form phụ: frmSecond Bước 3. Gọi Form phụ trên form chính frmSecond frm=new frmSecond((); frm.ShowDialog(); Bước 4: Chạy form chính. 4. Tạo hộp thoại Modaless Modaless dialog : Hộp thoại không trạng thái là hộp thoại trả giá trị (quyền điều khiển) về cho chương trình ngay lập tức nên có thể chuyển điều khiển đến các 40
  40. cửa sổ khác trong cùng ứng dụng, hoặc thực thi các lệnh bên dưới lời gọi hộp thoại. Tạo hộp thoại Modaless bằng cách gọi phương thức Show của Form Trình tự thực hiện Bước 1. Tạo Form chính: frmMain Bước 2: Tạo Form phụ: frmSecond Bước 3. Gọi Form phụ trên form chính frmSecond frm=new frmSecond((); frm.Show(); Bước 4: Chạy form chính. Bài tập Tạo form khi nhấn vào mỗi nút sẽ hiển thị ra hộp thoại tương ứng Hộp thoại 1 Hộp thoại 3 Hộp thoại 2 Hộp thoại4 41
  41. Bài 6: Các hộp thoại tập tin Mã bài MĐ16_B06 Giới thiệu: Bài học này giới thiệu về cách tạo hộp thoại lưu tập tin, tạo hộp thoại mở tập tin. Mục tiêu : - Sử dụng được các phương thức về đường dẫn và tập tin. - Sử dụng được các loại hộp thoại tập tin. - Thực hiện được các biện pháp an toàn cho máy tính 6.1. Tập tin và đường dẫn Khái niệm về các loại tập tin • Đối với các kiểu dữ liệu như kiểu số, kiểu mảng, kiểu cấu trúc thì dữ liệu được tổ chức trong bộ nhớ trong (RAM) của máy tính nên khi kết thúc việc thực hiện chương trình thì dữ liệu cũng bị mất • Để giải quyết vấn đề, người ta đưa ra kiểu tập tin (file) cho phép lưu trữ dữ liệu ở bộ nhớ ngoài (đĩa). Khi kết thúc chương trình thì dữ liệu vẫn còn do đó chúng ta có thể sử dụng nhiều lần Có 3 loại dữ liệu kiểu tập tin: • Tập tin văn bản (Text File) o Là loại tập tin dùng để ghi các ký tự lên đĩa, các ký tự này được lưu trữ dưới dạng mã Ascii. o Điểm đặc biệt là dữ liệu của tập tin được lưu trữ thành các dòng, mỗi dòng được kết thúc bằng ký tự xuống dòng (new line), ký hiệu ‘\n’; ký tự này là sự kết hợp của 2 ký tự CR (Carriage Return - Về đầu dòng, mã Ascii là 13) và LF (Line Feed - Xuống dòng, mã Ascii là 10) o Mỗi tập tin được kết thúc bởi ký tự EOF (End Of File) có mã Ascii là 26 o Tập tin văn bản chỉ có thể truy xuất theo kiểu tuần tự • Tập tin định kiểu (Typed File) o Là loại tập tin bao gồm nhiều phần tử có cùng kiểu: char int long c , int, long, cấu trúc và và được lưu trữ trên đĩa dưới dạng một chuỗi các byte liên tục • Tập tin không định kiểu (Untyped File) o Là loại tập tin mà dữ liệu của chúng bao gồm các cấu trúc dữ liệu nhưng g người dùng g q không quan tâm đến nội dung hoặc kiểu 42
  42. của nó mà chỉ lưu ý đến các yếu tố vật lý của tập tin như độ lớn và các yếu tố tác động lên tập tin mà thôi Con trỏ tập tin: • Khi một tập tin được mở ra để làm việc, tại mỗi thời điểm, sẽ có một vị trí của tập tin mà tại đó việc đọc/ghi thông tin sẽ xảy ra. Người ta hình dung có một con trỏ đang chỉ đến vị trí đó và đặt tên nó là con trỏ tập tin. • Sau khi đọc/ghi xong dữ liệu con trỏ sẽ chuyển dịch thêm một phần tử về phía cuối tập tin. Sau phần tử dữ liệu cuối cùng của tập tin là dấu kết thúc tập tin EOF (End Of File). Biến tập tin: Là một biến thuộc kiểu dữ liệu tập tin dùng để đại diện cho một tập tin. Dữ liệu chứa trong một tập tin được truy xuất qua các thao tác với thông số là biến tập tin đại diện cho tập tin đó. Xử lý hệ thống tập tin và thư mục • FileSystemInfo • FileInfo • DirectoryInfo • DriveInfo • Path • FileSystemWatcher Các lớp hệ thống tập tin • Bên trong namespace có tên System.IO là một tập hợp các class được sử dụng để định vị và thao tác các tập tin, thư mục và thiết bị. Các class hệ thống tập tin được chia thành 2 loại class: informational và utility. • Hầu hết các class loại informational dẫn xuất từ class cơ sở FileSystemInfo. Các class này trưng tất cả thông tin hệ thống liên quân các đối tượng hệ thống tập tin Đó là các class có tên FileInfo và DirectoryInfo • Ngoài ra, class DriveInfo trình bày thiết bị trong hệ thống tập tin, mặc dù nó vẫn là một class thuộc loại informational, tuy nhiên nó không dẫn xuất từ FileSystemInfo bởi lẽ nó không chia sẻ các kiểu hành vi chung (ví dụ, bạn có thể xóa các tập tin và thư mục, nhưng không thể xóa các thiết bị). • Các class loại utility cung cấp các phương thức static (hoặc phương thức shared trong Visual Basic) để thực thi một số hoạt động trên các đối tượng hệ thống tập tin như các tập tin, thư mục và hệ thống tập tin đường dẫn (paths). Các loại utility bao gồm các class: File, Directory và Path 43
  43. FileSystemInfo Class • FileSystemInfo cung cấp các chức năng cơ bản cho tất cả các lớp xử lý hệ thống tập tin và thư mục • Bảng các thuộc tính chính của FileSystemInfo o Attributes Gán hoặc lấy giá trị các thuộc tính của tập tin hay thư mục hiện hành. o CreationTime Gán hoặc lấy giá trị về thời gian tạo lập của tập tin hay thư mục. o Exists Kiểm tra tập tin hay thư mục có tồn tại hay không. o Extension Lấy thông tin phần mở rộng (kiểu) của tập tin o LastAccessTime Gán hoặc lấy giá trị về thời gian truy cập cuối cùng của tập tin hay thư mục. o LastWriteTime Gets or sets the time the file or directory was last written to. o Name Trả về tên của tập tin hay thư mục o FullName Lấy đường dẫn đầy đủ của tập tin hay thư mục o Delete Xóa tập tin hay thư mục trong hệ thống tập tin. o Refresh Cập nhật lại dữ liệu trong class với thông tin mới nhất từ hệ thống tập tin FileInfo Class • FileInfo cung cấp các chức năng cơ bản để truy xuất và thao tác với một tập tin trong hệ thống tập tin. • Bảng các thuộc tính chính của FiIfeInfo o Directory Trả về thư mục chứa tập tin hiện hành đang truy xuất o DirectoryName Trả về tên của thư mục chứa tập tin đang truy xuất o IsReadOnly Lấy và thiết lập thông tin chỉ đọc cho tập tin o Length Kích thước của tập tin o AppendText Tạo một đối tượng StreamWriter cho phép ghi thêm văn bản vào trong tập tin o CopyTo Sao chép tập tin đến thư mục khác o Create Tạo một tập tin mới dựa trên các thông tin của tập tin hiện hành o CreateText Tạo một đối tượng StreamWriter cho phép ghi văn bản vào trong tập tin o Decrypt Giải mã tập tin đã được mã hóa . 44
  44. o Encrypt Mã hóa nội dung tập tin. o MoveTo Di chuyển tập tin đến thư mục khác o Open Mở tập tin để đọc hoặc ghi nội dung o OpenRead Mở tập tin ở chế độ chỉ đọc. o OpenText Mở tập tin và trả về một StreamReader cho phép đọc nội dung bên trong tập tin. o OpenWrite Mở tập tin ở chế độ chỉ ghi o Replace Thay thế nội dung của tập tin bằng thông tin trong FileInfo Ví dụ: DirectoryInfo Class • DirectoryInfo cung cấp các chức năng cơ bản để truy xuất và thao tác với một thư mục trong hệ thống tập tin. • Bảng các thuộc tính chính của DirectoryInfo o Parent Trả về thư mục chứa (thư mục cha) của thư mục hiện hành đang truy xuất o Root Trả về thư mục gốc trong chuỗi đường dẫn của thư mục hiện hành o Create Tạo thư mục theo thông tin được mô tả trong DirectoryInfo. o CreateSubdirectory Tạo thư mục con của thư mục hiện hành o GetDirectories Trả về một mảng đối tượng kiểu DirectoryInfo gồm các thư mục con trong thư mục hiện hành o GetFiles Trả về một mảng đối tượng kiểu FileInfo gồm các tập tin trong thư mục hiện hành 45
  45. o GetFileSystemInfos Trả về đối tượng kiểu FileSystemInfo gồm các tập tin và thư mục trong thư mục hiện hành o MoveTo Di chuyển thư mục hiện hành sang vị trí khác Ví dụ: Duyệt qua các tập tin có trong thư mục Windows: DirectoryInfo ourDir =newDirectoryInfo(@"c:\windows"); Console.WriteLine("Directory: {0}", ourDir.FullName); foreach(FileInfo file in ourDir.GetFiles()) { Console.WriteLine("File: {0}", file.Name); } DriveInfo Class • DirectoryInfo cung cấp các chức năng cơ bản để truy xuất và thao tác với một ổ đĩa trong hệ thống tập tin. • Bảng các thuộc tính chính của DriveInfo o AvailableFreeSpace Trả về kích thước còn trống cho phép lưu trữ o DriveFormat Trả về thông tin định dạng của ổ đĩa ( , NTFS, FAT32 ) o DriveType Trả về kiểu của ổ đĩa (ổ đĩa cứng, CDRom ) o IsReady Trả về trạng thái của ổ đĩa (có sẵn sàng cho phép truy xuất hay không). o Name Tên của ổ đĩa. o TotalFreeSpace Trả về tổng kích thước còn trống của ổ đĩa. o TotalSize Trả về tổng kích thước của ổ đĩa. o VolumeLabel Trả về nhãn của ổ đĩa o GetDrives Trả về tất cả các ổ đĩa hiện có trên hệ thống (phương thức tĩnh – static) Ví dụ: duyệt á qua các ổ đĩa có t h rong hệ thống DriveInfo[] drivers = DriveInfo.GetDrives(); foreach(DriveInfo drive in drivers) { Console.WriteLine("Drive: {0}", drive.Name); 46
  46. Console.WriteLine("Type: {0}", drive.DriveType); } Path Class • Path cung cấp các chức năng cơ bản để truy xuất và thao tác với đường dẫn hệ thống tập tin. • Bảng các phương thức chính của Path o ChangeExtension Trả về chuỗi đường dẫn đống thời đổi phần mở rộng của tập tin trong chuỗi đường dẫn o Combine Trả về 1 chuỗi đường dẫn bằng cách kết hợp 2 chuỗi đường dẫn. o GetDirectoryName Trả về tên của thư mục hiện hành o GetExtension Trả về kiểu của tập tin hiện hành o GetFileName Trả về tên của tập tin hiện hành o GetFileNameWithoutExtension Trả về kiểu của tập tin hiện hành không có phần kiểu o GetFullPath Trả về đường dẫn đầy đủ dựa vào đường dẫn tương đối được cung cấp o GetPathRoot Trả về thư mục gốc dựa vào đường dẫn được cung cấp o GetRandomFileName Trả về tập tin được lấy một cách ngẫu nhiên o GetTempFileName Trả về tên của thư mục tạm (thư mục temp) ứng với người dùng hiện hành o GetTempPath Trả về đường dẫn đến thư mục tạm (thư mục temp) o HasExtension Kiểm tra trong đường dẫn có phần mở rộng của tập tin hay không o IsPathRooted Kiểm tra đường dẫn có bắt đầu từ thư mục gốc (tên ổ đĩa) hay không Ví dụ: thay đổi h phần mở rộng của tập tin string ourPath =@"c:\mastercode.ini"; Console.WriteLine(ourPath); Console.WriteLine("Ext: {0}", Path.GetExtension(ourPath)); 47
  47. Console.WriteLine("Change Path: {0}", Path.ChangeExtension(ourPath,"bak")); FileSystemWatcher Class • FileSystemWatcher cung cấp các chức năng cơ bản để giám sát các thay đổi trong hệ thống tập tin và thư mục. • Bảng các thuộc tính chính của FileSystemWatcher o EnableRaisingEvents Lấy và thiết lập thông tin cho phép phát sinh sự kiện o Filter Lấy và thiết lập danh sách tập tin sẽ được lọc khi giám sát. Nếu không thiết lập thì sẽ giám sát tất cả các tập tin o IncludeSubdirectories Cho phép giám sát các thư mục con hay không o NotifyFilter Chế độ giám sát. Mặc định sẽ giám sát tất cả thay đổi (tạo, xóa, đổi tên và hiệu chỉnh nội dung trong tập tin) o Path Đường dẫn đến thư mục cần giám sát o WaitForChanged Phương thức đồng bộ trong việc giám sát một thư mục và trả về cấu trúc bao gồm tất cả thay đổi trên thư mục đó o Changed Xảy ra khi một tập tin hay một thư mục bị thay đổi trong thư mục được giám sát o Created Xảy ra khi một tập tin hay một thư mục vừa mới được tạo trong thư mục được giám sát o Deleted Xảy ra khi một tập tin hay một thư mục bị xóa trong thư mục được giám sát o Renamed Xảy ra khi một tập tin hay một thư mục bị đổi tên trong thư mục được giám sát Ví dụ 1: giám sát việc tạo và xóa tập tin, thư mục trên thư mục gốc đĩa C:\ staticvoidwatcher_Change(object sender,FileSystemEventArgs e){ Console.WriteLine("Directory change({0} : {1})", e.ChangeType, e.FullPath); } staticvoidMain(string[] args){ 48
  48. FileSystemWatcher watcher =newFileSystemWatcher(); watcher.Path =@"C:\"; //Chỉ định phương thức xử lý cho sự kiện watcher.Created +=newFileSystemEventHandler(watcher_Change); watcher.Deleted +=newFileSystemEventHandler(watcher_Change); //Bắt đầu giám sát watcher.EnableRaisingEvents =true; Console.ReadLine(); } Ví dụ 2: giám sát việc sửa đổi tên tập tin và thư mục trên thư mục gốc đĩa C:\ staticvoidwatcher_Rename(object sender,RenamedEventArgs e){ Console.WriteLine("Rename from {0} to {1}", e.OldFullPath, e.FullPath); } staticvoidMain(string[] args){ FileSystemWatcher watcher =newFileSystemWatcher(); watcher.Path =@"C:\"; //Chỉ định phương thức xử lý cho sự kiện watcher.Renamed +=newRenamedEventHandler(watcher_Rename); //Bắt đầu giám sát watcher.EnableRaisingEvents =true; Console.ReadLine(); } Xử lý đọc ghi tập tin • Stream • Directory, File 49
  49. • FileStream • StreamReader, StreamWriter • StringReader, StringWriter • BinaryReader, BinaryWriter • MemoryStream BufferedStream 6.2. Tạo hộp thoại lưu tập tin Lớp SaveFileDialog là lớp dùng cho phép người dùng chọn một nơi để lưu dữ liệu. Để khai lớp SaveFileDialog có 2 cách: - Sử dụng từ ToolBox Drag & drop - Khai báo bằng code: SaveFileDialog SaveFileDialog_name = new SaveFileDialog(); Ví dụ: SaveFileDialog file = newSaveFileDialog(); Sau đây là một số thuộc tính cơ bản của lớp SaveFileDialog: 50
  50.  Title: Tiêu đề của hộp thoại lưu tập tin Ví dụ: file.Title= “Save as”  InitialDirectory: Thư mục khởi tạo hiển thị bởi hộp thoạilưutập tin. Cú pháp: OpenFileDialog_name.InitialDirectory=@ “Đường_dẫn” Ví dụ: file.InitialDirectory= @“C:\”  FileName: + Trả lại đường dẫn đến tập tin được chọn trong hộp thoại lưu tập tin. + Gán giá trị cho TextBox: File name trong hộp thoại mở tập tin  Filter Thiết lập lọc loại tập tin xuất hiện trong cửa sổ hiện thị nội dung của thư mục đang được chọn. Xuất hiện trong hộp "Save as type" trong hộp thoại lưu tập tin. - Cú pháp: SaveFileDialog_name.Filter= ten_chuoi1(Mô_tả_đuôi_tệp)|*.duoi1;*.duoi2; | [ten_chuoi2(Mô_tả_đuôi_tệp)|*.duoi1;*.duoi2; | ] - Ví dụ 1: file.Filter = "Text(*.txt)|*.txt|All files|*.*"; Phương thức: ShowDialog(): Hiển thị hộp thoại lưu tập tin. Trình tự thực hiện 51
  51. TT Nội dung Yêu cầu kỹ Hình ảnh thuật Bước 1 Tạo Form trên Project Tạo form với Trong cửa sổ Solution tên form chính Explorer Chuột phải xác vào tên Project-> Chọn Add -> Windows Form Gõ tên Form: frmSaveFile.cs Bước 2 Tạo giao diện Tạo giao diện chính xác Bước 3 Viết code Viết code Code cho sự kiện chính xác Click của nút Save: - Khai báo đối tượng thuộc lớp SaveFileDialog - Thiết lập các thuộc 52
  52. tính - Gọi phương thức ShowDialog - Ghi file Bước 4 Biên dịch Lựa chọn chính Debug\Build Solution xác - F6 Bước 5 Chạy Form Lựa chọn chính Debug\Start xác. Chạy được Debugging- F5 form. 6. 3. Tạo hộp thoại mở tập in Lớp OpenFileDialog là lớp dùng để lấy một tên tập tin hay nhiều tên tập tin từ người dùng. Khi nó được thực hiện thì ứng dụng có thể xử lý một tập tin hay nhiều tập tin được người dùng lựa chọn. Để khai lớp OpenFileDialog có 2 cách: - Sử dụng từ ToolBox Drag & drop - Khai báo bằng code: 53
  53. OpenFileDialog OpenFileDialog_name = new OpenFileDialog(); Ví dụ: Sau đây là một số thuộc tính cơ bản của lớp OpenFileDialog:  Title: Tiêu đề của hộp thoại mở tập tin Ví dụ: opFile.Title= “Open”  InitialDirectory: Thư mục khởi tạo hiển thị bởi hộp thoạimở tập tin. Cú pháp: OpenFileDialog_name.InitialDirectory=@ “Đường_dẫn” Ví dụ: opFile.InitialDirectory= @“C:\”  Multiselect: thuộc tính kiểu Boolean có thể nhận 1 trong 2 giá trị: + Giá trị là false (mặc định) : cho phép lựa chọn 1 tập tin + Giá trị là true cho phép người dùng chọn nhiều tập tin FileName: + Trả lại đường dẫn đến tập tin được chọn trong hộp thoại mở tập tin. + Gán giá trị cho TextBox: File name trong hộp thoại mở tập tin  FileNames Nếu thuộc tính Multiselect=true, thuộctính này sẽ trả về một mảng tên tập tin mà người dùng chọntrong hộp thoại mở tập tin  Filter Thiết lập lọc loại tập tin xuất hiện trong cửa sổ hiện thị nội dung của thư mục đang được chọn. Xuất hiện trong hộp "Files of type" trong hộp thoại mở tập tin. - Cú pháp: OpenFileDialog_name.Filter= ten_chuoi1(Mô_tả_đuôi_tệp)|*.duoi1;*.duoi2; | [ten_chuoi2(Mô_tả_đuôi_tệp)|*.duoi1;*.duoi2; | ] - Ví dụ 1: opFile. Filter = "Image(*.jpg;*.jpeg;*.gif;*.png;*.bmp)|*.jpg;*.jpeg;*.gif;*.png;*.bmp"; 54
  54. Ví dụ 2: opFile. Filter = “All File(*.*)|*.*| Document(*.doc;*.dot;*.html;*.url)|*.doc;*.dot;*.html;*.url"; Phương thức: ShowDialog(): Hiển thị hộp thoại mở tập tin. 55
  55. TRÌNH TỰ THỰC HIỆN Yêu Nội dung bước công cầu TT việc (Trình tự thực Ghi chú kỹ hiện bước công việc) thuật Bước 1: Tạo Form trên Project Hoàn thiện Trong cửa sổ Solution Form Explorer Chuột phải đúng vào tên Project-> Chọn theo yêu Add -> Windows Form cầu Gõ tên Form: trong frmOpenFile.cs thời Bước 2: Tạo giao diện gian cho phép Bước 3: Viết code Code cho sự kiện Click của nút Open: - Khai báo đối tượng thuộc lớp OpenFileDialog - Thiết lập các thuộc tính - Gọi phương thức ShowDialog - Xử lý tập tin đã chọn Bước 4: Biên dịch Debug\Build Solution - F6 56
  56. Bước 5: Chạy Form Debug\Start Debugging- F5 Bài tập 1. Tạo phần mền Notepad Khi nhấn vào - New tạo ra một file mới - Open sẽ mở hộp thoại Open File cho phép ta chọn file .txt và khi mở thì nội dung file sẽ hiển thị trên TextBox (multiline) - Save cho phép chung ta ghi nội dung file trên Textbox. 57
  57. Bài 7: Sử dụng các đối tượng Mã bài: MĐ16_B07 Giới thiệu: Bài học cung cấp các kiến thức về các đối tượng trong C# dùng để thiết kế các Form như: : TextBox, Button, Label, ListBox, ComboBox, ListView, TrewView. Mục tiêu : - Trình bày được các chức năng, thuộc tính và các sự kiện thường dùng của các đối tượng: TextBox, Button, Label, ListBox, ComboBox, ListView, TrewView; - Trình bày được các bước sử dụng các đối tượng; - Sử dụng được các đối tượng để thiết kế Form theo yêu cầu của bài tập; - Thực hiện được các biện pháp an toàn cho máy tính. 1. Sử dụng TextBox, Button, Label * Label - Chức năng: Hiển thị dữ liệu - Thuộc tính: 58
  58. Một số thuộc tính cơ bản Tên thuộc tính Chức năng Tên của label (như kiểu tên biến vậy). Nó rất quan (name) trọng BackColor Màu nền của label BorderStyle Kiều viền Label Các thuộc tính trong này cho phép thay đổi kiểu Font chữ, cỡ chữ trong label ForeColor Màu chữ trong label True: hiện trên form. Visible False: ẩn đi TextAlign Căn lề chữ * TextBox - Chức năng: textbox chủ yếu là để nhập dữ liệu đầu vào, ngoài ra còn có thể dùng để xuất dữ liệu. - Thuộc tính: 59
  59. Một số thuộc tính cơ bản Tên thuộc tính Chức năng Tên của textbox (như kiểu tên biến vậy). Nó rất quan (name) trọng BackColor Màu nên của texbox BorderStyle Kiều viền texbox Cursor Con trỏ chuột khi rể chuột qua texbox Cho phép copy chữ và sửa trong texbox hay không Enabled (true/false) Các thuộc tính trong này cho phép thay đổi kiểu chữ, cỡ Font chữ trong textbox ForeColor Màu chữ trong textbox Multiline Cho phép nhiều dòng PaswordChar Khi nhập vào sẽ được mã hóa thánh dấu * ReadOnly Gần giống Enabled. Nhưng vẫn có thể bôi đen copy được Khi chữ vượt quá kích thước textbox thì sẽ xuất hiện ScrollBars thanh cuộn. Nên bật Multiline Text Nội dung (giá ttrị) trong textbox. Kiểu dũ liệu: string Visible True: hiện trên form. 60
  60. False: Ẩn trên form WordWrap Ngắt dòng khi chạm lề - Sự kiện Một số sự kiện thường dùng - TextChanged: sự kiện xẩy ra khi chữ trong textbox thay đổi - KeyUp: sự kiện khi đang gõ chữ trong textbox (bắt đầu ấn nút). Ứng dụng rất lớn. * Button - Chức năng Button được dùng chủ yếu để bắt đầu thực hiện một thuật giải (từ Input -> Output) bằng sự kiện click. - Thuộc tính 61
  61. Một số thuộc tính cơ bản Tên thuộc tính Chức năng Tên của button (như kiểu tên biến vậy). Nó rất quan (name) trọng BackColor Màu nền của button BackgroundImage Ảnh nền button Cursor Con trỏ chuột khi rê chuột qua buton Cho phép click vào nút (true) hoặc không cho click vào Enabled nút (false) Các thuộc tính trong này cho phép thay đổi kiểu chữ, cỡ Font chữ hiển thị trên button Text Nội dung (giá ttrị) trong textbox. Kiểu dũ liệu: string True: hiện trên form. Visible False: Ẩn trên form - Sự kiện 62
  62. Một số sự kiện cơ bản 1. Click. - Đây là sự kiện (những lệnh sẽ thực hiện) khi click vào button này - Cách khác để thêm sự kiện click ta click kép vào button (đang trong chế độ Design) thì nó sẽ hiện ra code của sự kiện click button này! Code của sự kiện click có kiểu: private void button1_Click(object sender, EventArgs e) { //Code của sự kiện } trong đó button1 là (name) của nút - Khi click vào button này thì chương trình sẽ thực hiện toàn bộ code trong 2 dấu { } 2. MouseHover - Sự kiện (những lệnh sẽ thực hiện) khi rê chuột lên trên button này 3.MouseLeave - Sự kiện khi đã rê chuột lên trên nó rồi di chuột ra khỏi nó Bài tập 63
  63. Yêu cầu: - Tạo form như trên - Khi click vào nút đăng nhập sẽ hiển thị thông tin đăng nhập ở phần thông tin đăng nhập - Khi click vào nút thoát sẽ đóng Form. Trình tự thực hiện TT Nội dung Yêu cầu Hình ảnh kỹ thuật Bước Tạo Form trên Project Tạo form 1 Trong cửa sổ Solution với tên Explorer Chuột phải vào form tên Project-> Chọn Add -> chính xác Windows Form Gõ tên Form: frmLabelTextboxButton.cs Bước Tạo giao diện 2 a. Kéo và thả các đối tượng Kéo và lên Form thả chính - Kéo và thả Label trên xác các 64
  64. ToolBox vào form 3 đối tượng lầntạo label1, label2, vào đúng label3 vị trí trên - Kéo và thả TextBox trên forn ToolBox vào form 2 lần tạo textbox1, textbox2 - Kéo và thả Button trên ToolBox vào form 2 lần tạo button1, button2 Thiết lập b. Thiết lập các thuộc tính chính xác label1.Text = "Tên người các thuộc dùng"; tính label2.Text = "Mật khẩu" label3.Text = "Thông tin đăng nhập:"; textbox1: Name = txtUserName textbox2: Name= txtPass PasswordChar = '*'; buton1: Name=btLogin Text = "Đăng &nhập" button2 Name=btExit Text = "&Thoát" Bước Viết code Viết 3 a. Code cho sự kiện Click code của nút Đăng nhập: chính xác 65
  65. privatevoid btLogin_Click(object sender, EventArgs e) { lbInfo.Text += "\n Tên người dùng: " + txtUserName.Text + "\n Mật khẩu là: "+txtPass.Text; } b. Code cho sự kiện Click của nút Thoát: privatevoid btExit_Click(object sender, EventArgs e) { this.Close(); } Bước Biên dịch Lựa chọn 4 Debug\Build Solution - F6 chính xác Bước Chạy Form Lựa chọn 5 Debug\Start Debugging- chính F5 xác. Chạy được form. 2. Sử dụng ListBox ListBox 66
  66. * Chức năng: Cho phép xem chọn các dòng dữ liệu * Một số thuộc tính thường dùng Tên thuộc tính Chức năng Tên của ListBox (như kiểu tên biến vậy). Nó rất quan (name) trọng Mảng các dòng trong ListBox Items[0]= “Cat” Items Items[1]= “Mouse” true: Chia ListBox thành nhiều cột MutiColumn false: Không chia ListBox thành nhiều cột Trả về dòng hiện thời được chọn Nếu chọn nhiều dòng thì trẻ về 1 giá trị tùy ý của các SelectedIndex dòng được chọn SelectedItem Trả về giá trị dòng được chọn SelectedItems Trả về mảng giá trị các dòng được chọn Có (true)/Không (false) sắp xếp dữ liệu trong ListBox. Sorted Ngầm định là false Xác định số lượng dòng được chọn của ListBox One: Chỉ được chọn 1 dòng SelectionMode Muli: được chọn nhiều dòng Riêng với thuộc tính Items có một số phương thức thường dùng - Add(“string”): thêm 1 dòng vào ListBox Ví dụ: listbox1.Items.Add(“Cat”); listbox1.Items.Add(“Mouset”); - RemoveAt(row): Xóa dòng ở vị trí row Ví dụ: listbox1.Items.RemoveAt(row) - Clear: Xóa tất cả các dòng Ví dụ: listbox1.Items.Clear();; * Một số sự kiện thường dùng SelectedIndexChanged: Xảy ra khi chọn một dòng. Bài tập 67
  67. Yêu cầu: - Tạo Form - Nhấn vào nút Add sẽ thêm họ tên sinh viên vào ListBox Danh sách sinh viên - Nhấn vào nút Remove sẽ xóa đi item đang được chọn trong ListBox - Nhấn vào nút Clear sẽ xóa toàn bộ các item trong ListBox - Nhấn vào nút Exit sẽ đóng Form Trình tự thực hiện TT Nội dung Yêu Hình ảnh cầu kỹ thuật Bước Tạo Form trên Project Tạo 1 Trong cửa sổ Solution form Explorer Chuột phải vào tên với Project-> Chọn Add -> tên Windows Form form Gõ tên Form: chính frmListBox.cs xác 68
  68. Bước Tạo giao diện 2 a. Kéo và thả các đối tượng Kéo lên Form và - Kéo và thả Label trên thả ToolBox vào form 2 lần tạo chính label1, label2 xác - Kéo và thả Listbox trên các ToolBox vào form listbox1 đối - Kéo và thả TextBox trên tượng ToolBox vào form tạo vào textbox1 đúng - Kéo và thả Button trên vị trí ToolBox vào form 4 lần tạo trên button1, button2, button3, forn button4 b. Thiết lập các thuộc tính label1.Text = "Danh sách sinh viên"; label2.Text = "Họ tên sinh viên" Thiết textbox1: lập Name = txtHoten chính buton1: xác Name=btAdd Text = "Add" 69
  69. button2 các Name=btRemove thuộc Text = "Remove" tính button3 Name=btClear Text = "Clear" Button4 Name=btExit Text = "Exit" Bước Viết code Viết 3 a. Code cho sự kiện Click code của nút Add: chính privatevoid xác btAdd_Click(object sender, EventArgs e) { lbDSSV.Items.Add(txtH oten.Text); txtHoten.Clear(); } b. Code cho sự kiện Click của nút Remove: privatevoid btRemove_Click(object sender, EventArgs e) { int row = lbDSSV.SelectedIndex; if(row!=-1) { lbDSSV.Items.RemoveAt (row); } } 70
  70. c. Code cho sự kiện Click của nút Clear: privatevoid btClear_Click(object sender, EventArgs e) { lbDSSV.Items.Clear(); } d. Code cho sự kiện Click của nút Thoát: privatevoid btExit_Click(object sender, EventArgs e) { this.Close(); } Bước Biên dịch Lựa 4 Debug\Build Solution - F6 chọn chính xác Bước Chạy Form Lựa 5 Debug\Start Debugging- F5 chọn chính xác. Chạy được form. 3. Sử dụng ComboBox ComboBox - Chức năng: Là sự kết hợp của TextBox và ListBox - Thuộc tính: Một số thuộc tính thường dùng Tên thuộc tính Chức năng Tên của ComboBox (như kiểu tên biến vậy). Nó rất quan (name) trọng 71
  71. Xác định kiểu của ComboBox Simple: Gõ giá trị DropDownStyle DropDown: Chọn hoặc gõ giá trị DropDownList: Chỉ cho phép chọn giá trị Mảng các dòng trong ComboBox Items Items[0]= “Cat” Items[1]= “Mouse” Trả về chỉ số dòng được chọn SelectedIndex Nếu không chọn nó có giá trị -1 SelectedItem Trả về giá trị dòng được chọn Có (true)/Không (false) sắp xếp dữ liệu trong ListBox. Sorted Ngầm định là false Riêng với thuộc tính Items có một số sự kiện thường dùng - Add(“string”): Thêm một dòng vào ComboBox - RemoveAt(row): Xóa dòng ở vị trí row - Clear(): Xóa tất cả các dòng. - Sự kiện thường dùng là SelectedIndexChanged: Xảy ra khi chọn một dòng Bài tập Yêu cầu: - Tạo Form như trên - Khi LoadForm thì sẽ tự động thêm các dòng vào ComboBox: cboFont là các font chữ; cbo size và các cơ chữ (8-72) - Khi chọn font trong combobox thì font chữ của label “Hướng đãn sử dụng ComboBox” sẽ được thay đổi theo - Khi chọn Size trong combobox thì cỡ chữ của label “Hướng đãn sử dụng ComboBox” sẽ được thay đổi theo Trình tự thực hiện TT Nội dung Yêu cầu Hình ảnh kỹ thuật 72
  72. Bước Tạo Form trên Project Tạo 1 Trong cửa sổ Solution form với Explorer Chuột phải vào tên tên form Project-> Chọn Add -> chính Windows Form xác Gõ tên Form: frmComboBox.cs Bước Tạo giao diện 2 a. Kéo và thả các đối tượng Kéo và lên Form thả chính - Kéo và thả Label trên xác các ToolBox vào form 3 lần tạo đối label1, label2, label3 tượng - Kéo và thả ComboBox trên vào đúng ToolBox vào form 2 lần tạo vị trí combobox1, combobox2 trên forn b. Thiết lập các thuộc tính Thiết lập label1.Text = "Font"; chính label2.Text = "Size"; xác các label2.Text = "Hướng dẫn sử dụng ComboBox"; thuộc tính combobox1 Name=cbFont Combobox2 Name=cbSize 73
  73. Bước Viết code Viết 3 a. Code cho sự kiện Load code Form: chính privatevoid xác frmComboBox_Load(obje ct sender, EventArgs e) { FontFamily[] font = FontFamily.Families; for (int i = 0; i < font.Length; i++) cboFont.Items.Add(fon t[i].Name); for (int i = 8; i <= 72; i++) cboSize.Items.Add(i); } b. Code cho sự kiện SelectedIndexChanged của combobox font: privatevoid cboFont_SelectedIndex Changed(object sender, EventArgs e) { lbContent.Font = newFont(cboFont.Text, lbContent.Font.Size); } c. Code cho sự kiện SelectedIndexChangedcủa combobox size: privatevoid cboSize_SelectedIndex Changed(object sender, EventArgs e) 74
  74. { lbContent.Font = newFont(lbContent.Fon t.Name, (float)Convert.ToDoub le(cboSize.Text)); } Bước Biên dịch Lựa 4 Debug\Build Solution - F6 chọn chính xác Bước Chạy Form Lựa 5 Debug\Start Debugging- F5 chọn chính xác. Chạy được form. 4. Sử dụng ListView ListView - Chức năng Dùng để hiển thị dữ liệu theo các dòng và các cột - Thuộc tính Một số thuộc tính thường dùng 75
  75. Tên thuộc tính Chức năng Tên của ListView (như kiểu tên biến vậy). Nó rất quan (name) trọng Có (true)/ không (false) các checkbox trên các dòng dữ CheckBoxes liệu Columns Các cột hiển thị trong chế độ Details Chỉ định rằng mọi SubItems được Hightlighted cùng với FullRowSelecT Item khi được chọn GridLines Hiển thị lưới (chỉ hiển thị trong chế độ Details) Items Mảng các dòng (ListViewItem) trong ListView MultiSelect Có(true)/không(false) cho phép chọn nhiều dòng Text SelectedItems Mảng các dòng được chọn Kiểu hiển thị của ListView Icons: HIển hị danh sách theo các biểu tượng List: Hiển thị danh sách theo 1 cột View Details: Hiển thị danh sách theo nhiều cột - Môt số phương thức thường dùng + Add: Thêm một dòng vào ListVew + Clear: Xóa tất cả các dòng của ListView + Remove: Xóa một dòng trong ListView + RemoveAt(index): Xóa một dòng ở vị trí index. - Sự kiện thường dùng ItemSelectionChange: Xảy ra khi chọn một dòng Bài tập a. Tạo Form như hình trên b. Khi nhấn vào nút New thì sẽ xóa trắng các TextBox c. Khi nhấn vào nút Save thì thêm 1 item thông tin sinh viên vào ListView d.Khi nhấn vào nút Delete sẽ xóa đi item đang được chọn ở ListView 76
  76. Trình tự thực hiện TT Nội dung Yêu cầu Hình ảnh kỹ thuật Bước Tạo Form trên Project Tạo 1 Trong cửa sổ Solution form với Explorer Chuột phải vào tên tên form Project-> Chọn Add -> chính Windows Form xác Gõ tên Form: frmListView.cs Bước Tạo giao diện 2 a. Kéo và thả các đối tượng Kéo và lên Form thả chính - Kéo và thả Label trên xác các ToolBox vào form 5 lần tạo đối label1, label2, label3, label4, tượng label5 vào đúng - Kéo thả TextBox vào form vị trí 4 lần tạo textbox1, textbox2, trên forn textbox3, textbox4 - Kéo và thả ComboBox trên ToolBox vào form 1 lần tạo combobox1 - Kéo và thả Button vào form 3 lần tạo button1, button2, 77
  77. button3 Thiết lập - Kéo thả ListView vào form chính 1 lần taon listview1 xác các b. Thiết lập các thuộc tính thuộc label1.Text = "Mã sinh viên"; tính label2.Text = "Ngày sinh"; label3.Text = "Họ và tên"; label4.Text = "Địa chỉ"; label5.Text= “Giới tính”; textbox1.Name= “txtMasv” textbox2.Name= “txtHoten” textbox3.Name= “txtNgaysinh” textbox4.Name= “txtDiachi” combobox1 Name=cbGioitinh cbGioitinh.Items.AddR ange(newobject[] { "Nam", "Nữ", "Khác"}); cbGioitinh.Text= “Nam”; button1 Name=btNew Text=New button2 Name=btSave Text=Save button3 Name=btDelete Text=Delete listview1 name=lvDSSV Columns: - Nhấn vào nút phần Collection - Chọn Add trong hộp thoại 78
  78. ColumnsHeader Collection Editor - Thay đổi thuộc tính Text của mỗi columns với tên cột tương ứng là Mã sinh viên, Họ và tên, Ngày sinh, Địa chỉ, Giới tính - Nhấn chọn OK. View=Details FullRowSelect = true; GridLines = true; Bước Viết code Viết 3 - Khai báo biến code int row=-1; // biến này dùng chính để lưu số thứ tự item (dòng) xác đang được chọn - Code cho sự kiện click nút New: privatevoid btNew_Click_1(object sender, EventArgs e) { row = -1; txtMasv.Enabled = true; txtDiachi.Text = ""; txtHoten.Text = ""; txtMasv.Text = ""; 79
  79. txtNgaysinh.Text = ""; } - Code cho sự kiện click của nút Save privatevoid btSave_Click(object sender, EventArgs e) { if(row==-1) { // Thêm mới if (txtMasv.Text != ""&& txtNgaysinh.Text != ""&& txtHoten.Text != ""&& txtDiachi.Text != "") { ListViewItem item = newListViewItem(); item.Text = txtMasv.Text; item.SubItems.Add(txt Hoten.Text); item.SubItems.Add(txt Ngaysinh.Text); item.SubItems.Add(txt Diachi.Text); item.SubItems.Add(cbG ioitinh.Text); lvDSSV.Items.Add(item ); } } else { // Sửa 80
  80. lvDSSV.Items[row].Sub Items[1].Text= txtHoten.Text; lvDSSV.Items[row].Sub Items[2].Text=txtNgay sinh.Text; lvDSSV.Items[row].Sub Items[3].Text=txtDiac hi.Text; lvDSSV.Items[row].Sub Items[4].Text=cbGioit inh.Text; } } - Code cho sự kiện SelectedIndexChanged của listview lvDSSV: privatevoid lvDSSV_SelectedIndexC hanged(object sender, EventArgs e) { foreach (ListViewItem item in lvDSSV.Items) if (item.Selected) { row = item.Index; txtMasv.Text = item.Text; txtHoten.Text = item.SubItems[1].Text ; 81
  81. txtNgaysinh.Text = item.SubItems[2].Text ; txtDiachi.Text = item.SubItems[3].Text ; cbGioitinh.Text = item.SubItems[4].Text ; txtMasv.Enabled = false; } } - Viết code cho sự kiện click nút Delete privatevoid btDelete_Click_1(obje ct sender, EventArgs e) { if (row != -1) lvDSSV.Items.RemoveAt (row); } Bước Biên dịch Lựa 4 Debug\Build Solution – F6 chọn chính xác Bước Chạy Form Lựa 5 Debug\Start Debugging- F5 chọn chính xác. 82
  82. Chạy được form. 5. Sử dụng TreeView 5.1. Cấu trúc cây và điều khiển TreeView Cấu trúc cây là một mô hình dữ liệu thường gặp trong thực tế. Mỗi một phần tử trong cây gọi là một Node, mỗi một cấu trúc cây gồm có: * Root Node: gọi là Node gốc (gốc của cây). Nó có một hoặc nhiều Node con và không có Node cha. * Parent Node: là Node nằm dưới Root Node. Nó có một hoặc nhiều Node con. * Leaf Node : là Node lá, nó không có Node con nào. Ví dụ cây thư mục, mỗi ổ đĩa là Root Node (gốc của cây), môi thư mục là một Parent Node, trong thư mục có thể lại là thư mục con, thư mục con không chứa thư mục nào bên trong nữa sẽ là Node lá. TreeView là một điều khiển dùng để hiển thị các cấu trúc dạng cây. Trong WinForm, mỗi một cây được biểu diễn bởi lớp TreeNode. * Thuộc tính Thuộc tính Ý nghĩa Nodes Trả về một đối tượng thuộc lớp TreeNode SelectedNode Trả về Node đang được chọn trong TreeView ShowPlusMinus Hiển thị dấu + và dấu – trước TreeNode ShowRootLines Hiển thị đường thẳng nối giữa các RootNode trong một TreeView ImageIndex Chúng ta có thể đặt Image trước mỗi một Node trong treeView. Thuộc tính ImageIndex chỉ ra ảnh sẽ được đặt trước mỗi Node, phải tạo ImageList trước khi dùng ImageIndex SelectedImageIndex ảnh sẽ hiển thị trước mỗi nút được chọn Ví dụ: treeview1.ImageList=imageList1; treeview1.ImageIndex=0; // lấy ảnh đầu tiên 83
  83. treeview1.SelectedImageIndex=1; // Lấy ảnh thứ 2 * Phương thức - GetNodeCount(): Đếm số cây trong 1 treeview: treeview1.GetNodeCount(false) Đếm số Node trong một cây: treeview1.Node[0].GetNodeCount(false) - ExpandAll(): Mở tất cả các nút đang có trong TreeView - CollapseAll(): Co các Node hiện có trong TreeView - GetNodeAt(): Lấy một Node tại một vị trí (dùng cho sự kiện MouseDown hoặc NodeMouseClick) * Sự kiện - AfterCollapse: xảy ra khi co lại một TreeNode - AfterExpand: Xảy ra khi mở Node trong TreeNode - AfterSelect: Xảy ra khi chọn một TreeNode - NodeMouseClick: Xảy ra khi chọn một nút 5.2. Các thuộc tính, phương thức, sự kiện của lớp TreeNode TreeView dùng để hiển thị, nhưng cái gì sẽ hiển thị trong TreeView thì do TreeNode tạo ra. Mỗi một Node trong TreeView là một đối tượng TreeNode Bảng dưới đây liệt kê các thuộc tính, phương thức thông dụng của TreeNode 84
  84. 5.3. Khởi tạo TreeView Cũng như các điều khiển khác, có thể tạo TreeView bằng cách viết mã lệnh hoặc có kéo thả trực quan. Để tạo TreeView từ dòng lệnh, các mã lệnh được viết trong hàm InitializeComponent() trong file *.Designer.cs hoặc trong phương thức khởi tạo của mỗi Form. Nếu viết bằng mã lệnh sẽ mất rất nhiều công sức, để phát triển ứng dụng nhanh, lựa chọn kéo thả vẫn là lựa chọn hàng đầu. Kéo thả từ TreeView từ ToolBox ra Form, sau đó chọn thuộc tính Node tạo các Node bên trong TreeView 85
  85. Việc kéo thả và tạo các Tree Node bên trong TreeView chỉ được hiện khi các Node là tĩnh, tức chúng ta biết trước được có nhiêu Tree Node và tên các Node. Tuy nhiên có những tình huống số Tree Node là động thì chúng ta không thể thiết kế trực quan, ví dụ yêu cầu tạo một Treeview để hiển thị các nhóm sản phẩm và các sản phẩm trong mỗi nhóm, dữ liệu về nhóm sản phẩm và sản phẩm đọc từ bảng trong cơ sở dữ liệu. Trong trường hợp này thì chúng ta chỉ có thể kéo thả TreeView, còn việc tạo các Tree Node bên trong phải dùng lệnh vì chúng ta chưa biết trước có bao nhiêu nhóm sản phẩm cũng như tên các nhóm. 5.4. Bài tập Tạo Form hiển thị Cây thư mục Trình tự thực hiện TT Nội dung Yêu Hình ảnh cầu kỹ 86
  86. thuật Bước Tạo Form trên Project Tạo 1 Trong cửa sổ Solution form Explorer Chuột phải vào tên với Project-> Chọn Add -> tên Windows Form form Gõ tên Form: chính frmTreeView.cs xác Bước Tạo giao diện 2 a. Kéo và thả các đối tượng Kéo lên Form và - Kéo và thả TreeView trên thả ToolBox vào form tạo chính treeview1 xác các đối tượng vào đúng vị trí trên forn 87
  87. b. Thiết lập các thuộc tính Thiết form frmTreeView lập Text= “Windows Explorer” chính treevew1 xác Dock=Fill các thuộc tính Bước Viết code Viết 3 - Khai báo không gian tên code using System.IO; chính - Phương thức createTreeView: Tạo xác TreeView gồm có các thư mục gốc publicvoid createTreeView() { string[] drives = Directory.GetLogicalD rives(); TreeNodenode = null; foreach (string drv in drives) { node = newTreeNode(drv); treeview1.Nodes.Add(n ode); node.Nodes.Add(""); } } - Phương thức thêm các node (thư mục con) vào Node (thư mục gốc) Phương thức này được gọi trong sự kiện BeforeExpand void Adddir(TreeNode node) 88
  88. { string path = node.FullPath; foreach (string dir inDirectory.GetDirect ories(path)) { TreeNode n = node.Nodes.Add(Path.G etFileName(dir)); n.Nodes.Add(""); } } - Bắt sự kiện BeforeExpand của TreeView privatevoid treeview1_BeforeExpan d(object sender, TreeViewCancelEventAr gs e) { TreeNode node = e.Node; node.Nodes.Clear(); Adddir(node); } - Sự kiện LoadForm privatevoid frmTreeView_Load(obje ct sender, EventArgs e) { createTreeView(); } 89
  89. Bước Biên dịch Lựa 4 Debug\Build Solution - F6 chọn chính xác Bước Chạy Form Lựa 5 Debug\Start Debugging- F5 chọn chính xác. Chạy được form. Bài tập 1. Viết chương trình nhập vào 2 số a, b và c cho biết số lớn nhất và nhỏ nhất trong 3 số a, b và c với giao diện như sau 2. Viết chương trình gồm 1 form trong đó có 1 button và 1 label hiển thị số lần nhấn button đó. 90
  90. 3. Thiết kế giao diện và cài đặt chương trình như sau: Hình 8: Các phép toán cơ bản 4. Máy tính đơn giản thực hiện các chức năng +, -, *, /. 5. Tạo một ứng dụng Windows Form cơ bản tính tiền công dịch vụ tại phòng nha. Với mỗi khách hàng, các dịch vụ cung cấp gồm: tẩy răng, cạo vôi, chụp hình răng và trám răng. Mỗi loại sẽ có chi phí riêng. Cuối cùng tính tổng các chi phí mà người khách phải trả. Lưu ý: chỉ tính tiền khi phần thông tin tên khách hàng đã được nhập (nếu thông tin này chưa có thì chương trình phát sinh MessageBox cảnh báo). Ứng dụng có giao diện đơn giản như hình 1 bên dưới. 91
  91. 6. Tạo Form có cấu trúc như hình dưới đây 7. Thêm vào project Form frmSinhvien thực hiện thao tác nhập danh sách sinh viên: 8. Tạo Project QuanlyHanghoa và tạo các Form sau: - Tạo Form frmKetnoi - Tạo Form frmDSmathang
  92. - Tạo Form frmThongtinMH Yêu cầu khi chọn xem thông tin chi tiết mặt hàng ở form trên set hiển thị form Thông tin chi tiết mặt hàng. 94
  93. Bài 8: Một số tính năng khác Tạo ứng dụng MDI Mã bài: MĐ16_B08 Giới thiệu: Trong bài học này chúng ta sẽ nghiên cứu cách tạo ra ứng dụng đa tài liệu MDI. Mục tiêu : - Trình bày được các bước tạo ứng dụng đa tài liệu (MDI); - Tạo được ứng dụng đa tài liệu ; - Thực hiện được các biện pháp an toàn cho máy tính. Một ứng dụng MDI (Multiple-document interface) là 1 ứng dụng cho phép bạn hiển thị cùng một lúc nhiều cửa sổ (document) khác nhau và cùng nằm trong 1 cửa sổ (document). Form cha là form có thể chứa các form con ở trong nó. Để thiết lập 1 Form thông thường thành form cha chúng ta chỉ cần thay đổi thuộc tính IsMdiContainer=true Form con là form được chứa trong form cha. Để 1 form thông thường trở thành form con chúng ta cần thay đổi thuộc tính MdiParentcủa form khi chạy form con. Form_name.MdiParent=Parent_Form_name; Trình tự thực hiện TT Nội dung Yêu Hình ảnh cầu kỹ thuật Bước Tạo Project Tạo 1 - Khởi động phần mền Visual Project C# 2010 với tên - File\ New Project chính xác - Chọn Windows Form Application - Gõ tên project: project_MDI 95
  94. Bước Tạo Form cha (Parent Form) Tạo 2 - Trong cửa sổ Solution Form Explorer Chuột phải vào tên với tên Project-> Chọn Add -> chính Windows Form xác - Gõ tên Form: frmParent.cs - Thiết lập các thuộc tính cho Thiết form cha lập IsMdiContainer=true chính WindowState= Maximized xác các thuộc tính Kéo và - Kéo và thả Button vào form thả - Thiết lập thuộc tính chính Button1.Text= “Chidl” xác Button 96
  95. lên form Bước Tạo Form con (Chidl Form) Tạo 3 - Trong cửa sổ Solution Form Explorer Chuột phải vào tên với tên Project-> Chọn Add -> chính Windows Form xác - Gõ tên Form: frmChild.cs - Kéo và thả PictureBox vào Chọn form và kéo thả đúng đối tượng Picture Box - Thiết lập các thuộc tính Thiết cho pictureBox1 lập + Dock=Fill đúng +Image: các Nhấn chọn Import\ Chọn 1 thuộc ảnh bất kỳ. tính + SizeMode = StretchImage 97
  96. Bước Viết code cho sự kiện click Viết 4 của nút Child trên Form cha code privatevoid chính button1_Click(object xác sender, EventArgs e) { frmChild frm = newfrmChild(); frm.MdiParent = this; frm.Show(); } Bước Biên dịch Lựa 4 Debug\Build Solution - F6 chọn chính xác Bước Chạy Form Lựa 5 Debug\Start Debugging- F5 chọn chính xác. Chạy được form. Bài tập 1. Tạo project quanlydiem và tạo Form frmMain là Form cha chứa các form con. 98
  97. - Khi chọn Quản lý điểm trong thực đơn Quản lý sẽ hiển thị Form con frmdiem - Khi chọn Quản lý môn học trong thực đơn Quản lý sẽ hiển thị Form con frmMonhoc 99
  98. Bài 9: Truy cập và xử lý cơ sở dữ liệu Mã bài: MĐ16_B09 Giới thiệu: Bài học cung cấp các kiến thức về kết nối dữ liệu C# với SQL Server; hiển thị dữ liệu;thêm, sửa, xóa dữ liệu. Mục tiêu: - Trình bày khái quát về ADO.NET; - Trình bày được các thuộc tính của SQL Connection, SQL Command; - Sử dụng được các đối tượng kết nối cơ sở dữ liệu; - Sử dụng được các câu lệnh SQL cũng như các thủ tục của SQL để thao tác dữ liệu; - Thực hiện được các biện pháp an toàn cho máy tính. 1. Kết nối dữ liệu Tổng quan về ADO.NET ADO.NET là một trong các lớp nằm trong bộ thư viện lớp cơ sở của NET Framework để cho phép các ứng dụng Windows(như c#, VB.net) hay các ứng dụng Web(như ASP.Net) thao tác dễ dàng với các nguồn dữ liệu. Mục tiêu chính của ADO.NET là: - Cung cấp các lớp để thao tác dữ liệu trong cả hai môi trường là phi kết nối (Disconnected data) và kết nối (Connected data). - Tích hợp chặt chẽ với XML (Extensible Markup Language) - Tương tác với nhiều nguồn dữ liệu thông qua mô tả chung - Tối ưu truy cập nguồn dữ liệu (OLE DB & server). - Làm việc trên môi trường Internet Các lớp của ADO.NET được đặt trong Namespase là System.Data. Trong bài này, chúng ta chỉ tập trung vào các thao tác trên cơ sở dữ liệu SQL Server. ADO.NET cung cấp provider chuyên để thao tác với cơ sở dữ liệu SQL Server (nằm trong System.Data.Client). Vị trí ADO.NET trong kiến trúc của .NET Framework: 100
  99. Từ kiến trúc ta thấy rằng ADO.NET là một phần nội tại của .NET Framework, do vậy nó có thể được sử dụng trong tất cả các ngôn ngữ hộ trợ .NET như C#, VB.Net mà không có sự khác biệt nào (Tức là các chức năng cũng như cách sử dụng hoàn toàn giống nhau). ADO.NET được thiết kế để kết nối với cả dữ liệu phi kết nối trong môi trường đa tầng (Multi – Tier). Nó sử dụng XML để trao đổi dữ liệu phi kết nối do vậy dễ dàng khi giao tiếp giữa các ứng dụng không phải trên nền Windows. ADO.NET hỗ trợ hoàn toàn XML, nghĩa là chúng ta có thể nạp dữ liệu từ một tệp XML và thao tác như một CSDL, sau đó cũng có thể lưu kết quả ngược trở lại tệp XML do vậy có thể đi qua FireWall một cách dễ dàng. Để kết nối cơ sở dữ liệu chúng ta dùng các thành phần chính của ADO.NET. Đối tượng SQLConnection - Chức năng: Kết nối với cơ sở dữ liệu - Khai báo: SqlConnection name_sqlConnection; - Khởi tạo: + Khởi tạo không cung cấp chuỗi Name_sqlConnection=newSqlConnection(); + Khởi tạo cung cấp chuỗi kết nối Name_sqlConnection=newSqlConnection(connectionString); - Chuỗi kết nối cơ sở dữ liệu Khi kết nối cơ sở dữ liệu với SQL Server chúng ta có thể sử dụng đặc quyền của hệ điều hành hoặc của SQL Server + Cấu hình SQL chọn đặc quyền kết nối là hệ điều hành hoặc của SQL Server Chuột phải vào tên SERVER/ chọn Properties 101
  100. Chọn Security/ chọn SQL Server and Window Authentication mode + Chuỗi kết nối theo đặc quyền hệ điều hành Data source=server_name; initial catalog=database_name; integrated security=true; server_name: Tên của server database_name: Tên database + Chuỗi kết nối theo đặc quyền Server=server_name; database=database_name; User Id=your_username; Password=your_password; server_name: Tên của server database_name: Tên database your_username: Tên tài khoản đăng nhập cơ sở dữ liệu SQL your_password: Mật khẩu của tài khoản đăng nhập cơ sở dữ liệu SQL - Thuộc tính ConnectionString: Chứa chuỗi kết nối sqlConnection_name.ConnectionString= Chuoi_ke_noi; - Mở kết nối dữ liệu: sử dụng phương thức Open sqlConnection_name.Open(); - Đóng kết nối cơ sở dữ liệu: sử dụng phương thức Close sqlConnection_name.Close() - Giải phóng đối tượng: sử dụng phương thức Dispose sqlConnection_name.Dipose() 102
  101. Trình tự thực hiện TT Nội dung Yêu Hình ảnh cầu kỹ thuật Bước Tạo lớp kết nối Tạo lớp 1 - Chuột phải tên Project\ với tên Chọn Add\ Chọn Class chính - Gõ tên lớp trong mục name xác clsKetnoi.cs - Viết code Viết + Khai báo không gian tên code chính xác + Khai báo đối tượng lớp SqlConnection + Khai báo xâu chứa chuỗi kết nối + Hàm tạo không đối + Hàm tạo có đối khởi tạo cho chuỗi kết nối trong 2 trường hợp (Đặc quyền Windows hay SQL) 103
  102. + Phương thức Mở kết nối Gán chuối kết nối cho thuộc tính ConnectionSring Gọi phương thức Open của đối tượng Conn thuộc lớp SqlConnection + Phương thức đóng kết nối Gọi phương thức Close() Bước Tạo Form Kết nối Tạo 2 - Trong cửa sổ Solution Form Explorer Chuột phải vào tên với tên Project-> Chọn Add -> chính Windows Form xác - Gõ tên Form: frmKetnoi.cs Kéo và - Kéo và thả các đối tượng 104
  103. thả chính xác các đối tượng lên form - Thiết lập thuộc tính Thiết lập chính xác các thuộc tính Bước Viết code 3 * Sự kiện click nút Connect - Nếu chọn đặc quyền Window NT + Khai báo đối tượng thuộc lớp kết nối và sử dụng hàm tạo với tham số mode = 1 + Gọi phương thức OpenConn() của lớp kết nối trả giá trị về biến loi + Nếu loi=0 thì thông báo kết nôi thành công - Ngược lại chọn đặc quyền SQL Server + Khai báo đối tượng thuộc lớp kết nối và sử dụng hàm 105
  104. tạo với tham số mode = 0 + Gọi phương thức OpenConn() của lớp kết nối trả giá trị về biến loi + Nếu loi=0 thì thông báo kết nôi thành công - Sự kiện nút Cancel - Sự kiện rbWindow_CheckedChanged - Sự kiện rbSql_CheckedChanged Bước Biên dịch Lựa 4 Debug\Build Solution - F6 chọn chính 106
  105. xác Bước Chạy Form Lựa 5 Debug\Start Debugging- F5 chọn chính xác. Chạy được form. 2. Thao tác với dữ liêu: Thêm, sửa, xóa, lọc dữ liệu Đối tượng SqlCommand Đối tượng SqlCommand cho phép bạn chỉ định các loại tương tác mà bạn muốn thực hiện với một cơ sở dữ liệu. Ví dụ, bạn có thể dùng các câu lệnh chọn, thêm, chỉnh sửa và xoá trên một dòng dữ liệu trong một bảng dữ liệu. * Khai báo đối tượng SqlCommand sqlCommand; * Khởi tạo Có 4 kiểm khởi tạo để khai báo khởi tạo đối tượng này + sqlCommand = new SqlCommand(); + sqlCommand = new SqlCommand(string CommandText); + sqlCommand = new SqlCommand(string CommandText, SqlConnection sqlConnection_name); + sqlCommand = new SqlCommand(string CommandText, SqlConnection sqlConnection, SqlTrasaction sqlTransaction); * Các thuộc tính + CommandText: Cho phép khai báo một chuỗi phát biểu SQL Server Ví dụ : String strSQL = “Select * from tblHang”; sqlCommand = new SqlCommand(); sqlCommand.CommandText = strSQL; + CommandType: Cho phép ta chọn một trong 3 giá trị enum là Text,TableDirect,StoredProcedure Trong đó: CommandType.Text ứng với phát biểu SQL CommandType.TableDirect ứng với tên bảng dữ liệu CommandType.StoredProcedure ứng với tên thủ tục nội tại của SQL Server 107
  106. Ví dụ: String strSQL = “spDanhsachHang”; sqlCommand = new SqlCommand(); sqlCommand.CommandText = strSQL; sqlCommand.CommandType = CommandType.StoredProcedure; Lưu ý: khi thủ tục có tham số truyền vào thì ta có thể sử dụng đối tượng SqlParameterCollection hay SqlParameter + CommandTimeout Cho phép khai báo thời gian chờ thực thi phát biểu SQL được tính bằng giây (mặc định là 30 giây) Ví dụ: Cho phép thực thi thủ tục với thời gian 60 giây: string strSQL = “spDanhsachHang”; sqlCommand = new SqlCommand(); sqlCommand.CommandText = strSQL; sqlCommand.CommandType = CommandType.StoredProcedure; sqlCommand.CommandTimeout = 60; + Connection Cho phép ta khởi tạo đối tượng sqlConnection mà không cần phải thông qua Constructor Ví dụ: string strSQL = “spDanhsachHang”; sqlCommand = new SqlCommand(); sqlCommand.CommandText = strSQL; sqlCommand.Connection = sqlConnection; sqlCommand.CommandType = CommandType.StoredProcedure;sqlCommand.CommandTim eout = 60; * Phương thức + Phương thức ExecuteNonQuery Thực thi các phát biểu SQL, thử tục nội tại, và nó trả về số bản ghi được thực thi. Ví dụ 1 : Thực thi các phát biểu SQL sqlCommand.Connection = sqlConnection; sqlConnnection.Open(); String strSQL = “delete from tblHang where mahang = ‘S000001’”; 108
  107. sqlCommand = new SqlCommand(); sqlCommand.CommandText = strSQL; int records = sqlCommand.ExcuteNonQuery(); sqlConnection.Close(); sqlConnection.Dispose(); + Phương thức ExecuteScalar Phương thức này thực thi phát biểu SQL Server giá trị trả về là kiểu đối tượng (object) Nó thường được dùng để lấy giá trị của tổng các mấu tin hay giá trị của cột hay hàng thứ nhất + Phương thức ExecuteReader Khác với hai phương thức trên , phương thức này trả về tập các giá trị chỉ đọc một chiều và dùng đối tượng sqlDataReader để nắm dữ tập dữ liệu đó. + Phương thức ExcuteXmlReader Phương thức này tương tự như phương thức ExecuteReader nhưng nó trả về tập dữ liệu có định dạng XML và sử dụng đối tượng XMLReader để nắm dữ tập dữ liệu đó. Trình tự thực hiện TT Nội dung Yêu Hình ảnh cầu kỹ thuật Bước Tạo Form trên Project Tạo 1 Trong cửa sổ Solution form Explorer Chuột phải vào tên với Project-> Chọn Add -> tên Windows Form form Gõ tên Form: chính frmCNHang.cs xác 109
  108. Bước Tạo giao diện 2 + Kéo và thả các đối tượng Kéo thả chính xác các đối tượng, + Thiết lập các thuộc tính đúng vị trí Thiết lập chính xác các thuộc tính 110
  109. Bước Viết code lớp Viết 3 - Phương thức thực thi câu code lệnh SQL trên lớp chính clsConnect.cs xác using System; - Tạo lớp lọc dữ liệu using clsFillDatabase System.Collections.Generic; using System.Linq; + Khai báo đối tượng thuộc using System.Text; lớp clsConnect.cs using System.Data; using System.Data.SqlClient; + Phương thức lấy dữ liệu từ using System.Windows.Forms; câu lệnh truy vấn SQL trả về namespace pro_QLBH 1 DataTable { + Phương thức lấy dữ liệu từ classclsFillDatabase { thủ tục SQL trả về 1 clsConnect obj = DataTable newclsConnect(); + Phương thức Lọc dữ liệu // vào ComboBox //Lay DataTable tu mot thu tuc trong SQL // publicDataTable FillDataTable(string strQuery) { //Khai bao va khoi tao DataTable obj.OpenConn(); DataTabledataTable = newDataTable(); try 111
  110. { //Khai bao va khoi tao doi tuong SqlCommand SqlCommand sqlCommand = newSqlCommand(); //Khai bao tuoc tinh cua doi tuong SqlCommand sqlCommand.CommandText = strQuery; sqlCommand.CommandType = CommandType.Text; sqlCommand.Connection = obj.Conn; //Khai bao va khoi tao doi tuong SqlDataAdapter SqlDataAdapter sqlDataAdapter = newSqlDataAdapter(sqlCommand); //Khai bao va goi phuong thuc Fill sqlDataAdapter.Fill(dataTable) ; sqlDataAdapter.Dispose(); } catch (Exception ex) { MessageBox.Show(ex.Message, "SQL server 2000"); } obj.CloseConn(); return dataTable; } // //Lay DataTable tu mot thu tuc trong SQL su dung SQlParameter // 112
  111. publicDataTable FillDataTable(string strQuery, CommandType commandType, string[] Parameters, string[] Values) { //Khai bao va khoi tao dataTable obj.OpenConn(); DataTable dataTable = newDataTable(); try { //Khai bao va khoi tao doi tuong SqlCommand SqlCommand sqlCommand = newSqlCommand(); //Khai bao tuoc tinh cua doi tuong SqlCommand sqlCommand.CommandText = strQuery; sqlCommand.CommandType = commandType; sqlCommand.Connection = obj.Conn; //Khai bao va khoi tao doi tuong SqlParameter SqlParameter sqlParameter; for (int i = 0; i < Parameters.Length; i++) { sqlParameter = newSqlParameter(); sqlParameter.ParameterName = Parameters[i]; sqlParameter.SqlValue = Values[i]; sqlCommand.Parameters.Add(sqlP arameter); 113
  112. } //Khai bao va khoi tao doi tuong SqlDataAdapter SqlDataAdapter sqlDataAdapter = newSqlDataAdapter(sqlCommand); //Khai bao va goi phuong thuc Fill sqlDataAdapter.Fill(dataTable) ; sqlDataAdapter.Dispose(); } catch (Exception ex) { MessageBox.Show(ex.Message, "SQL server 2000"); } obj.CloseConn(); return dataTable; } publicvoid FillComboBox(ComboBox cboName, string strQuery, string strDispLay, string strValue) { DataTable tbl = newDataTable(); tbl = FillDataTable(strQuery); cboName.DataSource = tbl; cboName.DisplayMember = strDispLay; cboName.ValueMember = strValue; //cboName.SelectedIndex = 0; } } } Bước Code cho Form Viết 114
  113. 4 frmCNHang.cs code - Khai báo đối tượng thuộc chính clsFillDatabase fill = lớp clsConnect xác newclsFillDatabase(); clsConnect obj = - Khai báo đối tượng thuộc newclsConnect(); lớp clsFillDatabase int modeSave = 1; // 1 la them moi, 0 la sua - Phương thức thiết lập thuộc void setControl(bool ok) tính Enabled cho các đối { txtTenhang.Enabled tượng = ok; - Phương thức đưa dữ liệu txtDongia.Enabled = ok; vào DataGridView txtSoluong.Enabled - Sự kiện Load form = ok; txtMahang.Enabled - Sự kiến click nút Thêm mới = ok; - Sự kiện click nút Sửa cboNhom.Enabled = ok; - Sự kiện click nút Lưu cboDVT.Enabled = - Sự kiện nút Xóa ok; btDelete.Enabled = !ok; btEdit.Enabled = !ok; btSave.Enabled = ok; btNew.Enabled = !ok; } void GiveDatatoGridView() { DataTable tbl = newDataTable(); tbl = fill.FillDataTable("select a.mahang,tenmh,tendvt,tennhom, soluong,dongia from tblHang as a,tblDonvitinh as b, tblNhomhang as c where a.madvt=b.madvt and a.manhom=c.manhom"); dgDSMH.DataSource = tbl; } 115
  114. privatevoid frmCNHang_Load(object sender, EventArgs e) { fill.FillComboBox(cboDVT, "Select * from tblDonvitinh", "Tendvt", "madvt"); fill.FillComboBox(cboNhom, "select * from tblNhomhang", "tennhom", "manhom"); setControl(false); GiveDatatoGridView(); } privatevoid btNew_Click(object sender, EventArgs e) { modeSave = 1; setControl(true); txtDongia.Text = ""; txtMahang.Text = ""; txtSoluong.Text = ""; txtTenhang.Text = ""; } privatevoid btEdit_Click(object sender, EventArgs e) { modeSave = 0; setControl(true); } privatevoid btSave_Click(object sender, EventArgs e) { if (modeSave == 1) { 116
  115. string strSql = "Insert into tblHang(mahang,tenmh,madvt,man hom,soluong,dongia) values ('"+txtMahang.Text+"',N'"+txtT enhang.Text+"','"+cboDVT.Selec tedValue.ToString()+"','"+cboN hom.SelectedValue.ToString()+" ','"+txtSoluong.Text+"','"+txt Dongia.Text+"')"; obj.exeSql(strSql); GiveDatatoGridView(); setControl(false); } else { string strSql = "update tblHang set tenmh=N'"+txtTenhang.Text+"',m advt='"+cboDVT.SelectedValue.T oString()+"',manhom='"+cboNhom .SelectedValue.ToString()+"',s oluong='"+txtSoluong.Text+"' where mahang='"+txtMahang.Text+"'"; obj.exeSql(strSql); GiveDatatoGridView(); setControl(false); } } privatevoid dgDSMH_CellClick(object sender, DataGridViewCellEventArgs e) { txtMahang.Text = dgDSMH.CurrentRow.Cells[0].Val ue.ToString(); txtTenhang.Text = 117
  116. dgDSMH.CurrentRow.Cells[1].Val ue.ToString(); cboDVT.Text = dgDSMH.CurrentRow.Cells[2].Val ue.ToString(); cboNhom.Text = dgDSMH.CurrentRow.Cells[3].Val ue.ToString(); txtSoluong.Text = dgDSMH.CurrentRow.Cells[4].Val ue.ToString(); txtDongia.Text = dgDSMH.CurrentRow.Cells[5].Val ue.ToString(); } privatevoid btDelete_Click(object sender, EventArgs e) { if (MessageBox.Show("Bạn có xóa không?", "Xóa mặt hàng", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { string strSql = "Delete from tblHang where mahang='" + txtMahang.Text + "'"; obj.exeSql(strSql); GiveDatatoGridView(); setControl(false); } } Bước Biên dịch Lựa 5 Debug\Build Solution - F6 chọn chính xác 118
  117. Bước Chạy Form Lựa 6 Debug\Start Debugging- F5 chọn chính xác. Chạy được form. Bài tập Bài tập 1 Tạo cơ sở dữ liệu gồm 3 table: HANG(mahangsx,tenhangsx) LOAI(maloai,tenloai,mahangsx) MATHANG(mahanghoa, tenhanghoa, dongia, ghichu, maloai). Thí sinh tự chọn loại dữ lịch thích hợp. Tạo Diagram, nhập mẫu cơ sở dữ liệu test có 2 hãng sản xuất, mỗi hãng có 2 loại, mỗi loại có 2 mặt hàng với giá trị cột ghichu NULL. 1. Tạo form kết nối cơ sở dữ liệu như sau: 2. Khi người dùng kích chuột vào nút thoát chương trình hiện ra cửa sổ hỏi người dùng có chắc chắn muốn thoát không - Nếu người dùng chọn Yes chương trình sẽ thoát khỏi chương trình - Nếu người dùng chọn No chương trình sẽ trở lại chương trình 3. Khi textbox tên máy hoặc tên cơ sở dữ liệu để trống chương trình sẽ hiển thị báo cho người dùng biết, người dùng chọn Ok chương trình sẽ quay lại textbox đó. 119
  118. 4. a. Nếu chương trình kết nối không thành công cơ sở dữ liệu thì thông báo cho người dùng biết biết “kết nối đến cơ sở dữ liệu thất bại”. b. Nếu kết nối thành công thông báo cho người dùng biết kết nối thành công và hiển thị form như câu 3. 5. Tạo form theo cấu trúc: a. Khi người dùng chọn một hãng SX thì chương trình hiển thị danh sách loại mặt hàng thuộc hãng Đó (sắp xếp theo tên loại), chưa loại nào được chọn từ ComboBox này, và không có mặt hàng nào hiển thi trong danh Sách phía dưới. b. Người dùng chọn một loại mặt hàng để xem danh sách mặt hàng (thuộc loại đang chọn) hiển thị Trong danh sách phía dưới (thông tin hiển thị chỉ chứa tên mặt hàng, được đánh số thứ tự). 6. Người dùng có thể bấm phải chuột trên một mặt hàng từ danh sách để hiển thị popup menu chứa 2 menu (xem hình). Nếu người dùng bấm phải chuột trên danh sách khi chưa chọn mặt hàng nào thì hai menu này sẽ bị mờ, không cho sử dụng. 120
  119. 7. Khi người dùng chọn menu [Xóa mặt hàng đang chọn], chương trình sẽ xuất hiện hộp thoại xác nhận. - Nếu người dùng đồng ý, chương trình sẽ xóa mặt hàng này ra khỏi database và cập nhật danh sách trên màn hình). - Nếu người dùng không đồng ý trở lại chương trình. 8. a. Tạo form theo cấu trúc. b. Khi người dùng chọn menu [Hiển thị thông tin chi tiết của mặt hàng] hoặc Double click vào một mặt hàng trong danh sách, chương trình sẽ hiển thị form trên với thông tin mặt hàng đang chọn. c. Người dùng nhấn nút quay lại để thoát khỏi form. Bài tập 2 Cho cơ sở dữ liệu Quản lý điểm gồm các bảng: tblSinhVien(MaSV,Hoten,Ngaysinh, Noisinh, Gioitinh Diachi, Makhoa). tblKhoa(Makhoa, Tenkhoa) tblMonHoc(Mamon, Tenmon, Makhoa, Sohocphan, Giaovien) tblDiem(Mamon, MaSV, Diem) Hãy sử dụng hệ quản trị CSDL SQL Server hoặc (Microsoft Access) thực hiện các yêu cầu sau: a) Tạo các bảng trên. b) Tạo các ràng buộc giữa các bảng. c) Nhập vào mỗi bảng từ 5 đến 10 dòng dữ liệu. 121
  120. 1. Thiết kế Form frmMain theo mẫu sau: (5 điểm) Viết lệnh sao cho khi người sử dụng chọn thực đơn Quản lý Quản lý điểm , Quản lý môn học thì hệ thống mở Form frmDiem, frmMonHoc. 2. Sử dụng cơ sở dữ liệu ở câu 1, tạo form theo mẫu và thực hiện các yêu cầu sau: Yêu cầu : a) Khi chương trình thực thi frmMonHoc sẽ hiển thị toàn bộ danh sách môn học được nạp từ cơ sở dữ liệu vào Listview.đồng thời nút Xóa, nút sửa, các TextBox và combobox sẽ mờ đi (vô hiệu hóa). b) Khi người dùng click vào nút “cập nhật” trở thành nút “Thêm” các TextBox, combobox sẽ sáng (cho phép hoạt động) để nhập thông tin môn học và lưu lại trong cơ sở dữ liệu. c) Nút “Xóa” sẽ sáng khi người sử dụng click vào ListView và khi người sử dụng nhấn nút xóa thì sẽ xóa môn học khỏi CSDL và cập nhật lại ListView. 122
  121. d) Khi người dùng click và nút sửa cho phép sửa thông tin của phần tử được chọn và lưu lại trong cơ sở dữ liệu. 3. Sử dụng cơ sở dữ liệu ở câu 1, tạo form theo mẫu và thực hiện các yêu cầu sau: Yêu cầu : 1. Khi chương trình thực thi frmDiem sẽ hiển thị toàn bộ danh sách điểm của sinh viên được nạp từ cơ sở dữ liệu vào Listview 2. Xây dựng chức năng “CẬP NHẬT” để thêm thông tin điểm vào trong cơ sở dữ liệu và cập nhật lại trong ListView. Lưu ý: Nếu dữ liệu nhập không đúng chương trình sẽ báo lỗi và không thực hiện chức năng “CẬP NHẬT”. 3. Xây dựng chức năng “XÓA” xóa tất cả các phần tử được chọn. 4. Xây dựng chức năng “SỬA” cho phép sửa thông tin của phần tử được chọn và lưu lại trong cơ sở dữ liệu. 5. Xây dựng chức năng “TÌM KIẾM” thành viên theo khóa tìm kiếm là: MaSV, MaMH. 123
  122. Bài 10: Lập báo cáo với CrystalReport Mã bài: MĐ16_B10 Giới thiệu: Bài học này cung cấp các kiến thức giúp người học có thể tạo được một báo cáo trong C#. Mục tiêu : - Trình bày được các bước tạo báo cáo bằng công cụ Winzard; - Mô tả được các thuộc tính của đối tượng Crysral Report và Crystal Report Viewer; - Tạo được báo cáo đi theo bằng công cụ CrystalReport; - Thực hiện được các biện pháp an toàn cho máy tính. 1. Lập báo cáo bằng Winzard - Bố cục báo cáo Report Header Page Header Detail Tong so giao vien: 6 giao vien Report Footer Page Footer Page 1 - Kiến trúc sử dụng báo cáo 124
  123. Trình tự thực hiện - Bước 1: Tạo thủ tục + Trong SQL Server chọn New Query + Viết code tạo thủ tục createprocedure spDSGV as select*from tblGiaovien + Nhấn F5 để tạo thủ tục - Bước 2: Tạo CrystalReport + Chuột phải vào tên Project\ Chọn Add\ Chọn New Item 125
  124. + Chọn Reporting\ Chọn Crystal Report\ Gõ tên vào mục Name\ Nhấn chọn Add. + Xuất hiện cửa sổ Crystal Report Gallery: Chọn Using the Report Winzard, Standard + Chọn Ok +Chọn Creat New Connection 126
  125. + Chọn OLE DB(ADO) + Chọn Microsoft OLEDB Provider for SQL Server + Nhấn Next 127
  126. + Điền tên máy vào Server + Tích chọn Integrated Security + Database: Chọn cơ sở dữ liệu muốn truy vấn + Chọn Finish + Chọn thủ tục để đưa dữa liệu vào Report Chọn + 128
  127. + Chọn Next Chọn + Chọn các trường cần đưa vào Report + Chọn Finish - Bước 3: Gắn Report vào Form + Tạo Form mới frmrptDocgia + Chọn và thả đối tượng CrystalReportViewer vào form + Viết code cho sự kiện load form 129
  128. 2. Lập báo cáo không sử dụng Winzard Các công cụ tạo báo cáo - Text Oject: Tạo các chuỗi tiêu đề - Line Oject: Tạo đường kẻ - Box Oject: Tạo khung kẻ hình chữ nhật Trình tự thực hiện - Bước 1: Tạo thủ tục + Trong SQL Server chọn New Query + Viết code tạo thủ tục createprocedure spDSGV as select*from tblGiaovien + Nhấn F5 để tạo thủ tục - Bước 2: Tạo CrystalReport + Chuột phải vào tên Project\ Chọn Add\ Chọn New Item 130
  129. + Chọn Reporting\ Chọn Crystal Report\ Gõ tên vào mục Name\ Nhấn chọn Add. + Xuất hiện cửa sổ Crystal Report Gallery: Chọn As blank report + Chọn Ok + Thiết kế report 131
  130. + Chuột phải vào Database Fields\ Chọn Database Exprert + Chọn Current Connections\ Chọn thủ tục chứa dữ liệu cho Report +Chọn OK + Kéo và thả các trường vào đúng vị trí trên report 132
  131. + - Bước 3: Gắn Report vào Form + Tạo Form mới frmrptDocgia + Chọn và thả đối tượng CrystalReportViewer vào form + Viết code cho sự kiện load form Bài tập 133
  132. 1. Tiếp ý 3 bài tập 1 trong bài học số 9, hãy tạo báo cáo để hiển thị bảng điểm của học sinh theo mẫu sau BẢNG ĐIỂM MÔN Mã sinh viên Họ và tên Ngày sinh Điểm 2. Cho cơ sở dữ liệu: DOCGIA Field Name Description Mã độc giả Madg Hoten Họ và tên độc giả Gioitinh Gới tính Ngaysinh Ngày sinh Diachi Địa chỉ Coquan Cơ quan NHANVIEN Field Name Description Mã nhân viên Manv Hoten Họ và tên nhân viên Gioitinh Gới tính LOAISACH Field Name Description Mã loại Maloai Tenloai Tên loại Vitri Vị trí SACH Field Name Description Mã phòng Masach Tensach Tên sách Sotrang Số trang Tacgia Tác giả Loaisach Loại sách Nhaxb Nhà xuất bản Soluong Số lượng 134
  133. MUONTRA Field Name Description Mã nhân viên Manv Mã độc giả Madg Masach Mã sách Ngaymuon Ngày mượn Ngaytra Ngày trả Ngayhentra Ngày hẹn trả Hãy thực hiện các yêu cầu sau: * Tạo thư mục mang tên Họ và tên_Số báo danh của thí sinh vào ổ đĩa D hoặc nơi lưu trữ do giám thị coi thi yêu cầu, lưu tất cả nội dung bài làm vào thư mục này. - Tạo một cơ sở dữ liệu với tên qlthu_vien.mdf chứa các bảng dữ liệu trên trong SQL Server. Tạo các bảng dữ liệu với kiểu dữ liệu, độ rộng, , khóa chính, khóa phụ, (các ràng buộc toàn vẹn dữ liệu đầy đủ) của các trường sao cho phù hợp của bài toán. Nhập dữ liệu tối thiểu mỗi bảng 5 bảng ghi. - Tạo các form cập nhật dữ liệu cho các bảng (Cập nhật độc giả, cập nhật sách, cập nhật bảng mượn trả), trên form có lưới hiển thị dữ liệu, bao gồm các nút thêm, sửa, xóa, in dữ liệu (trừ bảng mượn trả) thoát. - Tạo report thống kê độc giả chưa trả sách ở thời điểm hiện tại. Tạo form thống kê độc giả chưa trả sách để sử dụng report vừa tạo. - Tạo report thống kê các độc giả đã mượn sách theo loại sách. Tạo form sử dụng report vừa tạo. - Tạo một form gồm hệ thống menu theo mẫu dưới đây rồi gắn tất cả các form đã tạo ở các câu trên vào chức năng trên menu. Cập nhật dữ liệu Thống kê Hệ thống 135