Bài giảng Cơ sở lập trình 2

pdf 108 trang phuongnguyen 1880
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cơ sở lập trình 2", để 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:

  • pdfbai_giang_co_so_lap_trinh_2.pdf

Nội dung text: Bài giảng Cơ sở lập trình 2

  1. === Bài giảng Cơ sở lập trình 2 ===
  2. Mục lục CHƢƠNG 1. LÀM QUEN VỚI VISUAL STUDIO 2010 5 1. Giới thiệu Visual Studio.NET 2010 5 1.1. Tình hình trƣớc khi Visual Studio.NET ra đời 5 1.2. Sự ra đời của Visual Studio.NET 5 1.3. Tổng quan về Visual Studio.NET 6 2. Khởi động Visual C# 2010 và giao diện 7 CHƢƠNG 2. VIẾT CHƢƠNG TRÌNH ĐẦU TIÊN 16 1. Đề bài 16 3. Mở đồ án mới 16 4. Thiết kế giao diện 16 4.1. Đặt tên và tiêu đề cho form 16 4.2. Thêm điều khiển hộp văn bản Textbox 17 4.3. Thêm điều khiển nút lệnh Button 17 5. Viết code 18 5.1. Viết code cho nút lệnh btnDisplay 18 5.2. Viết code cho nút lệnh btnClear 20 5.3. Viết code cho nút lệnh btnExit 20 6. Lƣu đồ án 20 7. Các tệp tin của đồ án 20 8. Chạy chƣơng trình 21 9. Dừng chƣơng trình 21 10. Mở đồ án đã có 21 11. Thoát khỏi Visual C# 2010 21 CHƢƠNG 3. DỮ LIỆU VÀ CẤU TRÚC ĐIỀU KHIỂN 22 1. Biến, hằng và các kiểu dữ liệu 22 1.1. Biến 22 1.2. Hằng 23 1.3. Các kiểu dữ liệu 23 1.4. Hàm chuyển đổi giữa các kiểu dữ liệu 27 Bài giảng Cơ sở lập trình 2 1
  3. 2. Hộp thoại thông báo – MessageBox 28 2.1. Khái niệm 28 2.2. Hộp thông báo MessageBox 28 2.3. Hàm thông báo MessageBox 30 3. Các cấu trúc điều khiển 30 3.1. Câu lệnh lựa chọn if 30 3.2. Câu lệnh lựa chọn Case 31 Bài tập 1. 32 3.3. Cấu trúc lặp for 36 3.4. Cấu trúc lặp while 36 3.5. Cấu trúc lặp do 37 3.6. Câu lệnh try catch 38 4. Hàm 39 4.1. Hàm có một giá trị trả về 39 4.2. Hàm không có giá trị trả về 40 4.3. Cách gọi hàm 40 4.4. Ví dụ minh họa 41 5. Gỡ rối chƣơng trình 42 5.1. Một số giải pháp giảm lỗi 42 CHƢƠNG 4. TÌM HIỂU CÁC ĐIỀU KHIỂN CƠ BẢN 43 1. Tìm hiểu thuộc tính, phƣơng thức và sự kiện 43 2. Mối quan hệ giữa thuộc tính, phƣơng thức và sự kiện 43 3. Thuộc tính, phƣơng thức, sự kiện của một số điều khiển cơ bản 44 3.1. Form 44 3.2. Hộp văn bản - TextBox 46 3.3. Nút lệnh – Button 48 3.4. Nhãn – Lable 49 3.5. Dòng mách nƣớc - ToolTip 49 3.6. Bài tập 50 Bài tập 2. 50 Bài giảng Cơ sở lập trình 2 2
  4. Bài tập 3. 53 Bài tập 4. 54 Bài tập 5. 55 4. Một số điều khiển cơ bản khác 57 4.1. Nhóm – GroupBox 57 4.2. Hộp đánh dấu – CheckBox 58 4.3. Nút tuỳ chọn – RadioButton 59 Bài tập 6. 60 Bài tập 7. 64 4.4. Hộp danh sách – ListBox 65 Bài tập 8. 67 Bài tập 9. 69 4.5. Hộp lựa chọn – ComboBox 71 Bài tập 10. 73 Bài tập 11. 74 Bài tập 12. 74 Bài tập 13. 75 4.6. Điều khiển CheckedListBox 77 Bài tập 14. 77 4.7. Điều khiển NumericUpDown 79 Bài tập 15. 79 4.8. Thanh cuộn HScrollBar và VScrollBar 81 Bài tập 16. 82 4.9. Điều khiển Timer 83 Bài tập 17. 83 Bài tập 18. 86 4.10. Điều khiển RichTextBox 87 CHƢƠNG 5. CÁC HỘP THOẠI THÔNG DỤNG 88 1. Hộp hội thoại Open File 88 Bài tập 19. 88 Bài giảng Cơ sở lập trình 2 3
  5. 2. Hộp thoại SaveFile và luồng FileStream 90 2.1. Hộp thoại SaveFile 90 2.2. Luồng FileStream 90 Bài tập 20. 91 3. Hộp thoại Color 92 Bài tập 21. 93 4. Hộp thoại Font 94 Bài tập 22. 94 Bài tập 23. 95 CHƢƠNG 6. MENU VÀ ĐỒ ÁN NHIỀU BIỂU MẪU 97 1. Menu - MenuStrip 97 1.1. Thuộc tính 97 1.2. Sự kiện 98 Bài tập 24. 98 2. Popup menu - ContextMenuStrip 99 Bài tập 25. 99 3. Đồ án nhiều biểu mẫu 101 3.1. Bổ sung biểu mẫu 101 Bài tập 26. 102 3.2. Biểu mẫu khởi động 102 3.3. Gọi biểu mẫu 103 3.4. Đóng biểu mẫu 103 3.5. Xoá biểu mẫu 103 Bài tập 27. 104 Bài tập 28. 104 Bài tập 29. 105 Bài giảng Cơ sở lập trình 2 4
  6. CHƢƠNG 1. LÀM QUEN VỚI VISUAL STUDIO 2010 1. Giới thiệu Visual Studio.NET 2010 1.1. Tình hình trƣớc khi Visual Studio.NET ra đời Với sự phát triển liên tục và đa dạng của thế giới công nghệ thông tin ngày nay, các phần mềm, các hệ điều hành, các môi trƣờng phát triển và các ứng dụng liên tục ra đời. Tuy nhiên, đôi khi việc phát triển không đồng nhất và nhất là do không tƣơng thích về mặt lợi ích của các công ty phần mềm lớn đã làm ảnh hƣởng đến công việc của những kỹ sƣ xây dựng phần mềm. Trong giới phát triển ứng dụng trên Internet ta có thể sử dụng các ngôn ngữ Java, PHP, ASP Khi Java mới đƣợc Sun Corporation giới thiệu nó đã có một sức mạnh đáng kể và hƣớng tới việc chạy trên nhiều hệ điều hành khác nhau, độc lập với các bộ xử lý. Đặc biệt Java rất thích hợp cho việc viết các ứng dụng trên Internet. Tuy nhiên, Java lại có hạn chế về mặt tốc độ và trên thực tế vẫn chƣa thịnh hành. Để làm giảm khả năng ảnh hƣởng của Java, bên hãng Microsoft cũng cung cấp ngôn ngữ ASP - chuyên dùng để viết các ứng dụng trên Web. Trong các trang ASP vừa chứa thẻ HTML vừa chứa các đoạn script (VBScript, JavaScript). Trong quá trình xử lý một trang ASP, nếu là thẻ HTML thì sẽ đƣợc gửi thẳng tới trình duyệt, còn nếu là các đoạn script thì sẽ đƣợc chuyển thành các dòng HTML rồi gửi đi. Khi nhà lập trình muốn đóng gói và sử dụng lại một số chức năng nào đó, thì họ dịch các đoạn chƣơng trình thành ActiveX và đƣa nó vào Web Server. Tuy nhiên, vì lý do bảo mật nên các Admin của các trang Web thƣờng rất dè dặt khi cài ActiveX lạ trên máy của họ, ngoài ra việc tháo gỡ các phiên bản của ActiveX này cũng là công việc rất khó khăn. Còn trong giới phát triển ứng dụng trên Windows ta có thể viết ứng dụng bằng Visual C++, Delphi, Visual Basic đây là một số công cụ phổ biến và mạnh. Trong đó Visual C++ là một ngôn ngữ rất mạnh nhƣng cũng rất khó sử dụng. Visual Basic thì đơn giản dễ học, dễ dùng nhất nên rất thông dụng nhƣng hạn chế là Visual Basic không phải ngôn ngữ hƣớng đối tƣợng và không hỗ trợ khả năng phát triển thuật toán. Tóm lại trong giới lập trình theo Microsoft thì việc lập trình trên desktop cho đến lập trình hệ phân tán hay trên web là những mảng độc lập. 1.2. Sự ra đời của Visual Studio.NET Đầu năm 1998, sau khi hoàn tất phiên bản Version 4 của Internet Information Server -IIS, đội ngũ lập trình của Microsoft nhận thấy họ còn có rất nhiều sáng kiến để có thể kiện toàn Bài giảng Cơ sở lập trình 2 5
  7. IIS, và họ bắt đầu xây dựng một kiến trúc mới trên nền tảng ý tƣởng đó và đặt tên là Next Generation Windows Services - NGWS. Tham vọng của họ là cung cấp một môi trƣờng có thể dùng chung cho tất cả ngôn ngữ lập trình trong bộ Visual Studio cũng nhƣ cho các ngôn ngữ lập trình của các công ty khác. Kết quả là năm 2001 Visual Studio.Net 2001 ra đời đánh dấu cho một môi trƣờng lập trình trên nền .NET Framework 1.0 tiên tiến mới. Năm 2003, sau 2 năm .NET Framework nâng cấp thêm một bậc với phiên bản 1.1 với đặc điểm ngoài các chƣơng trình Windows truyền thống – là các tệp tin .exe giờ đây Windows còn tồn tại những chƣơng trình khác – những chƣơng trình chạy trên nền .NET. Muốn chạy chƣơng trình .NET ta chỉ cần cài .NET Framework là đủ. Một điểm lý thú và cũng là điều mong đợi của tất cả lập trình viên, từ phiên bản Windows 2003 .NET Framework đƣợc cài đặt nhƣ một phần mặc định của Windows. Song song đó, môi trƣờng phát triển Visual Studio .NET 2001 đƣợc nâng cấp thành Visual Studio .NET 2003 cho phép viết và chạy các ứng dụng trên nền .NET Framework 1.1 Cuối năm 2005, Visual Studio 2005 với nền .NET Framework 2.0 mạnh mẽ và vƣợt trội hơn so với nền .NET Framwork 1.1 trƣớc đó. Ngay sau đó Microsoft công bố phiên bản Windows Vista, và toàn bộ Windows là .NET, tất cả các hàm API lõi trong những phiên bản Windows trƣớc đây đều đã đƣợc thay thế bằng các hàm hay thƣ viện .NET. Microsoft đã viết lại hoàn toàn lõi API, không còn một lớp API nào nữa. 1.3. Tổng quan về Visual Studio.NET Visual Studio.NET gồm 2 phần: Framework và Integrated Development Environment– IDE, cho phép lập trình viên khi xây dựng các ứng dụng có thể lựa chọn sử dụng nhiều ngôn ngữ lập trình khác nhau nhƣ Visual C++.NET, Visual C#.NET, Visual J#.NET, Visual Basic.NET trong cùng một môi trƣờng phát triển IDE thống nhất trên kiến trúc .NET Framework. Framework là thành phần quan trọng nhất, là cốt lõi và tinh hoa của môi trƣờng .NET, Framework giúp chúng ta biên dịch và thực thi các ứng dụng .NET (cấu trúc của Framework chúng ta sẽ tìm hiểu ở các chƣơng sau của giáo trình). IDE cung cấp một môi trƣờng phát triển trực quan, giúp các lập trình viên có thể dễ dàng và nhanh chóng xây dựng giao diện cũng nhƣ viết mã lệnh cho các ứng dụng dựa trên nền tảng .NET. Nếu không có IDE chúng ta cũng có thể dùng một trình soạn thảo văn bản bất kỳ, ví dụ nhƣ Notepad để viết mã lệnh và sử dụng command line để biên dịch và thực thi ứng dụng. Tuy nhiên việc này mất rất nhiều thời gian, tốt nhất là chúng ta nên dùng IDE để phát triển các ứng dụng, và đó cũng là cách dễ sử dụng nhất. Ngoài ra trong Visual Studio.NET thì lập trình Winform và Webform là tƣơng tự, ví dụ cả Visual C#.NET lẫn Visual Basic.NET đều hỗ trợ khả năng lập trình trên Win và Web Bài giảng Cơ sở lập trình 2 6
  8. 2. Khởi động Visual C# 2010 và giao diện  Vào Start/Programs/Microsoft Visual Studio 2010/Microsoft Visual Studio 2010, xuất hiện cửa sổ Start Page. Hình 1. Cửa sổ Start Page + New Project: Tạo đồ án mới. + Open Project: Mở các đồ án có sẵn. + Recent Projects: Danh sách các đồ án gần đây nhất.  Kích chọn mục New Project hoặc vào File/New/Project hoặc bấm phím tắt Ctrl+Shift+N xuất hiện cửa sổ New Project Bài giảng Cơ sở lập trình 2 7
  9. Hình 2. Cửa sổ New Project Chọn ngôn ngữ Visual C# và ứng dụng Windows. Đặt tên cho đồ án tại mục Name. Chọn đƣờng dẫn lƣu đồ án tại mục Location. Mục Create directory for solution cho phép tạo một thƣ mục tại Location chứa tất cả các tệp phát sinh của đồ án (nếu không các tệp của đồ án sẽ đƣợc lƣu tại Location). Hình 3. Thư mục chứa đồ án Chọn OK để tạo một đồ án mới. Bài giảng Cơ sở lập trình 2 8
  10. Kết quả xuất hiện cửa sổ môi trƣờng phát triển tích hợp IDE, với giao diện và các thành phần cơ bản nhƣ sau: Hình 4. Môi trường phát triển tích hợp IDE  Title Bar: Thanh tiêu đề chứa tên đồ án.  Menu Bar: Thanh Menu chứa đầy đủ các công cụ cần để phát triển, thực thi và cài đặt ứng dụng File: cho phép mở, thêm mới và lƣu trữ đồ án Edit: gồm các thao tác hỗ trợ việc soạn thảo mã lệnh nhƣ: copy, cắt, dán View: cho phép hiển thị các công cụ hỗ trợ ngƣời dùng trong quá trình xây dựng đồ án nhƣ: - Cửa sổ viết mã lệnh - Code - Form thiết kế - Designer Bài giảng Cơ sở lập trình 2 9
  11. - Hộp công cụ - Toolbox - Thanh công cụ - Toolbars - Cửa sổ thuộc tính - Properties Window Project: cho phép bổ sung các đối tƣợng khác nhau vào đồ án nhƣ: các form, các component, các modul, các lớp Built: cho phép biên dịch đồ án. Debug: cho phép chạy và gỡ rối chƣơng trình. Data: cho phép thêm mới và hiển thị cơ sở dữ liệu của đồ án. Tools: cung cấp các công cụ cho phép kết nối tới các thiết bị ngoại vi nhƣ Pocket PC, Smartphone hoặc kết nối tới các hệ quản trị cơ sở dữ liệu cũng nhƣ kết nối tới máy chủ server  Toolbar: thanh công cụ gồm một tập hợp các nút lệnh, mỗi nút lệnh chứa một biểu tƣợng icons và có chức năng tƣơng đƣơng với chức năng của một mục lựa chọn trong thanh menu. Thanh công cụ rất hữu ích và trực quan, giúp ngƣời dùng dễ dàng và nhanh chóng thực hiện một chức năng mong muốn chỉ thông qua một cái kích chuột. Visual C# 2010 có tới 39 thanh công cụ khác nhau nhƣ: Standard, Formatting, Debug, Build Ví dụ hình ảnh thanh công cụ Standard: Hình 5. Thanh công cụ Standard Để gọi các thanh công cụ ta vào View/Toolbars khi đó sẽ xuất hiện danh sách tất cả các thanh công cụ. Muốn ẩn/hiện thanh công cụ nào ta kích chọn tại dòng chứa tên thanh công cụ đó.  Toolbox: là hộp công cụ chứa các điều khiển – controls đƣợc đặt lên Form khi thiết kế giao diện ngƣời dùng. Để hiển thị hộp công cụ ta thực hiện một trong các cách sau: Vào View/Toolbox Bấm tổ hợp phím Ctrl+W+X Kích chuột tại biểu tƣợng Toolbox trên thanh công cụ Standard. Bài giảng Cơ sở lập trình 2 10
  12. Hình 6. Hộp công cụ Toolbox Mặc định hộp công cụ đƣợc chia thành 11 tab khác nhau nhƣ: All Windows Forms, Common Controls Ta có thể thêm mới, loại bỏ, đổi tên các tab bằng cách kích chuột phải tại vị trí bất kỳ trên tab, xuất hiện một menu ngữ cảnh cho phép lựa chọn các thao tác cần thực hiện. Hình 7. Các chức năng làm việc với từng tab trong Toolbox Bài giảng Cơ sở lập trình 2 11
  13. Trong mỗi tab của hộp Toolbox chứa danh sách các loại điều khiển khác nhau, các điều khiển này có thể thêm mới, loại bỏ, thay đổi vị trí Kích chuột phải tại một điều khiển bất kỳ trên tab, xuất hiện một menu ngữ cảnh cho phép lựa chọn các thao tác cần thực hiện. Ví dụ để thêm mới một điều khiển vào trong tab Data, ta kích chuột phải tại vị trí bất kỳ trên tab Data, chọn Choose Items Hình 8. Các chức năng làm việc với từng điều khiển trong tab Kết quả sẽ xuất hiện cửa sổ Choose Toolbox Items, kích chọn các điều khiển mong muốn rồi bấm OK để kết thúc. Hình 9. Cửa sổ Choose Toolbox Items Bài giảng Cơ sở lập trình 2 12
  14.  Form Designer: cửa sổ thiết kế dùng để thiết kế giao diện cho chƣơng trình, mỗi dự án có thể có một hoặc nhiều Form. Hình 10. Cửa số Form Designer  Solution Explorer: cửa sổ giải pháp - đây là phần cửa sổ giúp ta quản lý tất cả các tài nguyên và tập tin dự án. Solution Explorer đƣợc tổ chức thành một cấu trúc cây bao gồm những mục khác nhau, nhƣ: danh sách các Form của đồ án, danh sách các lớp Class, danh sách các tài nguyên cũng nhƣ danh sách cơ sở dữ liệu Để hiển thị cửa sổ Solution Explorer ta thực hiện một trong các cách sau: Vào View/Solution Explorer Bấm tổ hợp phím Ctrl+W+S Kích chuột tại biểu tƣợng Solution Explorer trên thanh công cụ Standard Hình 11. Cửa sổ Solution Explorer Bài giảng Cơ sở lập trình 2 13
  15. Trong cửa sổ Solution Explorer có hai thành phần hay dùng là View Code và View Designer. View Code: có tác dụng hiển thị cửa sổ soạn thảo mã lệnh cho Form đang đƣợc chọn. Ngoài ra, để hiển thị cửa sổ soạn thảo mã lệnh ta còn có một số cách khác nhƣ sau: Vào View/Code. Bấm phím tắt F7. Kích đúp chuột tại cửa sổ thiết kế của form. Giao diện cửa sổ soạn thảo nhƣ sau: Hình 12. Cửa sổ soạn thảo View Designer: có tác dụng hiển thị cửa sổ thiết kế giao diện của Form đang đƣợc chọn. Ngoài ra, để hiển thị cửa sổ thiết kế giao diện ta còn có một số cách khác nhƣ sau: Vào View/Designer Bài giảng Cơ sở lập trình 2 14
  16. Bấm phím tắt Shift+F7.  Properties Window: cửa sổ này liệt kê tất cả các thuộc tính, sự kiện của các điều khiển trong form. Muốn hiển thị thuộc tính của đối tƣợng nào ta kích chuột chọn đối tƣợng đó trong cửa sổ thiết kế giao diện, hoặc chọn tên đối tƣợng trong danh sách thả xuống ở phần đầu của cửa sổ Properties. Hình 13. Cửa sổ Properties Mỗi thuộc tính có một giá trị mặc định, ta có thể thay đổi giá trị của các thuộc tính trực tiếp tại cửa sổ Properties trong lúc thiết kế, hoặc thay đổi bằng mã lệnh trong lúc thi hành chƣơng trình. Để hiển thị cửa sổ Properties ta thực hiện theo một trong các cách sau: Vào View\Properties Window. Kích chọn biểu tƣợng Properties Window trên thanh công cụ Standard. Bấm phím tắt Ctrl+W+P Bài giảng Cơ sở lập trình 2 15
  17. CHƢƠNG 2. VIẾT CHƢƠNG TRÌNH ĐẦU TIÊN Một chƣơng trình ứng dụng trong C# đƣợc thực hiện theo hai bƣớc sau: Thiết kế giao diện. Viết mã lệnh cho chƣơng trình. 1. Đề bài Viết chƣơng trình gồm 1 hộp văn bản Textbox và 3 nút lệnh Button: Display, Clear, Exit với các yêu cầu sau: Kích chuột vào nút Display thì trong hộp văn bản xuất hiện dòng chữ: “Welcome to Visual C# 2010”. Kích chuột vào nút Clear thì nội dung trong hộp văn bản mất đi. Kích chuột vào nút Exit để thoát khỏi chƣơng trình quay lại cửa sổ soạn thảo. Hình 14. Giao diện chương trình đầu tiên 3. Mở đồ án mới Mở Microsoft Visual Studio 2010, chọn File/New/Project để khởi động một đồ án mới. Chọn ngôn ngữ Visual C# và ứng dụng Windows, đặt tên cho đồ án tại mục Name là Welcome rồi chọn OK. 4. Thiết kế giao diện 4.1. Đặt tên và tiêu đề cho form Bài giảng Cơ sở lập trình 2 16
  18. Kích chuột vào vị trí bất kỳ trên Form, trong cửa sổ Properties sửa các thuộc tính: Name: frmWelcome Text: The first program Trong cửa sổ Solution Explorer kích chuột tại Form1.cs, trong cửa sổ Properties sửa thuộc tính File Name là frmWelcome.cs Hình 15. Đổi tên form trong cửa sổ Solution Explorer 4.2. Thêm điều khiển hộp văn bản Textbox Kích chuột vào biểu tƣợng trên hộp công cụ Toolbox, giữ và kéo chuột để đặt Textbox vào Form. Ngoài ra ta có thể kích đúp chuột tại biểu tƣợng TextBox, điều khiển này sẽ đƣợc tự động đặt vào Form. Khi đã có điều khiển TextBox trong Form ta có thể thay đổi vị trí và kích thƣớc của Textbox cho phù hợp. Khi mới xuất hiện trên Form hộp Textbox có tên mặc định là TextBox1, ta thay đổi giá trị này bằng cách kích chuột chọn điều khiển TextBox1, tại cửa sổ Properties chọn thuộc tính Name sửa thành txtWelcome. 4.3. Thêm điều khiển nút lệnh Button Kích chuột vào biểu tƣợng , giữ và kéo chuột đƣa điều khiển nút lệnh lên Form, nút lệnh này có tên mặc định là Button1 và nội dung cũng là Button1. Bài giảng Cơ sở lập trình 2 17
  19. Thực hiện tƣơng tự đƣa thêm 2 nút lệnh Button2 và Button3 vào form. Để thay đổi hai thuộc tính Name và Text của các nút lệnh ta thực hiện nhƣ sau: Kích chuột vào nút lệnh 1, trong cửa sổ Properties sửa thuộc tính Name là btnDisplay, thuộc tính Text là Display Kích chuột vào nút lệnh 2, sửa thuộc tính Name là btnClear, thuộc tính Text là Clear Kích chuột vào nút lệnh 3, sửa thuộc tính Name là btnExit, thuộc tính Text là Exit Chú ý: Mọi điều khiển đều có thuộc tính Name, để dễ dàng quản lý, gỡ rối chƣơng trình ta nên đặt tên điều khiển tƣơng ứng với chức năng của nó và có tiếp đầu ngữ chỉ loại điều khiển ở đầu. Ví dụ: Textbox có tiếp đầu ngữ - txt, Button - btn, Form - frm Các tiếp đầu ngữ đƣợc viết chữ thƣờng, tên của điều khiển đƣợc viết hoa chữ cái đầu tiên, ví dụ: txtWelcome. 5. Viết code 5.1. Viết code cho nút lệnh btnDisplay Ta mở cửa sổ soạn thảo Code Editor bằng cách kích đúp chuột vào nút Display. Trong cửa sổ Code, C# định nghĩa sẵn cho chúng ta một không gian tên - namespace đại diện cho form đang xét và 2 dòng mở đầu và kết thúc cho sự kiện Click của nút Display. Gõ vào giữa thủ tục btnDisplay_Click dòng lệnh gán giá trị „Welcome to Visual C# 2010‟ cho thuộc tính Text của điều khiển txtWelcome nhƣ sau: 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; namespace Welcome { public partial class frmWelcome : Form { public frmWelcome() { InitializeComponent(); } Bài giảng Cơ sở lập trình 2 18
  20. private void btnDisplay_Click(object sender, EventArgs e) { txtWelcome.Text = "Welcome to Visual C# 2010"; } } } Chú ý: Hầu nhƣ tất cả các thủ tục xử lý một sự kiện nào đó của các điều khiển trên form đều có 2 đối số là sender và e. Trong đó: Đối số sender có kiểu object đại diện cho đối tƣợng đã phát sinh sự kiện. Đối số e có kiểu EventArgs chứa các thông tin về sự kiện nhƣ: vị trí chuột, thời gian phát sinh sự kiện Ta có cấu trúc chung để gán giá trị cho thuộc tính của một điều khiển khi viết mã lệnh nhƣ sau: . = ; Các thuộc tính của các điều khiển trong C# rất phong phú, C# cung cấp tiện ích Intellisence tự động hiển thị một danh sách các thuộc tính của điều khiển sau khi ta gõ tên điều khiển và dấu chấm „.‟ Để lựa chọn một thuộc tính, ta có thể dùng phím mũi tên lên, xuống để lựa chọn hoặc gõ các ký tự đầu của thuộc tính cần sử dụng, sau đó ấn phím Tab hoặc dấu cách để tự động chèn tên thuộc tính vào dòng lệnh. Hình 16. Tiện ích Intellisence Bài giảng Cơ sở lập trình 2 19
  21. Trong môi trƣờng soạn thảo, nếu gõ sai cú pháp thì C# sẽ bắt lỗi ngay bằng cách hiển thị một đƣờng gạch chân hình răng cƣa dƣới câu lệnh sai. Khi sửa xong lỗi thì đƣờng răng cƣa sẽ tự động biến mất. 5.2. Viết code cho nút lệnh btnClear Quay lại cửa sổ thiết kế Design, kích đúp chuột vào nút Clear, gõ mã lệnh cho nút Clear nhƣ sau: private void btnClear_Click(object sender, EventArgs e) { txtWelcome.Text = ""; } 5.3. Viết code cho nút lệnh btnExit Quay lại cửa sổ thiết kế Design, kích đúp chuột vào nút Exit, gõ mã lệnh nhƣ sau: private void btnExit_Click(object sender, EventArgs e) { Application.Exit(); } Lệnh Application.Exit() có tác dụng đóng và xoá ra khỏi bộ nhớ tất cả các cửa sổ đang đƣợc thực hiện trong chƣơng trình và quay trở về cửa sổ thiết kế. 6. Lƣu đồ án Chọn File/Save All hoặc kích chọn biểu tƣợng trên thanh công cụ Standard. 7. Các tệp tin của đồ án Khi tạo đồ án, Visual Studio.NET sinh ra các tập tin sau: .sln: đây là tập tin giải pháp (solution file), mỗi ứng dụng có một tập tin loại này nó bao gồm một hoặc nhiều tập tin dự án. .csproj: đây là tập tin dự án (project file) của C#, mỗi tập tin dự án gồm một hoặc nhiều tập tin nguồn, các tập tin nguồn trong cùng một dự án phải đƣợc viết cùng một ngôn ngữ. .cs: đây là tập tin nguồn (source file) của C# là nơi chứa mã lệnh của chƣơng trình. AssemblyInfor.cs: tập tin này cho phép thêm một số thuộc tính vào chƣơng trình nhƣ: tên tác giả, ngày tạo chƣơng trình Bài giảng Cơ sở lập trình 2 20
  22. 8. Chạy chƣơng trình Để chạy một chƣơng trình C# ta thực hiện theo 1 trong các cách sau: Chọn Debug/Start Debugging. Kích chuột vào biểu tƣợng Start Debugging trên thanh công cụ Standard. Bấm phím tắt F5. 9. Dừng chƣơng trình Khi chạy chƣơng trình, nếu xuất hiện lỗi ta có thể dừng chƣơng trình và quay về cửa sổ soạn thảo để sửa lỗi. Ta có các cách thực hiện sau: Vào Debug/Stop Debugging. Kích chuột vào biểu tƣợng Stop Debugging trên thanh công cụ Standard. Bấm phím tắt Ctrl+Alt+Break. 10. Mở đồ án đã có Để mở một đồ án đã có ta có các cách thực hiện nhƣ sau: Mở thƣ mục chứa đồ án, ví dụ thƣ mục Welcome trong đƣờng dẫn “D:\”, kích đúp vào tập tin Welcome.sln để mở đồ án Welcome. Mở môi trƣờng Microsoft Visual Studio 2010, trong cửa sổ Start Page kích chọn đồ án cần mở trong mục Recent Projects (nếu có). Mở môi trƣờng Microsoft Visual Studio 2010, vào File/Open Project, chọn đƣờng dẫn đến tệp tin .sln của đồ án rồi chọn Open. 11. Thoát khỏi Visual C# 2010 Chọn File/Exit. Bài giảng Cơ sở lập trình 2 21
  23. CHƢƠNG 3. DỮ LIỆU VÀ CẤU TRÚC ĐIỀU KHIỂN 1. Biến, hằng và các kiểu dữ liệu 1.1. Biến Biến là một đại lƣợng dùng để chứa dữ liệu tạm thời trong quá trình tính toán. Tất cả các biến đƣợc sử dụng trong chƣơng trình đều phải đƣợc khai báo ngay từ đầu, biến đƣợc chia thành 3 loại bao gồm: Biến đầu vào, biến đầu ra và biến trung gian. Biến có thể đƣợc khai báo tại 2 nơi gồm: Bên trong phần định nghĩa lớp của Form. Bên trong một phƣơng thức. public partial class frmWelcome : Form { // Nơi khai báo biến; private void bntDisplay_Click(object sender, EventArgs e) { // Nơi khai báo biến; } } Phạm vi của một biến: phụ thuộc vào vị trí khai báo của biến, nếu biến đƣợc khai báo trong phần định nghĩa lớp của Form thì là biến toàn cục có tác dụng trong toàn bộ các đoạn mã lệnh của form, nếu biến đƣợc khai báo bên trong một phƣơng thức thì là biến cục bộ chỉ có tác dụng trong phƣơng thức chứa nó. Biến giống nhƣ những chiếc hộp trong bộ nhớ có khả năng lƣu giữ giá trị, có nhiều kiểu giá trị khác nhau mà C# có thể xử lý nhƣ: kiểu số nguyên, kiểu số thực, kiểu ký tự Khi khai báo một biến ta phải chỉ ra kiểu giá trị mà nó sẽ lƣu trữ. Cú pháp khai báo biến nhƣ sau: Kiểu dữ liệu Tênbiến [=Giá trị]; Tênbiến: là một chuỗi các ký tự do ngƣời lập trình tự đặt bao gồm các chữ cái, chữ số và dấu gạch dƣới. Tên biến phải bắt đầu bằng một chữ cái, không đƣợc chứa dấu cách, C# phân biệt chữ hoa chữ thƣờng. Bài giảng Cơ sở lập trình 2 22
  24. 1.2. Hằng Hằng là đại lƣợng dùng để chứa những dữ liệu có giá trị không đổi trong suốt quá trình tính toán. Sử dụng hằng làm chƣơng trình sáng sủa dễ đọc nhờ tên gọi gợi nhớ thay vì các con số. Hằng đƣợc khai báo theo cú pháp sau: const Kiểu dữ liệu Tênhằng = Giá trị; 1.3. Các kiểu dữ liệu 1.3.1. Kiểu số int, long: lƣu trữ các số nguyên, int có độ lớn 4 bytes, long có độ lớn 8 bytes. float, double: biểu diễn các số thực, kiểu float dùng 4 bytes, double dùng 8 bytes. Ví dụ khai báo biến số: int a; a=10; long b=10L; float c =19.34F; double d=19.34; Các phép toán số học: Cộng: +,+= Trừ: -, -= Nhân: *, *= Chia:/, /=. Ta có int/int=int, int/double=double, double/int=double, double/double=double Ví dụ: 8/5=1; 8.0/5=1.6 Chú ý: các phép toán x[+,-,*,/]=y tƣơng đƣơng với phép toán: x=x[+,-,*,/]y %: phép chia lấy phần dƣ, ví dụ 5 % 2=1, 10.8 % 4 = 2.8 Math.Round(x,n): hàm làm tròn số thực, ví dụ: Math.Round(11.346,2) = 11.35 Math.Sin(x): hàm tính giá trị của sin(x) Math.Cos(x): hàm tính giá trị của cos(x) Math.Exp(x): hàm tính giá trị ex Bài giảng Cơ sở lập trình 2 23
  25. Math.Pow(x,y): hàm tính giá trị xy Math.Abs(x): hàm tính giá trị tuyệt đối của x Math.Sqrt(x): hàm tính căn bậc hai của x Math.Floor(x): hàm trả về số nguyên gần x nhất, ví dụ: Math.Floor(11.756) = 11 Math.Truncate(x): hàm trả về phần nguyên của x, ví dụ: Math.Truncate(11.756) = 11 Ta có: Math.Floor(-11.756) = -12 và Math.Truncate(-11.756) = -11 Các phép toán so sánh: kết quả trả về của các phép toán so sánh có dạng đúng hoặc sai. Lớn hơn: > Nhỏ hơn: = Nhỏ hơn hoặc bằng: <= Bằng: == Khác: != 1.3.2. Kiểu ký tự - char char là kiểu dữ liệu chứa các ký tự trong bảng mã ASCII và đƣợc đặt trong cặp dấu nháy đơn. Khai báo biến ký tự: char ch=‟+‟; 1.3.3. Kiểu chuỗi - string string là một chuỗi các ký tự đƣợc đặt trong cặp dấu nháy kép. Trong VS.NET có hỗ trợ font Unicode nên ta có thể gõ tiếng Việt có dấu. Ví dụ khai báo biến chuỗi: string s=”Hà Nội mùa thu”; Các phép toán trên kiểu dữ liệu chuỗi Bài giảng Cơ sở lập trình 2 24
  26. +: toán tử ghép chuỗi. Ví dụ: “Hà Nội ” + “mùa thu” cho kết quả “Hà Nội mùa thu” s.Length: trả về chiều dài của chuỗi s. Ví dụ: “Lâm Anh”.Length có kết quả = 7 s.Replace(str1,str2): thay thế chuỗi str1 trong chuỗi s bằng chuỗi str2. Ví dụ: “Hà Nội”.Replace(“Nội”, “Tây”) cho kết quả “Hà Tây” s.Substring(vt,n): trả về một chuỗi con gồm n ký tự trong chuỗi s, bắt đầu từ ký tự ở vị trí vt. (Chuỗi đƣợc tính từ vị trí 0). Ví dụ: "Hoa hồng ".Substring(1, 2) cho kết quả “oa” s.Insert(vt,str): chèn thêm giá trị của chuỗi str vào chuỗi s tại vị trí vt. Ví dụ: "Trời xanh". Insert(4, " màu") cho kết quả “Trời màu xanh” s.ToLower: biến đổi chuỗi s về chữ in thƣờng. Ví dụ: “Hà Nội”.ToLower cho kết quả “hà nội” s.ToUpper: biến đổi chuỗi s về chữ in hoa. Ví dụ: “Hà Nội”.ToUpper có kết quả “HÀ NỘI” s.Remove(vt,n): xóa n ký tự trong chuỗi s, bắt đầu từ ký tự ở vị trí vt. Ví dụ: "Hoa hồng".Remove(1, 2) cho kết quả “H hồng” s.TrimStart: xóa các ký tự rỗng ở đầu chuỗi s. Ví dụ: " Hoa hồng ".TrimStart cho kết quả "Hoa hồng " s.TrimEnd: xóa các ký tự rỗng ở cuối chuỗi s. Ví dụ: " Hoa hồng ".TrimEnd cho kết quả " Hoa hồng" s.Trim: xóa các ký tự rỗng ở đầu và cuối chuỗi s. Ví dụ: " Hoa hồng ".Trim cho kết quả "Hoa hồng" s.Split(ch): tách chuỗi s thành các chuỗi con ngăn cách nhau bởi ký tự ch. Ví dụ: string s = "Ha Noi"; string[] tu=s.Split(„ „); Kết quả: tu[0]= "Ha", tu[1]= "Noi" Bài giảng Cơ sở lập trình 2 25
  27. 1.3.4. Kiểu logic bool Kiểu bool là kiểu dữ liệu chỉ nhận một trong hai giá trị true/false. Các phép toán trên kiểu dữ liệu bool Phép toán Và &&: xét biểu thức A && B chỉ nhận giá trị đúng khi và chỉ khi cả A và B cùng nhận giá trị đúng, còn nhận giá trị sai trong tất cả các trƣờng hợp còn lại Phép toán Hoặc ||: xét biểu thức A || B chỉ nhận giá trị sai khi và chỉ khi cả A và B cùng nhận giá trị sai, còn nhận giá trị đúng trong tất cả các trƣờng hợp còn lại. Phép toán Phủ định !: ta có !A nhận giá trị đúng khi A nhận giá trị sai và ngƣợc lại. Bảng giá trị chân lý của các phép toán: A B A && B A || B A !A True True True True False True True False False True True False False True False True False False False False 1.3.5. Kiểu ngày tháng DateTime Ví dụ khai báo biến ngày tháng: DateTime d; d = DateTime.Now; Các phép toán trên kiểu dữ liệu DateTime DateTime.Now: trả về ngày và giờ hiện hành, ví dụ: 09/02/2009 5:20:28PM Date.Day: trả về giá trị ngày của Date, ví dụ: d.Day cho kết quả 09 Date.Month: trả về giá trị tháng của Date, ví dụ:d.Month cho kết quả 02 Date.Year: trả về giá trị năm của Date, ví dụ: d.Year cho kết quả 2009 Date.AddDays(n): trả về một ngày mới cách ngày Date n ngày. Date.AddMonths(n): trả về một ngày mới cách ngày Date n tháng. Date.AddYears(n): trả về một ngày mới cách ngày Date n năm. Bài giảng Cơ sở lập trình 2 26
  28. 1.3.6. Kiểu dữ liệu ngẫu nhiên C# cung cấp kiểu dữ liệu Random cho phép sinh các số ngẫu nhiên. Ví dụ khai báo biến ngẫu nhiên: Random rnd; Các phép toán trên kiểu dữ liệu ngẫu nhiên new Random(): khởi tạo bộ số ngẫu nhiên. Ví dụ: rnd=new Random(); rnd.NextDouble(): trả về một số thực ngẫu nhiên trong khoảng từ 0 đến 1. rnd.Next(): trả về một số nguyên có giá trị bất kỳ. rnd.Next(n,m): trả về một số nguyên có giá trị bất kỳ trong khoảng từ n tới m (n>=0). 1.3.7. Kiểu dữ liệu mảng Mảng là một tập hợp các biến có cùng tên và cùng kiểu dữ liệu. Dùng mảng làm chƣơng trình đơn giản và ngắn gọn hơn. Mảng có cận trên, cận dƣới và các thành phần trong mảng là liên tục giữa 2 cận. Khai báo mảng: mảng đƣợc khai báo theo cú pháp sau: Kiểu dữ liệu[] tên mảng ; Để cấp phát bộ nhớ cho mảng ta dùng toán tử new theo sau là tên kiểu dữ liệu và kích thƣớc của mảng đƣợc đặt trong cặp dấu ngoặc vuông. Ví dụ khai báo mảng một chiều nguyên a gồm 10 phần tử : int[] a = new int[10] ; Khai báo mảng 2 chiều thực b gồm 10 hàng, 5 cột double[,] b = new double[10,5]; Khởi tạo giá trị cho các phần tử của mảng khi khai báo: double[] a = new double[2] {34.56, -45}; hoặc double[] a = {34.56, -45}; string[] Tennuoc = {“Anh”, “Pháp”, “Đức”, “Việt Nam”}; int[,] a = {{4, 6, 9}, {5, 7, 9}, {12, 44, 23}}; 1.4. Hàm chuyển đổi giữa các kiểu dữ liệu Bài giảng Cơ sở lập trình 2 27
  29. Hàm chuyển đổi Đổi giá trị sang kiểu Convert.ToBoolean(Giatri) Boolean Convert.ToByte(Giatri) Byte Convert.ToDateTime(Giatri) Date Convert.ToDouble(Giatri) Double Convert.ToInt16(Giatri) Integer – 2 byte Convert.ToInt32(Giatri) Integer – 4 byte Convert.ToInt64(Giatri) Integer – 8 byte Convert.ToSingle(Giatri) Single Convert.ToString(Giatri) String Chú ý rằng giá trị truyền cho hàm phải hợp lệ, nghĩa là phải thuộc miền giá trị của kiểu kết quả nếu không C# sẽ báo lỗi. Ví dụ: + Convert.ToDateTime(“25/04/79”) trả về giá trị kiểu ngày tháng 25/04/79 + Convert.ToInt32(“25”) = 25 + Convert.ToInt32(“25a”) hoặc Convert.ToInt32(“a25”) sẽ báo lỗi. 2. Hộp thoại thông báo – MessageBox 2.1. Khái niệm Hộp thông báo là hộp thoại cung cấp thông tin để tƣơng tác với ngƣời sử dụng, đồng thời cũng là nơi hiển thị các kết quả trung gian trong quá trình tính toán. Trong thời gian hiển thị hộp thông báo, C# ngừng mọi hoạt động của biểu mẫu và ngƣời dùng chỉ có thể làm việc với hộp thông báo. 2.2. Hộp thông báo MessageBox MessageBox.Show(Nội dung thông báo, Tiêu đề, Kiểu chức năng, Kiểu biểu tượng); Chú ý: Cú pháp hộp thông báo không nhất thiết phải có đầy đủ bốn thành phần trên, nội dung cần thông báo và tiêu đề của hộp thông báo đƣợc đặt trong cặp dấu nháy kép. Kiểu chức năng và kiểu biểu tƣợng có các giá trị nhƣ sau: Bài giảng Cơ sở lập trình 2 28
  30. Hằng tƣợng trƣng Thể hiện Ý nghĩa Các kiểu chức năng: đƣợc bắt đầu bởi MessageBoxButtons .OK Chỉ hiển thị nút OK. .OKCancel Hiển thị các nút OK và Cancel. .AbortRetryIgnore Hiển thị các nút Abort, Retry và Ignore. .YesNoCancel Hiển thị các nút Yes, No và Cancel. .YesNo Hiển thị các nút Yes, No. .RetryCancel Hiển thị các nút Retry, Cancel. Các kiểu biểu tƣợng: đƣợc bắt đầu bởi MessageBoxIcon .Error hoặc .Hand hoặc .Stop Dùng cho những thông báo lỗi thất bại khi thi hành một việc nào đó. .Question Dùng cho những câu hỏi yêu cầu ngƣời dùng chọn lựa. .Exclamation hoặc .Warning Dùng cho các thông báo của chƣơng trình. .Asterisk hoặc .Information Dùng cho các thông báo cung cấp thêm thông tin cho ngƣời dùng. .None Không hiển thị biểu tƣợng. Ví dụ hiển thị hộp thông báo “Bạn chƣa nhập dữ liệu” với một nút lệnh OK và biểu tƣợng Information ta viết nhƣ sau: MessageBox.Show("Bạn chƣa nhập dữ liệu", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information) Kết quả ta có: Chú ý: Trong khi chạy chƣơng trình ta có thể hiển thị giá trị hiện thời của một biến bất kỳ bằng hộp thông báo nhƣ sau: int a = 5; MessageBox.Show(a.ToString()); Bài giảng Cơ sở lập trình 2 29
  31. Kết quả xuất hiện hộp hội thoại sau: 2.3. Hàm thông báo MessageBox Ngoài chức năng thông báo, hàm MessageBox còn trả về giá trị của các nút chức năng mà ngƣời dùng đã chọn. Cú pháp của hàm MessageBox nhƣ sau: MessageBox.Show(Nội dung thông báo, Tiêu đề, Kiểu chức năng, Kiểu biểu tượng) = Giá trị trả về Trong đó giá trị trả về gồm: System.Windows.Forms.DialogResult.OK System.Windows.Forms.DialogResult.Cancel System.Windows.Forms.DialogResult.Abort System.Windows.Forms.DialogResult.Retry System.Windows.Forms.DialogResult.Ignore System.Windows.Forms.DialogResult.Yes System.Windows.Forms.DialogResult.No Ví dụ, ta có thể viết lại code cho nút btnThoat với yêu cầu chỉ thoát khi ngƣời dùng trả lời có muốn thoát nhƣ sau: private void btnThoat_Click(object sender, EventArgs e) { if (MessageBox.Show("Bạn có muốn thoát khỏi chƣơng trình không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question)== System.Windows.Forms.DialogResult.Yes) Application.Exit(); } 3. Các cấu trúc điều khiển 3.1. Câu lệnh lựa chọn if Bài giảng Cơ sở lập trình 2 30
  32. Dạng 1: if (Điềukiện) { Khối lệnh; } Hoạt động: Nếu nhận giá trị đúng thì đƣợc thực hiện. Dạng 2: if (Điều kiện) { Khối lệnh 1; } else { Khối lệnh 2; } Hoạt động: Nếu nhận giá trị đúng thì đƣợc thực hiện, bị bỏ qua. Ngƣợc lại nếu nhận giá trị sai thì đƣợc thực hiện, bị bỏ qua. 3.2. Câu lệnh lựa chọn Case switch (Biểu thức kiểm tra) { case : Khối lệnh 1; break; case : Khối lệnh 2; break; default: Khối lệnh n+1; break; } Hoạt động: máy so sánh giá trị của với giá trị của các . Nếu có giá trị thỏa mãn thì đƣợc thực hiện, sau đó máy sẽ thoát ngay ra khỏi câu lệnh switch. Nếu không thỏa mãn nào thì đƣợc thực hiện. Bài giảng Cơ sở lập trình 2 31
  33. Chú ý: nếu các biểu thức khác nhau cùng thực hiện chung một khối lệnh thì ta có thể viết gộp nhƣ sau: switch (Biểu thức kiểm tra) { case : case : Khối lệnh; break; default: Khối lệnh n+1; break; } Bài tập 1. Xây dựng chƣơng trình thực hiện các phép toán theo giao diện sau (các phép toán bao gồm: +, - , *, /, %). Hình 17. Giao diện bài tập 1 Yêu cầu: + Nút thực hiện có tác dụng thực hiện phép toán đối với số A và số B, kết quả lƣu vào ô kết quả. + Kết quả chỉ đƣợc tính khi ngƣời dùng nhập đủ giá trị cho số A, B và phép toán. + Phép toán chia phải kiểm tra trƣờng hợp mẫu =0. + Ô kết quả không đƣợc phép chỉnh sửa dữ liệu. Tạo dự án mới và thiết lập các thuộc tính của các điều khiển nhƣ sau: Bài giảng Cơ sở lập trình 2 32
  34. Điều khiển Thuộc tính Giá trị Name frmPheptoan FormBorderStyle Fixed3D Form1 Icon Chọn file ảnh có đuôi .ico bất kỳ Text Chuong trinh thuc hien cac phep toan Lable1 Text Số A Lable2 Text Số B Lable3 Text Phép toán: Lable4 Text Kết quả: TextBox1 Name txtSoA TextBox2 Name txtSoB TextBox3 Name txtPheptoan TextBox4 Name txtKetqua Name btnThuchien Button1 Text &Thuchien Name btnLamlai Button2 Text &Làm lại Name btnThoat Button3 Text T&hoát Mã lệnh: 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; namespace WindowsFormsApplication3 { public partial class frmPheptoan : Form { public frmPheptoan() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) Bài giảng Cơ sở lập trình 2 33
  35. { txtKetqua.Enabled = false; btnLamlai.Enabled = false; } private void btnThuchien_Click(object sender, EventArgs e) { int a, b, kq; if (txtSoA.Text == "") { MessageBox.Show("Bạn phải nhập A", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtSoA.Focus(); return; } if (txtSoB.Text == "") { MessageBox.Show("Bạn phải nhập B", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtSoB.Focus(); return; } a = Convert.ToInt16(txtSoA.Text); b = Convert.ToInt16(txtSoB.Text); switch (txtPheptoan.Text) { case "+": kq=a+b; txtKetqua.Text = kq.ToString(); break; case "-": kq=a-b; txtKetqua.Text = kq.ToString(); break; case "*": kq = a * b; txtKetqua.Text = kq.ToString(); break; case "/": if (txtSoB.Text == "0") { MessageBox.Show("Giá trị B phải khác 0!", "Thông Báo", MessageBoxButtons.OK, MessageBoxIcon.Error); txtSoB.Text = ""; Bài giảng Cơ sở lập trình 2 34
  36. txtSoB.Focus(); return; } kq = a / b; txtKetqua.Text = kq.ToString(); break; case "%": kq = a % b; txtKetqua.Text = kq.ToString(); break; default: MessageBox.Show("Bạn phải nhập lại phép toán", "Thông Báo", MessageBoxButtons.OK, MessageBoxIcon.Error); txtPheptoan.Text = ""; txtPheptoan.Focus(); return; } btnThuchien.Enabled = false; btnLamlai.Enabled = true; txtSoA.ReadOnly =true ; txtSoB.ReadOnly = true ; txtPheptoan.ReadOnly = true; } private void btnLamlai_Click(object sender, EventArgs e) { txtSoA.Text = ""; txtSoA.ReadOnly = false; txtSoB.Text =""; txtSoB.ReadOnly = false; txtPheptoan.Text = ""; txtPheptoan.ReadOnly = false; txtKetqua.Text = ""; btnThuchien.Enabled = true; txtSoA.Focus(); } private void btnThoat_Click(object sender, EventArgs e) { if (MessageBox.Show("Bạn có muốn thoát không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) Application.Exit(); } } } Bài giảng Cơ sở lập trình 2 35
  37. 3.3. Cấu trúc lặp for Cho phép thực hiện lặp đi lặp lại một đoạn chƣơng trình nhiều lần, với số lần lặp xác định. for (biểu thức khởi tạo; biểu thức điều kiện; biểu thức cập nhật) { Khối lệnh; [break;] } Hoạt động: Đầu tiên máy thực hiện biểu thức khởi tạo để khởi tạo giá trị của biến điều khiển, sau đó máy kiểm tra giá trị của biểu thức điều kiện, nếu biểu thức này đúng thì đƣợc thực hiện và cập nhật giá trị của biến điều khiển thông qua biểu thức cập nhật. Sau đó quay lại kiểm tra giá trị của biểu thức điều kiện, cứ lặp lại nhƣ vậy cho đến khi biểu thức điều kiện nhận giá trị sai thì dừng lại. Chú ý: để thoát ngay ra khỏi vòng lặp for ta có thể dùng lệnh break. Ví dụ: Dùng vòng lặp for để khởi tạo các giá trị ngẫu nhiên trong khoảng (0, 100) cho mảng một chiều gồm 10 phần tử. Mở một dự án mới rồi gõ đoạn mã sau vào cửa sổ code. private void Form1_Load(object sender, EventArgs e) { int[] m = new int[10]; Random rnd = new Random(); for(int i = 0; i<10; i++) { m[i] = rnd.Next(0,100); MessageBox.Show(m[i].ToString()); } } Bấm F5 để thực hiện chƣơng trình. 3.4. Cấu trúc lặp while Cho phép thực hiện lặp đi lặp lại một đoạn chƣơng trình nhiều lần, với số lần lặp không đƣợc xác định trƣớc. while (Biểu thức điều kiện) { Khối lệnh; [break;] } Bài giảng Cơ sở lập trình 2 36
  38. Hoạt động: Đầu tiên máy kiểm tra giá trị của , nếu biểu thức này nhận giá trị đúng thì đƣợc thực hiện. Sau đó lại quay lại kiểm tra giá trị của , cứ lặp lại nhƣ vậy cho đến khi nhận giá trị sai thì dừng lại. Chú ý: + Vì đƣợc kiểm tra trƣớc, nên có thể không đƣợc thực hiện lần nào nếu ngay từ đầu đã nhận giá trị sai và trƣớc khi thực hiện khối lệnh phải khởi gán giá trị cho . + Trong phải có ít nhất một lệnh làm thay đổi giá trị của để đến một lúc nào đó nhận giá trị sai, nhằm dừng vòng lặp lại, nếu không nó sẽ lặp mãi không dừng. Ví dụ: Nhập số thực a, tìm số tự nhiên n nhỏ nhất sao cho tổng: T = 1+1/2+ +1/n >= a Mở một dự án mới rồi gõ đoạn mã sau vào cửa sổ code. private void Form1_Load(object sender, EventArgs e) { double a= 2; double T= 0; int n = 0; while (T , sau đó kiểm tra giá trị của , nếu biểu thức này nhận giá trị đúng thì tiếp tục thực hiện , cứ lặp lại nhƣ vậy cho đến khi nhận giá trị sai thì dừng lại. Bài giảng Cơ sở lập trình 2 37
  39. Chú ý: + Vì đƣợc kiểm tra sau, nên luôn đƣợc thực hiện ít nhất 1 lần. + Trong phải có ít nhất một lệnh làm thay đổi giá trị của nhằm dừng vòng lặp lại. Ví dụ: Tính tổng T = 1 + 2 + + 10 Mở một dự án mới rồi gõ đoạn mã sau vào cửa sổ code. private void Form1_Load(object sender, EventArgs e) { int T = 0; int i = 1; do { T = T + i; i = i + 1; } while (i <= 10); MessageBox.Show("T = " + T.ToString ()); } 3.6. Câu lệnh try catch Đƣợc dùng trong các câu lệnh bẫy lỗi của chƣơng trình, cho phép bắt một số lỗi trong quá trình thực thi ứng dụng, ví dụ: biến các ký tự không phải dạng số thành số, thực hiện phép chia cho 0, sử dụng biến null Cú pháp bẫy lỗi trong C# đƣợc thể hiện nhƣ sau: try { // mã cho việc thực thi bình thƣờng } catch (System.Exception) { // xử lí lỗi } finally { // dọn dẹp } Cú pháp trên gồm 3 khối: Bài giảng Cơ sở lập trình 2 38
  40. Khối try chứa đựng đoạn mã cần phải thực thi trong chƣơng trình, nhƣng đoạn mã này có thể gặp phải một vài trạng thái lỗi. Khối catch chứa đựng đoạn mã giải quyết những những lỗi xẩy ra trong try, tham số của catch là các lớp bắt lỗi. C# có rất nhiều lớp bắt lỗi, trong đó System.Exception là lớp ở mức cao nhất có thể bắt đƣợc mọi loại lỗi xẩy ra trong try. Khối finally chứa đựng đoạn mã dọn dẹp tài nguyên hoặc bất kì hành động nào bạn muốn thực hiện sau khối try hay catch, khối này có thể có hoặc không. Hoạt động: Đầu tiên chƣơng trình thực thi các câu lệnh trong khối try, nếu không xuất hiện lỗi thì các câu lệnh đƣợc thực hiện bình thƣờng sau đó sẽ nhảy đến thực hiện các câu lệnh trong khối finally, tuy nhiên nếu xuất hiện lỗi trong khối try thì chƣơng trình sẽ tự động nhảy ngay tới thực thi các câu lệnh trong khối catch mà không đột ngột dừng chƣơng trình và sau đó cũng thực hiện các câu lệnh trong khối finally. Chú ý: C# không cho phép đặt lệnh return bên trong khối finally. Ví dụ: Bẫy lỗi đoạn chƣơng trình tính tổng 2 số nguyên a và b trong trƣờng hợp không nhập dữ liệu dạng số. private void bntTong_Click(object sender, EventArgs e) { try { txtTong.Text = Convert.ToString(Convert.ToInt32(txtSoA.Text) + Convert.ToInt32(txtSoB.Text)); } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); //MessageBox.Show("Bạn phải nhập dữ liệu số!"); } } 4. Hàm 4.1. Hàm có một giá trị trả về Cú pháp xây dựng: public|private Kiểudữliệutrảvề ([Tham số]) { Khai báo các biến cục bộ; Kiểudữliệutrảvề BiếnTG; Bài giảng Cơ sở lập trình 2 39
  41. Tính toán kết quả thông qua BiếnTG; return BiếnTG; } Khi xây dựng hàm có giá trị trả về ta thƣờng khai báo thêm một biến trung gian có kiểu trùng với kiểu dữ liệu trả về và công thức tính toán sẽ đƣợc tính thông qua biến trung gian này. Giá trị của biến trung gian sẽ đƣợc gán vào cho tên hàm thông qua lệnh return. Lệnh return có thể đƣợc đặt tại vị trí bất kỳ, khi gặp lệnh return chƣơng trình gán giá trị của biến đi k m sau lệnh return cho tên hàm và thoát ngay ra khỏi hàm. 4.2. Hàm không có giá trị trả về Cú pháp xây dựng: public|private void ([Tham số]) { Các dòng lệnh; } 4.3. Cách gọi hàm Hàm có giá trị trả về: đƣợc sử dụng nhƣ một thành phần của biểu thức, điều đó có nghĩa nó có thể đƣợc dùng trong lệnh gán và trong các biểu thức so sánh. Biến = ([Tham số]); Ví dụ, nếu ta có hàm: private double MyFunction(int a, int b) Thì ta gọi hàm nhƣ sau: x = MyFunction(n, m); Trong đó x là biến có kiểu double, n và m là hai biến int tƣơng ứng với a và b. Hàm không có giá trị trả về: đƣợc dùng nhƣ một câu lệnh độc lập, nó không đƣợc dùng trong lệnh gán hoặc trong các biểu thức so sánh. ([Tham số]); Giả sử ta có hàm: private void MySub(int a, int b) Khi đó hàm đƣợc gọi nhƣ sau: MySub (a, b); Chú ý: Các tham số khi xây dựng hàm đƣợc gọi là tham số hình thức, các tham số khi sử dụng hàm gọi là tham số thực sự, hai loại tham số này phải tƣơng ứng nhau về: số lƣợng, thứ tự và kiểu dữ liệu. Bài giảng Cơ sở lập trình 2 40
  42. 4.4. Ví dụ minh họa Viết và thực hiện hàm tính k! và hàm bẫy lỗi chia cho 0. Mở một dự án mới rồi gõ đoạn mã sau vào cửa sổ code. namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } double a; private double Giaithua(int k ) { double gt; int i; gt = 1; for(i=1;i<=k;i++) gt = gt * i; return gt; } private void Division() { int i=0; int n; try { n = 4 / i; MessageBox.Show(n.ToString()); } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); } } private void Form1_Load(object sender, EventArgs e) { a = Giaithua(6); MessageBox.Show(a.ToString()); Division(); } } } Bài giảng Cơ sở lập trình 2 41
  43. 5. Gỡ rối chƣơng trình Ở trong những giai đoạn đầu lập trình các chƣơng trình không tránh khỏi có sai sót và mắc lỗi, tuy nhiên ta có thể giảm khả năng mắc lỗi đến mức tối thiểu. 5.1. Một số giải pháp giảm lỗi Thiết kế cẩn thận, ghi chú các vấn đề quan trọng và cách giải quyết cho từng phần. Ghi chú từng thủ tục và mục đích của nó. Chú thích rõ ràng trong chƣơng trình (trong C# dòng chú thích đƣợc bắt đầu bởi 2 dấu gạch chéo //). Để đặt chú thích cho các dòng lệnh, ta có thể gõ 2 dấu gạch chéo // tại vị trí cần đặt chú thích, hoặc bôi đen các dòng lệnh rồi kích chọn biểu tƣợng trên thanh công cụ Standard. Để xóa dấu chú thích ở các dòng lệnh, ta có thể xóa 2 dấu gạch chéo // hoặc bôi đen các dòng lệnh muốn xóa dấu chú thích rồi kích chọn biểu tƣợng trên thanh công cụ Standard. Dùng cửa sổ danh sách các thuộc tính, các phƣơng thức, các hằng số, các lớp đối tƣợng trong C# để tránh việc gõ sai tên thuộc tính, phƣơng thức Để gọi cửa sổ này, trong cửa sổ soạn thảo code bấm tổ hợp phím Ctrl+J, kết quả khi ngƣời dùng gõ các ký tự bất kỳ, con trỏ sẽ tự động cuộn tới dòng đầu tiên chứa các ký tự đó cho ngƣời dùng chọn. Hình 18. Cửa sổ danh sách thuộc tính, phương thức, sự kiện. Sử dụng câu lệnh try catch để bắt các lỗi ngoại lệ của chƣơng trình. Bài giảng Cơ sở lập trình 2 42
  44. CHƢƠNG 4. TÌM HIỂU CÁC ĐIỀU KHIỂN CƠ BẢN 1. Tìm hiểu thuộc tính, phƣơng thức và sự kiện Mỗi một đối tƣợng trong C# đều có 3 đặc tính là Thuộc tính - Properties, Phương thức - Methods và Sự kiện – Events. Trong đó: Properties: là tập hợp các thuộc tính để mô tả một đối tƣợng nhƣ: tên, chiều cao, chiều rộng, mầu chữ, mầu nền Các thuộc tính có thể xác định trong khi thiết kế (Design time) hoặc trong lúc thi hành (Run time). Methodes: là những đoạn chƣơng trình chứa trong điều khiển, cho điều khiển biết cách thức để thực hiện một công việc nào đó, chẳng hạn làm ẩn sự xuất hiện của một điều khiển (phƣơng thức Hide). Evens: nếu thuộc tính mô tả đối tƣợng, phƣơng thức chỉ ra cách thức đối tƣợng hành động thì sự kiện là những phản ứng của đối tƣợng. Khi tạo một chƣơng trình trong C#, ta lập trình chủ yếu theo sự kiện, lập trình theo cách này có nghĩa là ta phải biết khi nào sự kiện xảy ra và làm gì khi sự kiện đó xảy ra? Điều này có nghĩa là chƣơng trình chỉ thi hành khi ngƣời dùng thực hiện một thao tác nào đó trên giao diện. 2. Mối quan hệ giữa thuộc tính, phƣơng thức và sự kiện Mặc dù thuộc tính, phƣơng thức và sự kiện có vai trò khác nhau nhƣng chúng thƣờng xuyên liên hệ với nhau. Ví dụ, nếu ta di chuyển một điều khiển bằng phƣơng thức Move thì một số thuộc tính nhƣ Top, Height, Left, Width sẽ thay đổi theo theo, khi đó kích cỡ của điều khiển thay đổi tức là sự kiện Resize xảy ra. Phụ thuộc lẫn nhau còn có nghĩa là ta có thể thực hiện một công việc bằng nhiều cách: xử lý trên thuộc tính hoặc xử lý bằng phƣơng thức. Ví dụ: ta có 2 cách để làm hộp văn bản textBox1 xuất hiện và biến mất trên màn hình: Thực hiện bằng thuộc tính: Xuất hiện: textBox1.Visible = true; Biến mất: textBox1.Visible = false; Thực hiện bằng phƣơng thức: Xuất hiện: textBox1.Show(); Bài giảng Cơ sở lập trình 2 43
  45. Biến mất: textBox1.Hide(); 3. Thuộc tính, phƣơng thức, sự kiện của một số điều khiển cơ bản 3.1. Form 3.1.1. Thuộc tính Name Tên form, bắt đầu bởi tiếp đầu ngữ frm BackColor Thiết lập mầu nền cho Form. BackgroundImage Thiết lập ảnh nền cho Form. BackgroundImageLayout Thiết lập chế độ hiển thị ảnh nền trên Form. Tile: hiển thị ảnh từ trên xuống, Center: hiển thị ảnh từ giữa ra, Stretch: dãn đều ảnh trên Form. AcceptButton Thiết lập nút lệnh Accept. Sự kiện Click của nút lệnh này đƣợc gọi bất cứ khi nào ngƣời dùng bấm phím Enter. CancelButton Thiết lập nút lệnh Cancel. Sự kiện Click của nút lệnh này đƣợc gọi bất cứ khi nào ngƣời dùng bấm phím Esc. Cursor Thiết lập chế độ hiển thị con trỏ trên Form. Enabled Nếu nhận giá trị True thì cho phép ngƣời dùng tác động lên Form, ngƣợc lại thì nhận giá trị False. Font Thiết lập kiểu chữ, cỡ chữ cho các điều khiển trên Form. ForeColor Thiết lập mầu chữ cho các điều khiển trên Form. FormBorderStyle Thiết lập kiểu đƣờng viền cho Form. Fixed Single: không thể thay đổi kích thƣớc của Form, Sizable: có thể phóng to thu nhỏ và thay đổi kích thƣớc của Form, Sizable ToolWindow: có thể thay đổi kích thƣớc của Form Icon Thiết lập biểu tƣợng cho Form (các tệp ảnh có đuôi .ico). MainMenuStrip Gắn kết Form với Menu. Opacity Thiết lập độ trong suốt cho nền của Form, nếu độ trong suốt < 100% thì có thể nhìn xuyên thấu những gì nằm bên dƣới Form. ShowIcon Nếu nhận giá trị True thì cho phép hiển thị biểu tƣợng đã đƣợc thiết lập ở thuộc tính Icon, ngƣợc lại thì nhận giá trị False. StartPosition Thiết lập vị trí xuất hiện của Form trên màn hình. Manual: xuất hiện ở góc trên bên trái màn hình, CenterScreen: giữa màn hình Text Thiết lập dòng tiêu đề của Form. Window State Thiết lập trạng thái của Form khi chạy chƣơng trình. Normal: hiển thị Form đúng theo kích cỡ thiết kế, Maximized: phóng to Form Bài giảng Cơ sở lập trình 2 44
  46. bằng màn hình, Minimized: thu nhỏ Form trên thanh Taskbar. 3.1.2. Sự kiện Để hiển thị danh sách các sự kiện của các điều khiển, ta kích chuột tại biểu tƣợng trên cửa sổ Properties: Hình 19. Danh sách sự kiện của điều khiển Form Muốn gọi sự kiện nào thì ta kích đúp chuột vào tên sự kiện đó, kết quả C# sẽ tự động tạo ra dòng tiêu đề của phƣơng thức chứa sự kiện trong cửa sổ code. Form có một số sự kiện thông dụng nhƣ sau: Load Đƣợc kích hoạt khi Form đƣợc nạp vào bộ nhớ, nó thƣờng đƣợc dùng để khởi tạo các giá trị và trạng thái cho các biến, các điều khiển trên Form. Click Đƣợc kích hoạt khi ngƣời dùng kích chuột trên Form. FormClosed Đƣợc kích hoạt khi ngƣời dùng kích chuột vào nút Close x ở góc trên bên phải để đóng Form. FormClosing Cũng đƣợc kích hoạt khi ngƣời dùng kích chuột vào nút Close x, nhƣng xảy ra trƣớc sự kiện FormClosed tức là đƣợc phát sinh trƣớc khi cửa sổ Form chuẩn bị đóng lại. Ví dụ: Nếu không muốn ngƣời dùng đóng Form bằng cách bấm chọn biểu tƣợng Close thì trong thủ tục FormClosing ta đặt thuộc tính Cancel = True nhƣ sau: private void Form1_FormClosing(object sender, FormClosingEventArgs e) Bài giảng Cơ sở lập trình 2 45
  47. { e.Cancel = true; } 3.2. Hộp văn bản - TextBox Hộp văn bản là điều khiển rất thông dụng, dùng để nhập dữ liệu đầu vào từ phía ngƣời sử dụng và hiển thị các kết quả đã tính toán đƣợc. 3.2.1. Thuộc tính Name Tên Textbox, bắt đầu bởi tiếp đầu ngữ txt BackColor Thiết lập mầu nền cho hộp TextBox. Enabled Enabled=False: không cho phép ngƣời dùng truy cập vào TextBox (Hộp Textbox bị mờ đi), ngƣợc lại thì bằng True. Font Thiết lập kiểu chữ và cỡ chữ cho hộp văn bản. ForeColor Thiết lập mầu chữ cho hộp văn bản. Locked Locked = True: khóa không cho phép dịch chuyển vị trí của hộp văn bản trên Form, ngƣợc lại thì nhận giá trị False. MaxLength Quy định chiều dài tối đa đƣợc chấp nhận của hộp văn bản, giá trị mặc định là 32767 hoặc 0, tức là có thể chứa 32767 ký tự. Mọi xác lập khác 0, ví dụ 5 thì chỉ cho phép ngƣời dùng nhập tối đa 5 ký tự vào hộp văn bản. Multiline Multiline = False: chỉ cho phép hiển thị văn bản trên một dòng, và khi thiết kế ta chỉ thay đổi đƣợc độ dài của hộp văn bản. Multiline = True: cho phép văn bản đƣợc hiển thị trên nhiều dòng, và có thể thay đổi cả độ dài lẫn độ rộng của hộp văn bản khi thiết kế. PasswordChar Thu ộc tính này cho phép ngƣời sử dụng bảo mật đƣợc thông tin nhập vào Textbox. Ví dụ đặt thuộc tính này bằng ký tự „*‟ khi đó toàn bộ dữ liệu nhập vào sẽ đƣợc hiển thị dƣới dạng dấu hoa thị. ReadOnly ReadOnly = True: hộp văn bản vẫn đƣợc truy cập nhƣng ngƣời dùng không thể thay đổi đƣợc nội dung bên trong. ScrollBars Thiết lập thanh cuốn ngang, dọc cho hộp văn bản (có hiệu lực khi Multiline = True). Chú ý: thanh cuốn ngang chỉ có hiệu lực khi WordWrap = False. TabIndex Thứ tự truy cập của hộp văn bản khi ngƣời dùng bấm phím Tab, thứ tự đầu tiên là 0. Text Chứa nội dung của hộp văn bản. TextAlign Thiết lập chế độ căn chỉnh: trái, phải hoặc giữa của dữ liệu trong hộp TextBox. Visible Visible = True: hiển thị hộp văn bản, Visible = False: ẩn hộp văn bản. Bài giảng Cơ sở lập trình 2 46
  48. WordWrap WordWrap = True: dòng văn bản đƣợc tự động cuộn xuống dòng khi gặp lề bên phải của hộp TextBox, ngƣợc lại thì nhận giá trị False. Chỉ có hiệu lực khi Multiline = True. 3.2.2. Sự kiện Hộp văn bản có một số sự kiện cơ bản sau: TextChanged Đƣợc kích hoạt khi ngƣời dùng thực hiện sự thay đổi bất kỳ trong hộp văn bản nhƣ: thêm, xoá, sửa, dán văn bản. Click Đƣợc kích hoạt khi ngƣời dùng kích chuột vào hộp văn bản. DoubleClick Đƣợc kích hoạt khi ngƣời dùng kích đúp chuột vào hộp văn bản. GotFocus Đƣợc kích hoạt khi ngƣời dùng chuyển tiêu điểm tới hộp văn bản. KeyPress Trả về ký tự (trừ các ký tự đặc biệt nhƣ phím Delete, Home, Ctrl, F1 ) mà ngƣời sử dụng gõ vào hộp văn bản thông qua thuộc tính KeyChar. KeyDown Trả về mã Ascii của tất cả các ký tự mà ngƣời sử dụng gõ vào hộp văn bản thông qua thuộc tính KeyCode. LostFocus Đƣợc kích hoạt khi hộp văn bản mất tiêu điểm. MouseMove Đƣợc kích hoạt khi ngƣời dùng di chuyển chuột qua hộp văn bản. MouseLeave Đƣợc kích hoạt khi ngƣời dùng dời chuột ra khỏi hộp văn bản. Ví dụ 1: Để hiển thị mã Ascii của một ký tự bất kỳ đƣợc gõ vào hộp văn bản TextBox1 ta có đoạn chƣơng trình nhƣ sau: private void textBox1_KeyDown(object sender, KeyEventArgs e) { int a; a = Convert.ToInt32(e.KeyCode); MessageBox.Show(a.ToString()); } Ví dụ 2: Dùng sự kiện KeyPress để kiểm tra việc nhập dữ liệu: chỉ cho phép nhập vào hộp văn bản TextBox1 các số từ 0 tới 9, dấu âm - , dấu chấm thập phân . , phím Del (có mã Ascii=13) và phím Backspace (có mã Ascii = 8) để xóa dữ liệu. Ta có đoạn chƣơng trình nhƣ sau: private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (((e.KeyChar >='0') && (e.KeyChar <='9')) ||(e.KeyChar == '-') || (e.KeyChar == '.') || (Convert.ToInt32(e.KeyChar) == 8) || (Convert.ToInt32(e.KeyChar) == 13)) { e.Handled = false; } else Bài giảng Cơ sở lập trình 2 47
  49. { e.Handled = true; } } Nếu mỗi ký tự đƣợc nhập vào hộp Textbox không thoả mãn điều kiện if thì sẽ bị hủy bỏ bằng cách đặt thuộc tính Handled là true. 3.3. Nút lệnh – Button Nút lệnh cho phép ngƣời dùng thực hiện một hành động nào đó. 3.3.1. Thuộc tính Name Tên nút lệnh, bắt đầu bởi tiếp đầu ngữ btn BackColor Thiết lập mầu nền cho nút lệnh. BackgroundImage Thiết lập ảnh nền cho nút lệnh. Enabled Enabled=False: ngƣời dùng không thể tác động lên nút lệnh, ngƣợc lại thì bằng True. Font Xác lập kiểu chữ và cỡ chữ cho nút lệnh. ForeColor Thiết lập mầu chữ cho nút lệnh. Image Thiết lập ảnh hiển thị trên nút lệnh. Locked Locked = True: khóa không cho phép dịch chuyển vị trí của nút lệnh trên Form, ngƣợc lại thì nhận giá trị False. TabIndex Thứ tự truy cập của nút lệnh khi ngƣời dùng bấm phím Tab. Text Tiêu đề của nút lệnh. Ta có thể quy định phím nóng cho nút lệnh bằng cách đặt dấu “&” trƣớc một ký tự của Text. Ví dụ &Quit sẽ đƣợc hiển thị là Quit, khi ngƣời sử dụng bấm Alt+Q chƣơng trình sẽ kích hoạt nút lệnh Quit. Visible Visible = True: hiển thị nút lệnh, Visible = False: ẩn nút lệnh. 3.3.2. Sự kiện Nút lệnh có một số sự kiện cơ bản sau: Click Đƣợc kích hoạt khi ngƣời dùng kích chuột vào nút lệnh. GotFocus Đƣợc kích hoạt khi ngƣời dùng chuyển tiêu điểm tới nút lệnh. LostFocus Đƣợc kích hoạt khi nút lệnh mất tiêu điểm. MouseDown Đƣợc kích hoạt khi ngƣời dùng đặt chuột vào nút lệnh. Bài giảng Cơ sở lập trình 2 48
  50. MouseUp Đƣợc kích hoạt khi ngƣời dùng đƣa chuột ra khỏi nút lệnh. MouseMove Đƣợc kích hoạt khi ngƣời dùng di chuyển chuột trên nút lệnh. MouseLeave Đƣợc kích hoạt khi ngƣời dùng dời chuột ra khỏi nút lệnh. 3.4. Nhãn – Lable Nhãn dùng để hiển thị những thông tin có tính chất cố định ngƣời sử dụng không có khả năng thay đổi ví dụ nhƣ dòng thông báo, hƣớng dẫn Nhãn có một số thuộc tính hay dùng sau: Name Tên nhãn, bắt đầu bởi tiếp đầu ngữ lbl BackColor Thiết lập mầu nền cho nhãn, nếu thiết lập BackColor = Transparent (mục lựa chọn đầu tiên trong tab Web) thì nhãn sẽ có nền giống với nền của Form. BorderStyle Thiết lập kiểu đƣờng viền cho nhãn. Font Thiết lập kiểu chữ và cỡ chữ cho nhãn. ForeColor Thiết lập mầu chữ cho nhãn. Image Thiết lập ảnh hiển thị trên nhãn. Locked Locked = True: khóa không cho phép dịch chuyển vị trí của nhãn trên Form, ngƣợc lại thì nhận giá trị False. TabIndex Thứ tự truy cập của nhãn khi ngƣời dùng bấm phím Tab. Text Tiêu đề của nhãn. TextAlign Thiết lập chế độ căn chỉnh: trái, phải hoặc giữa của tiêu đề nhãn. Visible Hiện hoặc ẩn nhãn. 3.5. Dòng mách nƣớc - ToolTip Điều khiển mách nƣớc cho phép hiển thị các thông tin chú thích khi ngƣời dùng đƣa chuột qua điều khiển có thiết lập ToolTip. Ví dụ dòng mách nƣớc “Hãy nhập tên truy cập” nhƣ hình dƣới đây. Bài giảng Cơ sở lập trình 2 49
  51. Hình 20. Ví dụ ToolTip Để tạo dòng mách nƣớc cho một điều khiển ta thực hiện nhƣ sau: Kéo điều khiển ToolTip vào Form, điều khiển ToolTip không đƣợc hiển thị ở trên Form mà đƣợc hiển thị ở thanh ngang cuối Form và đƣợc dùng chung cho mọi điều khiển trên form. Kích chuột chọn điều khiển muốn tạo ToolTip, trong cửa sổ Window Properties gõ nội dung dòng ToolTip tại thuộc tính ToolTip on ToolTip1. 3.6. Bài tập Bài tập 2. Lập chƣơng trình nhập tháng và năm dƣơng lịch, tính và in ra số ngày của tháng và năm đó. Hình 21. Giao diện bài tập 2 Yêu cầu: + Chỉ đƣợc phép nhập số nguyên vào hai hộp văn bản chứa tháng và năm. + Tháng phải có giá trị từ 1 đến 12, năm gồm 4 chữ số và có giá trị >=1900. + Kết quả chỉ đƣợc tính khi ngƣời dùng nhập đủ cả tháng và năm. Bài giảng Cơ sở lập trình 2 50
  52. Tạo dự án mới và thiết lập các thuộc tính của các điều khiển nhƣ sau: Điều khiển Thuộc tính Giá trị Name frmNgaythang FormBorderStyle Fixed3D Form1 Icon Chọn file ảnh có đuôi .ico bất kỳ Text Program of date Lable1 Text Nhập tháng Lable2 Text Nhập năm Lable3 Name lblKetqua Text Kết quả: Name txtNhapthang TextBox1 MaxLength 2 Name txtNhapnam TextBox2 MaxLength 4 Name btnKetqua Button1 Text &Kết quả Name btnLamlai Button2 Text &Làm lại Name btnThoat Button3 Text &Thoát 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; namespace WindowsFormsApplication1 { public partial class frmNgaythang : Form { public frmNgaythang() { InitializeComponent(); } private void txtNhapthang_KeyPress(object sender, KeyPressEventArgs e) { if (((e.KeyChar >='0') && (e.KeyChar <='9'))||(Convert.ToInt32(e.KeyChar)==8)) e.Handled = false; else e.Handled = true; Bài giảng Cơ sở lập trình 2 51
  53. } private void txtNhapnam_KeyPress(object sender, KeyPressEventArgs e) { if (((e.KeyChar >='0') && (e.KeyChar 12 || thang = 1900", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtNhapnam.Focus(); txtNhapnam.Text = ""; return; } switch (thang) { case 4: case 6: case 9: case 11: ngay = 30; break; case 1: case 3: case 5: Bài giảng Cơ sở lập trình 2 52
  54. case 7: case 8: case 10: case 12: ngay = 31; break; case 2: if (((nam % 4 == 0) && (nam % 100 != 0))||(nam % 400 == 0)) ngay = 29; else ngay = 28; break; } lblKetqua.Text = "Tháng " + thang + " năm " + nam + " có " + ngay + " ngày"; btnKetqua.Enabled = false; btnLamlai.Enabled = true; txtNhapthang.ReadOnly = true; txtNhapnam.ReadOnly = true; } private void btnLamlai_Click(object sender, EventArgs e) { txtNhapthang.Text = ""; txtNhapthang.ReadOnly = false; txtNhapthang.Focus(); txtNhapnam.Text = ""; txtNhapnam.ReadOnly = false; btnKetqua.Enabled = true; lblKetqua.Text = "Kết quả: "; } private void btnThoat_Click(object sender, EventArgs e) { if (MessageBox.Show("Bạn có muốn thoát không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) Application.Exit(); } } } Bài tập 3. Nhập 2 số nguyên a, b và tính tổng các số từ a đến b theo giao diện sau: Bài giảng Cơ sở lập trình 2 53
  55. Hình 22. Giao diện bài tập 3 Yêu cầu: Tạo dòng ToolTip “Nhập số nguyên” cho 2 hộp văn bản „Nhập a‟ và „Nhập b‟. Chỉ cho phép ngƣời dùng nhập số vào hai hộp văn bản. Nút Tổng: kiểm tra ngƣời dùng phải nhập dữ liệu cho cả hai số a và b, tính tổng các số từ a đến b nếu a < b, hoặc tính tổng các số từ b đến a nếu b < a, rồi hiển thị kết quả vào nhãn ở phía dƣới. Nút Làm lại: xóa các dữ liệu cũ ở các điều khiển, sau đó đặt con trỏ vào hộp văn bản Nhập a. Nút Thoát: thoát khỏi chƣơng trình quay về môi trƣờng soạn thảo. Bài tập 4. Nhập số nguyên dƣơng n, tạo n số nguyên ngẫu nhiên có giá trị từ 1 tới 100, và thực hiện các yêu cầu sau: Chỉ cho phép ngƣời dùng nhập số vào hộp văn bản Nhập n. Nút Nhập: kiểm tra ngƣời dùng phải nhập giá trị cho n, sau đó tạo n số ngẫu nhiên và hiển thị các số ngẫu nhiên đó ở nhãn Dẫy số. Nút Tính tổng: tính tổng n số ngẫu nhiên và hiển thị kết quả ở nhãn Tổng dẫy số. Nút Sắp xếp: sắp xếp n số ngẫu nhiên theo thứ tự tăng dần và hiển thị kết quả ở nhãn Sắp xếp. Bài giảng Cơ sở lập trình 2 54
  56. Nút Làm lại: xóa các dữ liệu cũ ở các điều khiển, sau đó đặt con trỏ vào hộp văn bản Nhập n. Nút Thoát: thoát khỏi chƣơng trình quay về môi trƣờng soạn thảo. Hình 23. Giao diện bài tập 4 Bài tập 5. Hộp thoại MessageBox của C# tuy rất đa dạng và phong phú nhƣng có lúc ta cũng cần một hộp thoại tƣơng tự theo phong cách riêng của mình, ví dụ hiển thị tiêu đề cho các nút nhấn bằng tiếng Việt. Ví dụ: viết chƣơng trình tự tạo hộp thoại thông báo thực hiện các yêu cầu theo giao diện sau: Hình 24. Giao diện bài tập 5 Kích chuột vào nút Thoát trên Form1 sẽ xuất hiện hộp thông báo Bạn có muốn thoát không? với giao diện tiếng Việt. Chọn nút Có để đóng Form1 và thoát khỏi chƣơng trình, chọn nút Không để quay lại Form1. Bài giảng Cơ sở lập trình 2 55
  57. Trong đó hộp thông báo Bạn có muốn thoát không? chính là một form đƣợc thiết kế tƣơng tự nhƣ một hộp thoại thông báo. Bước 1: Xây dựng Form1 Vào Microsoft Visual Studio 2010 tạo một dự án mới có tên Hopthoai và thiết lập các thuộc tính của các điều khiển nhƣ sau: Điều khiển Thuộc tính Giá trị Name Form1 Form1 StartPosition CenterScreen Name btnThoat Button1 Text Thoát Bước 2: Xây dựng form Thông báo Ta bổ sung thêm một form mới vào dự án theo các bƣớc sau: Chọn menu Project | Add Windows Forms xuất hiện hộp thoại Add New Item. Chọn Windows Form và đặt tên Message.cs tại ô Name rồi chọn nút Add. Kết quả form Message.cs đƣợc thêm vào dự án. Thay đổi kích thƣớc của form Message.cs nhƣ hình trên và thiết lập các thuộc tính của các điều khiển trên form nhƣ sau: Điều khiển Thuộc tính Giá trị Name frmMessage FormBorderStyle FixedToolWindow Message.vb ShowIcon False StartPosition CenterScreen Text Thông báo Name lblMessage Lable1 Modifiers Public PictureBox1 Image Question.bmp Name btnCo Button1 DialogResult Yes Text Có Button2 Name btnKhong Bài giảng Cơ sở lập trình 2 56
  58. DialogResult No Text Không Bước 3: Viết Code Mở cửa sổ code của Form1 và viết mã lệnh cho nút btnThoat nhƣ sau: private void btnThoat_Click(object sender, EventArgs e) { frmMessage frm = new frmMessage(); frm.lblMessage.Text = "Bạn có muốn thoát không?"; if (frm.ShowDialog() == System.Windows.Forms.DialogResult.Yes) Application.Exit(); } Chú ý: Từ một form ta không thể tác động trực tiếp tới một form khác mà phải khai báo một biến đại diện cho form muốn tác động và mọi thao tác đều đƣợc thực hiện trên biến này. Ví dụ từ form Form1 muốn hiển thị hoặc tác động tới các điều khiển trong form frmMessage ta khai báo biến frm có kiểu là frmMessage nhƣ trên. Để hiển thị một Form khác ta gọi phƣơng thức ShowDialog theo cú pháp sau: TênbiếnForm.ShowDialog(); Để truy cập tới thuộc tính của các điều khiển trong một Form khác ta thực hiện theo cú pháp sau: TênbiếnForm.Tênđiềukhiển.Tênthuộctính = Giátrị; Khi ta thiết lập giá trị DialogResult cho một nút lệnh thì nếu ngƣời dùng kích chuột vào nút lệnh đó cửa sổ Form chứa nút lệnh sẽ bị đóng lại và trả về giá trị của DialogResult tại nơi gọi phƣơng thức ShowDialog() để hiển thị Form đó. PictureBox là một điều khiển cho phép chứa các tệp ảnh có đuôi .bmp, .jpg Trong máy tính không có sẵn tệp ảnh Question.bmp mà ta phải tự tạo bằng ứng dụng Paint. 4. Một số điều khiển cơ bản khác 4.1. Nhóm – GroupBox Nhóm có thể chứa các điều khiển khác và tạo thành các vùng làm việc độc lập trên một Form. GroupBox có một số thuộc tính thƣờng dùng sau: Bài giảng Cơ sở lập trình 2 57
  59. Name Tên nhóm, bắt đầu bởi tiếp đầu ngữ grb BackColor Thiết lập mầu nền cho nhóm, nếu BackColor = Transparent thì nhóm sẽ có mầu nền giống với mầu nền của Form. BackgroundImage Thiết lập ảnh nền cho nhóm. BackgroundImageLayout Thiết lập chế độ hiển thị ảnh nền của nhóm. Enabled Nếu Enabled = False nhóm sẽ không hoạt động. Font Xác lập kiểu chữ và cỡ chữ của tiêu đề nhóm. ForeColor Xác lập mầu chữ của tiêu đề nhóm. Locked Locked = True: khóa không cho phép dịch chuyển vị trí của nhóm trên Form, ngƣợc lại thì nhận giá trị False. TabIndex Thứ tự truy cập của nhóm khi ngƣời dùng bấm phím Tab. Text Thiết lập tiêu đề của nhóm. Visible Visible = True: hiển thị nhóm, Visible = False: ẩn nhóm. 4.2. Hộp đánh dấu – CheckBox Hộp đánh dấu cho phép đồng thời không chọn, chọn một, hoặc chọn nhiều khả năng trong một nhóm các lựa chọn. 4.2.1. Thuộc tính Name Tên hộp CheckBox, bắt đầu bởi tiếp đầu ngữ chk BackColor Thiết lập mầu nền cho hộp CheckBox. BackgroundImage Thiết lập ảnh nền cho hộp CheckBox. Checked Trả về giá trị của hộp CheckBox ứng với trạng thái của nó khi tƣơng tác với ngƣời sử dụng: + Checked =True: hộp CheckBox đang đƣợc chọn + Checked = False: hộp CheckBox không đƣợc chọn. CheckState Thiết lập trạng thái cho hộp CheckBox: + CheckState = Checked: hộp CheckBox đƣợc chọn + CheckState = Unchecked: hộp CheckBox không đƣợc chọn. Enabled Nếu Enabled = False hộp CheckBox sẽ không hoạt động. Font Xác lập kiểu chữ và cỡ chữ của nội dung hộp CheckBox. ForeColor Xác lập mầu chữ của nội dung hộp CheckBox. Bài giảng Cơ sở lập trình 2 58
  60. Image Thiết lập ảnh hiển thị trên hộp CheckBox. Locked Locked = True: khóa không cho phép dịch chuyển vị trí của hộp CheckBox trên Form, ngƣợc lại thì nhận giá trị False. TabIndex Thứ tự truy cập khi ngƣời dùng bấm phím Tab. Text Thiết lập nội dung của hộp CheckBox. Visible Visible = True: hiển thị hộp CheckBox Visible = False: ẩn hộp CheckBox. 4.2.2. Sự kiện Click Đƣợc kích hoạt khi ngƣời dùng kích chuột vào hộp CheckBox. GotFocus Đƣợc kích hoạt khi ngƣời dùng chuyển tiêu điểm tới hộp CheckBox. LostFocus Đƣợc kích hoạt khi hộp CheckBox mất tiêu điểm. CheckedChanged Đƣợc kích hoạt khi hộp CheckBox thay đổi trạng thái. 4.3. Nút tuỳ chọn – RadioButton Nút tuỳ chọn chỉ cho phép ngƣời dùng chọn một khả năng trong một nhóm các lựa chọn. 4.3.1. Thuộc tính Name Tên nút tuỳ chọn, bắt đầu bởi tiếp đầu ngữ rdo BackColor Thiết lập mầu nền cho nút tùy chọn. BackgroundImage Thiết lập ảnh nền cho nút tùy chọn. Checked Trả về giá trị của nút tùy chọn khi tƣơng tác với ngƣời sử dụng. + Checked = True: nút tùy chọn đang đƣợc chọn + Checked = False: nút tùy chọn không đƣợc chọn. Enabled Nếu Enabled = False nút tuỳ chọn sẽ không hoạt động. Font Xác lập kiểu chữ và cỡ chữ của nội dung nút tùy chọn. ForeColor Xác lập mầu chữ của nội dung nút tùy chọn. Image Thiết lập ảnh hiển thị trên nút tùy chọn. Locked Locked = True: khóa không cho phép dịch chuyển vị trí của nút tùy chọn trên Form, ngƣợc lại thì nhận giá trị False. TabIndex Thứ tự truy cập khi ngƣời dùng bấm phím Tab. Bài giảng Cơ sở lập trình 2 59
  61. Text Thiết lập nội dung của nút tùy chọn. Visible True: hiển thị nút tùy chọn, False: ẩn nút tùy chọn. 4.3.2. Sự kiện Click Đƣợc kích hoạt khi ngƣời dùng kích chuột vào nút tuỳ chọn. GotFocus Đƣợc kích hoạt khi ngƣời dùng chuyển tiêu điểm tới nút tuỳ chọn. LostFocus Đƣợc kích hoạt khi nút tuỳ chọn mất tiêu điểm. CheckedChanged Đƣợc kích hoạt khi nút tùy chọn thay đổi trạng thái. Bài tập 6. Lập chƣơng trình nhập 2 số a và b, chọn và thực hiện các phép toán theo yêu cầu sau: Chỉ đƣợc nhập số cho a và b, không cho phép nhập dữ liệu vào hộp kết quả. Các phép toán chỉ đƣợc thực hiện khi ngƣời dùng nhập đủ hai dữ liệu cho a và b. Trong phép chia kiểm tra nếu b = 0 thì thông báo “Mẫu = 0” tại hộp Kết quả. Kích chọn phép toán nào thì thực hiện phép toán đó đối với a, b và lƣu kết quả vào hộp Kết quả. Nếu chọn hộp đánh dấu Max thì hiển thị “Max = ” ngƣợc lại chỉ hiển thị “Max”. Thực hiện tƣơng tự cho hộp đánh dấu Min. Bài giảng Cơ sở lập trình 2 60
  62. Hình 25. Giao diện bài tập 6 Vào Microsoft Visual Studio 2010 tạo một dự án mới đặt tên là Calculation và thiết lập các thuộc tính của các điều khiển nhƣ sau: Điều khiển Thuộc tính Giá trị Name frmCalculation FormBorderStyle Fixed3D Form1 Icon Chọn file ảnh có đuôi .ico bất kỳ Text Program of Calculation GroupBox1 Text Rỗng GroupBox2 Text Phép toán GroupBox3 Text So sánh Lable1 Text Nhập a = Lable2 Text Nhập b = Lable3 Text Kết quả = TextBox1 Name txtNhapA TextBox2 Name txtNhapB TextBox3 Name txtKetqua Name rdoCong RadioButton1 Text Cộng Bài giảng Cơ sở lập trình 2 61
  63. Name rdoTru RadioButton2 Text Trừ Name rdoNhan RadioButton3 Text Nhân Name rdoChia RadioButton4 Text Chia Name chkMax CheckBox1 Text Max Name chkMin CheckBox2 Text Min Name btnLamlai Button1 Text Làm lại Name btnThoat Button2 Text Thoát Viết Code: mở cửa sổ soạn thảo Code và viết các đoạn mã lệnh nhƣ sau: private void txtNhapa_KeyPress(object sender, KeyPressEventArgs e) { if (((e.KeyChar >='0') && (e.KeyChar <='9'))||(Convert.ToInt32(e.KeyChar)==8)) e.Handled = false; else e.Handled = true; } private void rdoCong_Click(object sender, EventArgs e) { int a,b; if (txtNhapa.Text == "") { MessageBox.Show("Bạn phải nhập giá trị cho a", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtNhapa.Focus(); rdoCong.Checked = false; return; } if (txtNhapb.Text == "") { MessageBox.Show("Bạn phải nhập giá trị cho b", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtNhapb.Focus(); rdoCong.Checked = false; return; } a = Convert.ToInt32(txtNhapa.Text); b = Convert.ToInt32(txtNhapb.Text); txtKetqua.Text = Convert.ToString(a + b); txtNhapa.Enabled = false; Bài giảng Cơ sở lập trình 2 62
  64. txtNhapb.Enabled = false; } private void chkMax_Click(object sender, EventArgs e) { int a,b; if (txtNhapa.Text == "") { MessageBox.Show("Bạn phải nhập giá trị cho a", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtNhapa.Focus(); chkMax.Checked = false; return; } if (txtNhapb.Text == "") { MessageBox.Show("Bạn phải nhập giá trị cho b", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtNhapb.Focus(); chkMax.Checked = false; return; } a = Convert.ToInt32(txtNhapa.Text); b = Convert.ToInt32(txtNhapb.Text); if (chkMax.Checked == true) { if (a>b) chkMax.Text = "Max= " + a.ToString (); else chkMax.Text = "Max= " + b.ToString (); } else chkMax.Text = "Max"; txtNhapa.Enabled = false; txtNhapb.Enabled = false; } Chú ý: trong đoạn mã lệnh trên tất cả các thủ tục: rdoCong_Click, rdoTru_Click, rdoNhan_Click, rdoChia_Click, chkMax_Click, chkMin_Click đều phải kiểm tra ngƣời dùng nhập dữ liệu vào hai hộp văn bản txtNhapA và txtNhapB. Để không phải viết lại đoạn mã lệnh kiểm tra nhiều lần ta viết một hàm KiemtraAB nhƣ sau: private bool KiemtraAB() { if (txtNhapa.Text == "") { MessageBox.Show("Bạn phải nhập giá trị cho a", "Thông báo",MessageBoxButtons.OK, MessageBoxIcon.Information); txtNhapa.Focus(); return false; } if (txtNhapb.Text == "") { MessageBox.Show("Bạn phải nhập giá trị cho b", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); Bài giảng Cơ sở lập trình 2 63
  65. txtNhapb.Focus(); return false; } return true; } private void rdoCong_Click(object sender, EventArgs e) { int a, b; if (KiemtraAB() == false) { rdoCong.Checked = false; } else { a = Convert.ToInt32(txtNhapa.Text); b = Convert.ToInt32(txtNhapb.Text); txtKetqua.Text = Convert.ToString(a + b); txtNhapa.Enabled = false; txtNhapb.Enabled = false; } } // Tương tự viết mã lệnh cho các thủ tục khác Bài tập 7. Lập chƣơng trình thực hiện bài toán theo yêu cầu và giao diện nhƣ sau: Hình 26. Giao diện bài tập 7 Kiểm tra ngƣời dùng phải nhập đủ dữ liệu cho Mã hàng, đơn giá và số lƣợng. Chỉ đƣợc phép nhập giá trị số cho Đơn giá và Số lƣợng. Bài giảng Cơ sở lập trình 2 64
  66. Nếu Giảm giá đƣợc chọn thì hiển thị 2 điều khiển giảm giá 5% và 10%, ngƣợc lại không hiển thị 2 điều khiển này. 4.4. Hộp danh sách – ListBox Hộp ListBox là một tập hợp các chuỗi ký tự đƣợc trình bày dƣới dạng liệt kê thành từng dòng trong một khung hình chữ nhật. Ta có thể chọn, bổ sung hoặc xoá một giá trị trong hộp danh sách. Khi hiển thị dữ liệu, nếu chiều ngang của Listbox nhỏ hơn độ dài các phần tử thì một phần dữ liệu sẽ bị che khuất, còn nếu số phần tử của Listbox vƣợt quá chiều dài của Listbox thì Listbox tự động cung cấp thanh cuốn dọc để cuộn tới các phần tử phía dƣới. 4.4.1. Thuộc tính Name Tên hộp ListBox, bắt đầu bởi tiếp đầu ngữ lst BackColor Thiết lập mầu nền cho hộp danh sách. DataSource Thiết lập nguồn dữ liệu cho ListBox Enabled Nếu Enabled = False hộp danh sách sẽ không hoạt động. Font Xác lập kiểu chữ và cỡ chữ cho hộp danh sách. ForeColor Xác lập mầu chữ cho hộp danh sách. MultiColumn MultiColumn = True: cho phép hiển thị dữ liệu theo nhiều cột. MultiColumn = False: chỉ cho phép hiển thị dữ liệu theo 1 cột. ColumnWidth Thiết lập độ rộng cho mối cột trong ListBox. Items Khởi tạo giá trị cho các phần tử của hộp danh sách trong thời gian thiết kế. Khi chọn thuộc tính Items trong cửa sổ Properties, C# mở ra một hộp soạn thảo cho phép ngƣời lập trình gõ vào giá trị các phần tử. Mỗi phần tử đƣợc đặt trên một dòng riêng biệt, để xuống dòng nhấn Enter. Items.Count Trả về tổng số phần tử của danh sách trong thời gian thi hành. Items[n] Trả về nội dung phần tử thứ n của danh sách trong thời gian thi hành. SelectedItem Tƣơng tự nhƣ thuộc tính Items[n], nhƣng chỉ có thể trả về nội dung của hoặc Text phần tử hiện hành đang đƣợc chọn. Locked Locked = True: khóa không cho phép dịch chuyển vị trí của hộp danh sách trên Form, ngƣợc lại thì nhận giá trị False. SelectedIndex Trả về số thứ tự của phần tử đang đƣợc chọn trong danh sách, phần tử đầu tiên có SelectedIndex = 0, nếu không có phần tử nào đƣợc chọn thì SelectedIndex = -1 SelectionMode Quy định chế độ lựa chọn các phần tử trong hộp danh sách khi thực thi chƣơng trình. SelectionMode có 4 giá trị: None - không cho phép lựa chọn Bài giảng Cơ sở lập trình 2 65
  67. các phần tử, One - cho phép chọn một phần tử, MultiSimple - cho phép lựa chọn nhiều phần tử riêng biệt, MultiExtended - cho phép chọn một khối các phần từ liền nhau. SelectedItems Trả về tập các phần tử đang đƣợc chọn. Sorted Nếu Sorted = True thì các phần tử trong danh sách đƣợc sắp xếp theo thứ tự ABC. TabIndex Thứ tự truy cập khi ngƣời dùng bấm phím Tab. Visible True: hiển thị hộp danh sách, False: ẩn hộp danh sách. 4.4.2. Sự kiện Click Đƣợc kích hoạt khi ngƣời dùng kích chuột vào hộp danh sách. DoubleClick Đƣợc kích hoạt khi ngƣời dùng kích đúp chuột vào hộp danh sách. GotFocus Đƣợc kích hoạt khi ngƣời dùng chuyển tiêu điểm tới hộp danh sách. LostFocus Đƣợc kích hoạt khi hộp danh sách mất tiêu điểm. SelectedIndex_ Đƣợc kích hoạt khi ngƣời dùng thay đổi trạng thái lựa chọn các dòng dữ Changed liệu trong hộp văn bản. 4.4.3. Phương thức Add: dùng để bổ sung một phần tử cho hộp danh sách trong thời gian thi hành và thƣờng đƣợc viết trong thủ tục Form_Load. Cú pháp của phƣơng thức này là: ListName.Items.Add(Item); Trong đó ListName là tên của hộp danh sách, Item là nội dung của phần tử ta muốn thêm vào hộp danh sách. Ví dụ, bổ sung phần tử có giá trị “Ha Noi” vào hộp danh sách lstQue ta thực hiện nhƣ sau: lstQue.Items.Add(“Ha Noi”); Remove: dùng để loại bỏ một phần tử của hộp danh sách theo nội dung trong thời gian thi hành. Cú pháp của phƣơng thức này là: ListName.Items.Remove(Item); Ví dụ, xóa phần tử có giá trị “Ha Noi” trong hộp danh sách lstQue ta viết nhƣ sau: lstQue.Items.Remove(“Ha Noi”); RemoveAt: dùng để loại bỏ một phần tử của hộp danh sách theo chỉ số trong thời gian thi hành. Cú pháp của phƣơng thức này là: Bài giảng Cơ sở lập trình 2 66
  68. ListName.Items.RemoveAt(Index); Ví dụ, xóa phần tử ở vị trí 1 trong hộp danh sách lstQue ta viết nhƣ sau: lstQue.Items.RemoveAt(1); Clear: dùng để loại bỏ tất cả các phần tử của hộp danh sách trong thời gian thi hành. Cú pháp của phƣơng thức này là: ListName.Items.Clear(); Ví dụ, xóa tất cả các phần tử trong hộp danh sách lstQue ta viết nhƣ sau: lstQue.Items.Clear(); Bài tập 8. Viết chƣơng trình minh hoạ các thao tác trên hộp Listbox theo yêu cầu sau: Nhập một tên nƣớc vào hộp văn bản Nhập tên nước, chọn nút Thêm mới để thêm nƣớc đó vào hộp danh sách, chọn nút Tìm kiếm để xem nƣớc đó đã có trong hộp danh sách chƣa? Chọn nút Xóa để xoá một tên nƣớc bất kỳ đƣợc chọn từ hộp danh sách. Chọn nút Thoát để thoát khỏi chƣơng trình. Hình 27. Giao diện bài tập 8 Vào Microsoft Visual Studio 2010 tạo một dự án mới và thiết lập các thuộc tính của các điều khiển nhƣ sau: Bài giảng Cơ sở lập trình 2 67
  69. Điều khiển Thuộc tính Giá trị Name frmTennuoc FormBorderStyle Fixed3D Form1 Icon Chọn file ảnh có đuôi .ico bất kỳ Text Chuong trinh minh hoa Listbox Lable1 Text Nhập tên nƣớc Lable2 Text Danh sách các nƣớc TextBox1 Name txtNuoc ListBox1 Name lstNuoc Name btnThemmoi Button1 Text &Thêm mới Name btnXoa Button2 Text &Xóa Name btnTimkiem Button3 Text Tìm &kiếm Name btnThoat Button4 Text T&hoát Viết Code: mở cửa sổ soạn thảo Code và viết các đoạn mã lệnh nhƣ sau: private void Form1_Load(object sender, EventArgs e) { txtNuoc.Focus(); btnTimkiem.Enabled = false; btnXoa.Enabled = false; } private void btnThemmoi_Click(object sender, EventArgs e) { if (txtNuoc.Text == "") { MessageBox.Show("Bạn phải nhập tên nước", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtNuoc.Focus(); return; } lstNuoc.Items.Add(txtNuoc.Text); txtNuoc.Text = ""; txtNuoc.Focus(); btnXoa.Enabled = true; btnTimkiem.Enabled = true; } private void btnXoa_Click(object sender, EventArgs e) { if (lstNuoc.Items.Count == 0) { Bài giảng Cơ sở lập trình 2 68
  70. MessageBox.Show("Không còn phần tử nào để xoá", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); btnXoa.Enabled = false; btnTimkiem.Enabled = false; return; } if (lstNuoc.SelectedIndex == -1) { MessageBox.Show("Bạn phải chọn một nước để xoá", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (MessageBox.Show("Bạn có muốn xoá không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) lstNuoc.Items.RemoveAt(lstNuoc.SelectedIndex); } private void btnTimkiem_Click(object sender, EventArgs e) { int i, index, d =0; if (lstNuoc.Items.Count == 0) { MessageBox.Show("Không còn phần tử nào để tìm kiếm", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); btnXoa.Enabled = false; btnTimkiem.Enabled = false; return; } if (txtNuoc.Text == "") { MessageBox.Show("Bạn phải nhập tên nước để tìm kiếm", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtNuoc.Focus(); return; } for (i = 0; i<= lstNuoc.Items.Count – 1; i++) if (lstNuoc.Items[i].ToString().ToLower() == txtNuoc.Text.ToLower()) { d = 1; index = i; break; } if (d == 1) { MessageBox.Show("Có tìm thấy nước " + txtNuoc.Text, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); lstNuoc.SelectedIndex = index; } else MessageBox.Show("Không tìm thấy nước " + txtNuoc.Text, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtNuoc.Text = ""; txtNuoc.Focus(); } Bài tập 9. Bài giảng Cơ sở lập trình 2 69
  71. Viết chƣơng trình minh hoạ các thao tác trên hộp Listbox theo giao diện và yêu cầu sau: Hình 28. Giao diện bài tập 9 Yêu cầu: + Nhập vào hộp danh sách 100 phần tử từ Items 1 đến Items 100. + Dữ liệu đƣợc hiển thị thành 4 cột trong một trang màn hình. + Ngƣời dùng có thể lựa chọn đồng thời một hoặc nhiều phần tử. Vào Microsoft Visual Studio 2010 tạo một dự án mới, đặt một hộp danh sách lstDanhsach và một nút lệnh btnKetqua với tiêu đề là Kết quả vào form Form1. Viết Code: mở cửa sổ soạn thảo Code và viết các đoạn mã lệnh nhƣ sau: private void Form1_Load(object sender, EventArgs e) { // Cho phép hiển thị nhiều cột lstDanhsach.MultiColumn = true ; // Hiển thị 4 cột trong một trang lstDanhsach.ColumnWidth = lstDanhsach.Width / 4; // Cho phép chọn đồng thời nhiều phần tử lstDanhsach.SelectionMode = SelectionMode.MultiSimple; // Add dữ liệu vào hộp danh sách for (int i = 1 ; i <= 100; i++) lstDanhsach.Items.Add("Items " + i); } private void btnKetqua_Click(object sender, EventArgs e) { string str = ""; // Duyệt qua từng phần tử đã chọn foreach (string Item in lstDanhsach.SelectedItems) Bài giảng Cơ sở lập trình 2 70
  72. str = str + Item + ", "; // Xóa dấu phẩy và dấu cách thừa ở cuối chuỗi str str = str.Remove(str.Length - 2, 2); MessageBox.Show("Bạn đã chọn phần tử " + str, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); } 4.5. Hộp lựa chọn – ComboBox Hộp ComboBox cho phép lƣu trữ và lựa chọn một mục dữ liệu trong một hộp danh sách thả xuống. 4.5.1. Thuộc tính Name Tên hộp ComboBox, bắt đầu bởi tiếp đầu ngữ cbo BackColor Thiết lập mầu nền cho hộp Combo. DataSource Thiết lập nguồn dữ liệu cho Combo. DropDownStyle DropDown gồm một hộp văn bản cho phép ngƣời sử dụng có thể nhập dữ liệu, kế bên có một mũi tên , nhấn vào đó sẽ xổ ra một danh sách các mục dữ liệu cho phép ngƣời dùng chọn lựa. Simple luôn hiển thị sẵn danh sách các mục dữ liệu bên dƣới hộp văn bản và cho phép ngƣời sử dụng có thể nhập dữ liệu vào hộp văn bản. DropDownList tƣơng tự nhƣ DropDown nhƣng ngƣời sử dụng chỉ có thể chọn các phần tử từ danh sách, khi gõ một ký tự vào hộp văn bản thì danh sách sẽ cuộn đến các phần tử đƣợc bắt đầu bởi ký tự đó. Enabled Nếu Enabled = False hộp Combo sẽ không hoạt động. Font Xác lập kiểu chữ và cỡ chữ cho hộp Combo. ForeColor Xác lập mầu chữ cho hộp Combo. Items Khởi tạo giá trị các phần tử của hộp Combo trong thời gian thiết kế. Items.Count Trả về tổng số phần tử của hộp Combo trong thời gian thi hành. Items[n] Trả về nội dung phần tử thứ n của hộp Combo trong thời gian thi hành SelectedItem Trả về nội dung của phần tử hiện hành đang đƣợc chọn. hoặc Text SelectedIndex Trả về số thứ tự của phần tử đang đƣợc chọn, phần tử đầu tiên có SelectedIndex=0, nếu không có phần tử nào đƣợc chọn thì SelectedIndex= -1 Sorted True: các phần tử trong danh sách đƣợc sắp xếp theo thứ tự ABC. TabIndex Thứ tự truy cập khi ngƣời dùng bấm phím Tab. Visible True: hiển thị hộp Combo, False: ẩn hộp Combo. 4.5.2. Sự kiện Bài giảng Cơ sở lập trình 2 71
  73. Click Đƣợc kích hoạt khi ngƣời dùng kích chuột vào hộp Combo. DoubleClick Đƣợc kích hoạt khi ngƣời dùng kích đúp chuột vào hộp Combo. GotFocus Đƣợc kích hoạt khi ngƣời dùng chuyển tiêu điểm tới hộp Combo. LostFocus Đƣợc kích hoạt khi hộp Combo mất tiêu điểm. SelectedIndex_ Đƣợc kích hoạt khi ngƣời dùng thay đổi trạng thái lựa chọn các dòng dữ liệu Changed trong hộp văn bản. TextChanged Đƣợc kích hoạt khi ngƣời dùng nhập, sửa, xóa dữ liệu tại vùng văn bản của hộp Combo hoặc khi thay đổi thuộc tính Text của hộp Combo từ mã lệnh. DropDown Chỉ xảy ra đối với hộp Combo DropDown và DropDownList, sự kiện này đƣợc gọi ngay sau khi ngƣời dùng nhấp mũi tên để thả hộp danh sách xuống (phím tắt Alt+). Vì thế sự kiện này chủ yếu đƣợc sử dụng để nhập dữ liệu cho các phần tử của hộp Combo. 4.5.3. Phương thức Add: dùng để bổ sung một phần tử cho hộp Combo trong thời gian thi hành và thƣờng đƣợc viết trong thủ tục Form_Load. Cú pháp: ComboName.Items.Add(Item); Với ComboName là tên hộp Combo, Item là nội dung phần tử muốn thêm vào hộp Combo. Ví dụ, bổ sung phần tử có giá trị “Ha Noi” vào hộp Combo cboQue: cboQue.Items.Add(“Ha Noi”); Remove: dùng để loại bỏ một phần tử của danh sách theo nội dung trong thời gian thi hành. Cú pháp: ComboName.Items.Remove(Item); Ví dụ, xóa phần tử có giá trị “Ha Noi” trong hộp Combo cboQue: cboQue.Items.Remove(“Ha Noi”); RemoveAt: dùng để loại bỏ một phần tử của hộp Combo theo chỉ số trong thời gian thi hành. Cú pháp: ComboName.Items.RemoveAt(Index); Ví dụ, xóa phần tử ở vị trí 1 trong hộp Combo cboQue: cboQue.Items.RemoveAt(1); Bài giảng Cơ sở lập trình 2 72
  74. Clear: dùng để loại bỏ tất cả các phần tử của hộp Combo trong thời gian thi hành. Cú pháp: ComboName.Items.Clear(); Ví dụ, xóa tất cả các phần tử trong hộp Combo cboQue: cboQue.Items.Clear(); Ví dụ: Giả sử có hộp combo cboQue, để nhập dữ liệu cho nó ta có 2 cách sau: Cách 1: Cập nhập bằng thủ tục Form_Load: private void Form1_Load(object sender, EventArgs e) { cboQue.Items.Add("Hà Nội"); cboQue.Items.Add("Nam Định"); } Cách 2: Cập nhập bằng sự kiện DropDown: private void cboQue_DropDown(object sender, EventArgs e) { cboQue.Items.Clear(); cboQue.Items.Add("Hà Nội"); cboQue.Items.Add("Nam Định"); } Bài tập 10. Lấy danh sách các thƣ mục có trong thƣ mục “D:\Baigiang” lƣu vào hộp Combo thông qua thuộc tính DataSource. Hình 29. Giao diện bài tập 10 Vào Microsoft Visual Studio 2010 tạo một dự án mới, đặt một hộp combo cboThumuc vào form frmCombo. Viết Code: mở cửa sổ soạn thảo Code và viết các đoạn mã lệnh nhƣ sau: Bài giảng Cơ sở lập trình 2 73
  75. private void frmCombo_Load(object sender, EventArgs e) { string[] Folder; Folder = System.IO.Directory.GetDirectories("D:\\Baigiang"); cboThumuc.DataSource = Folder; } Bài tập 11. Lập chƣơng trình thực hiện các công việc thay đổi Font chữ theo giao diện dƣới đây: Hình 30. Giao diện bài tập 11 Gợi ý: Cú pháp thay đổi kiểu Font chữ: .Font = new Font("TênFont", Cỡchữ) ; Cú pháp thay đổi hiệu ứng font chữ: .Font = new Font( .Font, FontStyle.HiệuỨng) ; Trong đó Hiệu ứng có thể nhận các giá trị: Bold, Regular, Italic, UnderLine, Strikeout. Để kết hợp các hiệu ứng ta dùng toán tử |, để loại trừ các hiệu ứng ta dùng toán tử ^, để lấy hiệu ứng của điều khiển ta dùng cú pháp .Font.Style Cú pháp thay đổi mầu chữ: .ForeColor = Color.Màu ; Bài tập 12. Bài giảng Cơ sở lập trình 2 74
  76. Lập chƣơng trình ghép tên nƣớc và tên thành phố theo giao diện và yêu cầu dƣới đây: Hình 31. Giao diện bài tập 12 Viết thủ tục EmptyOption() bỏ chọn tất cả các RadioButton tên thành phố. Khi kích chọn vào một nƣớc, giả sử France thì xuất hiện dòng thông báo: “Hãy chọn thành phố cho France” và gọi thủ tục EmptyOption Khi kích chọn một thành phố, nếu đúng là thành phố của tên nƣớc đã chọn thì xuất hiện dòng thông báo, ví dụ: “Chúc mừng bạn, thủ đô của France là Paris”, ngƣợc lại thông báo, ví dụ: “Bạn sai rồi, thủ đô của France không phải là London” Bài tập 13. Lập chƣơng trình thực hiện các công việc theo giao diện và yêu cầu dƣới đây: Chƣơng trình có một Form bán hàng trực tuyến, danh sách các mặt hàng đƣợc hiển thị sẵn trong hộp Listbox hoặc CheckedListBox “Danh sách các mặt hàng” Bài giảng Cơ sở lập trình 2 75
  77. Để mua hàng ngƣời dùng kích đúp vào mặt hàng cần mua trong “Danh sách các mặt hàng”, mặt hàng đƣợc chọn sẽ đƣợc hiển thị vào trong “Hàng đặt mua”. Hình 32. Giao diện bài tập 13 Chú ý: Khi mua hàng phải kiểm tra nếu mặt hàng này đã đƣợc mua thì dùng hộp thoại thông báo đã chọn mặt hàng đó và không đƣợc mua mặt hàng đó nữa. Ngƣời dùng có thể xoá các mặt hàng trong danh sách các mặt hàng đã chọn bằng cách kích đúp vào mặt hàng cần xoá, trƣớc khi xoá phải hỏi lại ngƣời dùng có muốn xoá mặt hàng đó hay không? Bài giảng Cơ sở lập trình 2 76
  78. Khi kích chuột vào nút “Đồng ý” kiểm tra ngƣời dùng phải nhập đầy đủ thông tin và hiện thông báo gồm các thông tin: Tên khách, Địa chỉ, Danh sách các mặt hàng đã mua, Phƣơng thức thanh toán và Hình thức liên lạc. 4.6. Điều khiển CheckedListBox Điều khiển CheckedListBox cho phép lƣu trữ và hiển thị các mục dữ liệu theo dòng và có một hộp CheckBox ở đầu dòng. Điều khiển CheckedListBox có tiếp đầu ngữ là clb và có các thuộc tính, sự kiện, phƣơng thức tƣơng tự nhƣ điều khiển ListBox. Ngoài ra nó có thêm một số thuộc tính và sự kiện khác nhƣ sau: CheckedItems Thuộc tính này trả về tập các phần tử đƣợc Check. ItemCheck Đƣợc kích hoạt khi ngƣời dùng kích đúp chuột vào hộp Combo. Bài tập 14. Tạo một form mới đặt tên là frmCheckListBox, đặt lên form hộp điều khiển CheckedListBox clbSach và nút lệnh btnKetqua. Viết chƣơng trình hiển thị 10 loại sách đƣợc chia thành 2 cột vào trong hộp clbSach. Khi ngƣời dùng đánh dấu vào hộp CheckBox của từng phần tử, sẽ xuất hiện hộp thông báo tên quyển sách tƣơng ứng với phần tử đó, nhƣ hình minh họa sau: Bài giảng Cơ sở lập trình 2 77
  79. Hình 33. Giao diện bài tập 14 Khi ngƣời dùng kích chọn nút Kết quả sẽ xuất hiện hộp thoại thông báo tên tất cả các quyển sách ngƣời dùng đã chọn. Viết Code: mở cửa sổ soạn thảo Code và viết các đoạn mã lệnh nhƣ sau: private void Form1_Load(object sender, EventArgs e) { clbSach.Items.Add("Visual Basic.NET 2005"); clbSach.Items.Add("Visual C#.NET 2005"); clbSach.Items.Add("Lập trình Oracle"); clbSach.Items.Add("Lập trình Cơ sở dữ liệu"); clbSach.Items.Add("Lập trình C"); clbSach.Items.Add("Lập trình Pascal"); clbSach.Items.Add("Phân tích thiết kế hướng đối tượng"); clbSach.Items.Add("Lập trình C For Win"); clbSach.Items.Add("Nhập môn Xử lý ảnh"); clbSach.MultiColumn = true; clbSach.ColumnWidth = clbSach.Width / 2; } Bài giảng Cơ sở lập trình 2 78
  80. private void btnKetqua_Click(object sender, EventArgs e) { string str=""; // Duyệt qua từng phần tử đã chọn foreach (string item in clbSach.CheckedItems) str = str + item + ", "; // Xóa dấu phẩy và dấu cách thừa ở cuối chuỗi str str = str.Remove(str.Length - 2, 2); MessageBox.Show("Bạn đã chọn sách " + str, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void clbSach_ItemCheck(object sender, ItemCheckEventArgs e) { // Dựa vào thuộc tính NewValue của đối e để biết trạng thái của hộp Checkbox if (e.NewValue == CheckState.Checked) MessageBox.Show("Bạn đã chọn sách " + clbSach.Text, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); } 4.7. Điều khiển NumericUpDown Điều khiển NumericUpDown cho phép ngƣời dùng lựa chọn một giá trị số trong một khoảng giá trị với một bƣớc nhảy xác định. 4.7.1. Thuộc tính Name Tên điều khiển NumericUpDown, bắt đầu bởi tiếp đầu ngữ nud Increment Giá trị của bƣớc nhảy. Maximum Cận trên của khoảng giá trị. Minimum Cận dƣới của khoảng giá trị. Value Giá trị hiện tại của điều khiển NumericUpDown. 4.7.2. Sự kiện ValueChanged Đƣợc kích hoạt khi ngƣời dùng thay đổi giá trị của điều khiển. Bài tập 15. Dùng điều khiển NumericUpDown để giải phƣơng trình bậc hai đủ: ax2 + bx + c = 0 (a, b, c có giá trị trong đoạn [-100, 100]) Mở một đồ án mới và thiết kế giao diện với các điều khiển nhƣ sau: Ba điều khiển NumericUpDown có tên nudNhapA, nudNhapB, nudNhapC. Các thuộc tính: Maximum = 100, Minimum = -100, Increment = 1. Bài giảng Cơ sở lập trình 2 79
  81. Ba hộp Textbox có tên txtKetqua, txtX1, txtX2. Các thuộc tính: ReadOnly = True, BackColor =White. Hộp kết quả có thuộc tính Multiline = True. Hai nút lệnh btnGiaiPTBH, btnThoat và các nhãn Label Hình 34. Giao diện bài tập 15 Viết Code: mở cửa sổ soạn thảo Code và viết các đoạn mã lệnh nhƣ sau: private void btnGiaiPTBH_Click(object sender, EventArgs e) { PTBH(Convert.ToInt32(nudNhapA.Value), Convert.ToInt32(nudNhapB.Value), Convert.ToInt32(nudNhapC.Value)); } private void PTBH(int a, int b, int c) { double delta ,x1,x2; if ((a == 0) || (b == 0) || (c == 0)) { txtKetqua.Text = "Không giải vì không phải phương trình bậc hai đủ"; btnGiaiPTBH.Enabled = false ; return; } delta = b * b - 4 * a * c; if (delta < 0) { txtKetqua.Text = txtKetqua.Text + "Phương trình vô nghiệm"; btnGiaiPTBH.Enabled = false; return; } if (delta == 0) { x1 = Math.Round ((-b / (2.0 * a)), 2); txtKetqua.Text = txtKetqua.Text + "Phương trình có nghiệm kép"; txtX1.Text = Convert.ToString(x1); txtX2.Text = Convert.ToString(x1); Bài giảng Cơ sở lập trình 2 80
  82. btnGiaiPTBH.Enabled = false; return; } x1 = Math.Round((-b + Math.Sqrt(delta)) / (2 * a), 2); x2 = Math.Round((-b - Math.Sqrt(delta)) / (2 * a), 2); txtKetqua.Text = txtKetqua.Text + "Phương trình có 2 nghiệm phân biệt"; txtX1.Text = Convert.ToString(x1); txtX2.Text = Convert.ToString(x2); btnGiaiPTBH.Enabled = false; } private void EmptyText() { txtX1.Text = ""; txtX2.Text = ""; } private void nudNhapA_ValueChanged(object sender, EventArgs e) { txtKetqua.Text = "A=" + nudNhapA.Value + System.Environment.NewLine; txtKetqua.Text = txtKetqua.Text + "B=" + nudNhapB.Value + System.Environment.NewLine; txtKetqua.Text = txtKetqua.Text + "C=" + nudNhapC.Value + System.Environment.NewLine; btnGiaiPTBH.Enabled = true; EmptyText(); } // Thực hiện tương tự cho nudNhapB_ValueChanged và nudNhapC_ValueChanged 4.8. Thanh cuộn HScrollBar và VScrollBar Thanh cuộn ngang HScrollBar và thanh cuộn dọc VScrollBar cho phép ngƣời dùng lựa chọn một giá trị số trong một khoảng giá trị xác định với một bƣớc nhẩy cho trƣớc. 4.8.1. Thuộc tính Name Tên thanh cuộn, bắt đầu bởi tiếp đầu ngữ hsb và vsb. Minimum Số nguyên xác định giá trị nhỏ nhất cho thanh cuộn. Maximum Số nguyên xác định giá trị lớn nhất cho thanh cuộn. Value Cho biết giá trị hiện thời của thanh cuộn. LargeChange Chỉ ra mức độ thay đổi của thuộc tính Value khi ngƣời dùng nhấn chuột trên thanh cuộn. SmallChange Chỉ ra mức độ thay đổi của thuộc tính Value khi ngƣời dùng nhấn chuột vào các mũi tên trên thanh cuộn (giá trị mặc định = 1). 4.8.2. Sự kiện Bài giảng Cơ sở lập trình 2 81
  83. ValueChanged Đƣợc kích hoạt khi ngƣời dùng thay đổi giá trị của thanh cuộn. Scroll Xảy ra khi ngƣời dùng kéo rê chuột hoặc kích chuột vào các mũi tên trên thanh cuộn. Bài tập 16. Dùng thanh cuộn HScrollBar để thay đổi mầu nền cho Form. Hình 35. Giao diện bài tập 16 Vào Microsoft Visual Studio 2010 tạo một dự án mới, đặt tên form là frmMaunen và đặt vào form các điều khiển sau: Ba điều khiển HScrollBar có tên hsbRed, hsbGreen, hsbBlue. Các thuộc tính: Maximum = 255, Minimum = 0, LargeChange = 10, SmallChange = 1. Ba nhãn Label đặt ở bên phải các thanh cuộn có tên lblRed, lblGreen, lblBlue để lƣu giá trị hiện thời của các thanh cuộn tƣơng ứng. Viết Code: mở cửa sổ soạn thảo Code và viết các đoạn mã lệnh nhƣ sau: private void hsbRed_ValueChanged(object sender, EventArgs e) { this.BackColor = Color.FromArgb(hsbRed.Value, hsbGreen.Value, hsbBlue.Value); lblRed.Text = hsbRed.Value.ToString (); } private void hsbGreen_ValueChanged(object sender, EventArgs e) { this.BackColor = Color.FromArgb(hsbRed.Value, hsbGreen.Value, hsbBlue.Value); lblGreen.Text = hsbGreen.Value.ToString(); } private void hsbBlue_ValueChanged(object sender, EventArgs e) { Bài giảng Cơ sở lập trình 2 82
  84. this.BackColor = Color.FromArgb(hsbRed.Value, hsbGreen.Value, hsbBlue.Value); lblBlue.Text = hsbBlue.Value.ToString(); } Chú ý: Color.FromArgb(Red, Green, Blue) cho phép tạo một màu bằng cách kết hợp các giá trị của 3 mầu cơ bản Red, Green, Blue. Ba mầu này nhận các giá trị từ 0 đến 255. 4.9. Điều khiển Timer Điều khiển định thời gian Timer cho phép thực thi lại một hành động sau một khoảng thời gian xác định. Khi ta đƣa điều khiển Timer vào Form nó không xuất hiện trên Form mà xuất hiện nhƣ một biểu tƣợng ở trên một khay đặt ở cuối cửa sổ thiết kế. Khi chạy chƣơng trình điều khiển Timer cũng không xuất hiện. 4.9.1. Thuộc tính Name Tên điều khiển Timer, bắt đầu bởi tiếp đầu ngữ tmr Interval = n là chu kỳ thực hiện sự kiện Tick của điều khiển Timer. n là số nguyên, đƣợc tính bằng mili giây và có giá trị >0 Enabled Enabled = True: cho phép điều khiển Timer hoạt động Enabled = False: không cho phép điều khiển Timer hoạt động. 4.9.2. Sự kiện Tick Sự kiện này đƣợc kích hoạt sau mỗi chu kỳ Interval. 4.9.3. Phương thức Start: kích hoạt điều khiển Timer, phƣơng thức này tƣơng tự thuộc tính Enabled = true. Cú pháp: TimerName.Start(); Stop: dừng điều khiển Timer, phƣơng thức này tƣơng đƣơng với thuộc tính Enabled = false. Cú pháp: TimerName.Stop(); Bài tập 17. Viết chƣơng trình mô tả sự chuyển động của mặt trăng gồm 8 hình ảnh đặt trong thƣ mục D:\Icons\Moon nhƣ sau: Bài giảng Cơ sở lập trình 2 83
  85. Hình 36. Giao diện bài tập 17 Vào Microsoft Visual Studio 2010 tạo một dự án mới và thiết lập các thuộc tính của các điều khiển nhƣ sau: Điều khiển Name Text Image Visible Form1 frmMoon Trang chuyen dong PictureBox1 pic1 Moon01.bmp False PictureBox2 pic2 Moon02.bmp False PictureBox3 pic3 Moon03.bmp False PictureBox4 pic4 Moon04.bmp False PictureBox5 pic5 Moon05.bmp False PictureBox6 pic6 Moon06.bmp False PictureBox7 pic7 Moon07.bmp False PictureBox8 pic8 Moon08.bmp False PictureBox9 pic True Button1 btnStart Start True Button2 btnExit Exit True Timer tmrTimer Enabled = True và Interval = 250 Viết Code: mở cửa sổ soạn thảo Code và viết các đoạn mã lệnh nhƣ sau: public partial class frmMoon : Form { int Coquay, Curmoon; public frmMoon() { InitializeComponent(); } private void frmMoon_Load(object sender, EventArgs e) Bài giảng Cơ sở lập trình 2 84