Bài giảng Lập trình C# (Sharp) - Hồ Văn Lâm

ppt 225 trang hapham 770
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình C# (Sharp) - Hồ Văn Lâm", để 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:

  • pptbai_giang_lap_trinh_c_sharp_ho_van_lam.ppt

Nội dung text: Bài giảng Lập trình C# (Sharp) - Hồ Văn Lâm

  1. Lập trình C# (Sharp) GV: Hồ Văn Lâm Khoa Tin học, ĐH Quy Nhơn 1
  2. Chương 1: C# và kiến trúc của .NET ⚫ .NET Platform ⚫ .NET Framework ⚫ Dịch chương trình 2
  3. .NET Platform ⚫ .NET Platform là một framework mới, cung cấp các API (Application Programming Interface) ⚫ .NET Platform cho phép các công nghệ khác nhau chạy trên nó như: – COM+, ASP, XML – Các giao thức mới như SOAP, WSDL – Tập trung vào Internet. 3
  4. .NET Platform ⚫ .NET Platform gồm 4 thành phần: – Tập hợp các ngôn ngữ lập trình (C#, VB.NET), tập hợp các công cụ phát triển (Visual Studio .NET), thư viện các class và Common Language Runtime (CLR). – Tập hợp các .NET Enterprise Servers (SQL Server 2005, Exchange 2005, BizTalk 2005 ) – Web Service: cho phép sử dụng các service này để xây dựng những ứng dụng như bảo mật, xác định người sử dụng – Hỗ trợ các thiết bị không phải là máy tính như điện thoại di động, máy chơi điện tử 4
  5. 2. .NET Framework ⚫ Chứa đặc tả CTS (Common Type System) mà tất cả các thành phần đều phải tuân theo. ⚫ CTS hỗ trợ những khái niệm chung như: lớp, interface, delegate, kiểu tham chiếu và kiểu giá trị. Có CLS (Common Language Specification) - cung cấp các quy tắc phục vụ cho việc tích hợp ngôn ngữ. ⚫ Những chương trình dịch thoả mãn CLS sẽ tạo ra các đối tượng có thể thao tác với nhau. ⚫ Những ngôn ngữ thoả mãn CLS có thể sử dụng toàn bộ thư viện FCL (Framework Class Library). 5
  6. Các thành phần của .NET Framework ⚫ 4 ngôn ngữ chuẩn: C#, VB.NET, Managed C++, và JScript .NET ⚫ CLR (Common Language Runtime) – Là thành phần quan trọng nhất của .NET Framework. – Cung cấp môi trường mà trong đó các chương trình sẽ được thực hiện. ⚫ Một số thư viện class có liên quan, gọi chung là Framework Class 6
  7. Kiến trúc của .NET Framework 7
  8. 3. Dịch chương trình ⚫ Khi dịch chương trình, mã nguồn C# được dịch thành IL (Microsoft Intermediate Language). – IL được lưu trên 1 file trong ổ đĩa. – File IL do C# tạo ra cũng tương tự như file IL do các ngôn ngữ .NET khác tạo ra. ⚫ Khi chạy chương trình, IL được dịch 1 lần nữa, bằng cách sử dụng chương trình dịch JIT (Just In Time ). Kết quả là tạo ra mã máy bởi Common Language Runtime (CLR), được thực hiện bởi bộ xử lý. – Trình dịch JIT sẽ đọc từng lệnh trong file IL, dịch ra mã máy, sau đó yêu cầu bộ xử lý sẽ thực hiện luôn và còn JIT quay lại tiếp tục thực hiện với lệnh kế tiếp. 8
  9. 3. Dịch chương trình 9
  10. Chương 2: Căn bản C# ⚫ Chương trình đầu tiên using System; class Hello { static void Main() { Console.WriteLine("Hello World"); } } ⚫ File Hello.cs ⚫ Bổ sung namespace System ⚫ Chương trình bắt đầu thực hiện từ hàm Main ⚫ In ra màn hình 10 ⚫ Tên file và tên class không nhất thiết phải giống nhau
  11. Cấu trúc của một chương trình ⚫ Nếu namespace không được xác định => sử dụng namespace mặc định ⚫ Namespace có thể chứa struct, interface, delegate và enum ⚫ Namespace có thể được sử dụng ở các file khác ⚫ Trường hợp đơn giản nhất: Một lớp, một file, và chỉ sử dụng namespace mặc định • Câu lệnh C# được kết thúc bởi một dấu chấm phẩy (;). • Nhiều câu lệnh có thể gộp thành một khối được bao ở hai đầu bởi cặp dấu ngoặc nghéo { }, • Câu lệnh nếu dài có thể tiếp tục xuống hàng dưới không cần đến một ký tự 11 báo cho biết câu lệnh tiếp tục hàng dưới.
  12. Chương 2: Căn bản C# 12
  13. Biến và kiểu dữ liệu ⚫ Biến là gì? – Là một khoảng không gian trong bộ nhớ máy tính được dành ra để lưu trữ một giá trị. – Tên của biến được dùng để tham chiếu đến giá trị – Khai báo biến là báo cho máy dành ra một vùng nhớ để lưu một kiểu dữ liệu: – Cú pháp khai báo biến: [ modifier ] datatype identifer ; – Ví dụ: int a; public float b; – Phạm vi hoạt động của biến là đoạn chương trình mà biến được khai báo, trong một đoạn chương trình không được khai báo hai biến trùng tên nhau. 13
  14. kiểu dữ liệu ⚫ C# là một ngôn ngữ được kiểm soát chặt chẻ về mặt kiểu dữ liệu, phân biệt chữ hoa chữ thường. – Value Type - Kiểu dữ liệu cơ bản: kiểu dữ liệu khác lớp đối tượng – Reference Type - Kiểu tham chiếu: kiểu dữ liệu là lớp đối tượng Kiểu số nguyên Name CTS Type Description Range (min:max) byte System.Byte 8-bit signed integer 0:255 (0:28-1) ushort System.UInt16 16-bit signed integer 0:65,535 (0:216-1) uint System.UInt32 32-bit signed integer 0:4,294,967,295 (0:232-1) ulong System.UInt64 64-bit signed integer 0:18,446,744,073,709,551,615(0:264-1) 14
  15. kiểu dữ liệu Kiểu số nguyên Name CTS Type Description Range (min:max) sbyte System.SByte 8-bit signed integer -128:127 (-27:27-1) short System.Int16 16-bit signed integer -32,768:32,767 (-215:215-1) -2,147,483,648:2,147,483,647 (-231:231- int System.Int32 32-bit signed integer 1) -9,223,372,036,854,775,808: long System.Int64 64-bit signed integer 9,223,372,036,854,775,807 (-263:263-1) 15
  16. kiểu dữ liệu Kiểu số thực Name CTS Type Description Range (approximate) 32-bit single-precision ±1.5 × 10-45 to ±3.4 × Float System.Single floating- point 1038 64-bit double-precision ±5.0 × 10-324 to ±1.7 × Double System.Double floating- point 10308 128-bit high precision ±1.0 × 10-28 to ±7.9 × decimal System.Decimal decimal notation 1028 16
  17. kiểu dữ liệu Kiểu Boolean và Char Name CTS Type Value bool System.Boolean true or false Represents a single 16-bit (Unicode) char System.Char character Kiểu chuỗi: ⚫ Kiểu string chứa một chuỗi ký tự. Khi khai báo một biến chuỗi sử dụng từ khoá string giống như sau: string myString; ⚫ Thường thì phải khởi gán một biến chuỗi: string myString = "Xin chao“; 17
  18. Biến và kiểu dữ liệu ⚫ Các ký tự đặc biệt Escape Sequence Character \' Single quote \" Double quote \\ Backslash \0 Null \a Alert \b Backspace \f Form feed \n New line \r Carriage return \t Tab character 18 \v Vertical tab
  19. Reference Type ⚫ Lớp đối tượng Object (System.Object): là lớp trừu tượng, là lớp cha của tất cả các lớp. Khi định nghĩa một lớp A. Mặc nhiên A sẽ lấy Object làm lớp cha. ⚫ Reference Type: – Kiểu lớp: Object, String, CHocSinh, CLopHoc, 19
  20. Hằng ⚫ Một hằng (constant) là một biến nhưng trị không thể thay đổi được suốt thời gian thi hành chương trình. ⚫ Thí dụ: const int a = 100; // giá trị này không thể bị thay đổi ⚫ Hằng có những đặc điểm sau : – Hằng bắt buộc phải được gán giá trị lúc khai báo. – Trị của hằng phải có thể được tính toán vào lúc biên dịch, không thể gán một hằng từ một trị của một biến. Nếu muốn làm thế thì phải sử dụng đến một read-only field. – Hằng bao giờ cũng static, tuy nhiên ta không thể đưa từ khoá static vào khi khai báo hằng. ⚫ Có ba thuận lợi khi sử dụng hằng trong chương trình: – Hằng làm cho chương trình đọc dễ dàng hơn, – Hằng làm cho dễ sữa chương trình hơn. – Hằng làm cho việc tránh lỗi dễ dàng hơn. 20
  21. Phép toán và biểu thức ⚫ Phép gán: = x=y+5; a=b=c=5; a=a+1; a+b=5; ⚫ Phép toán số học: + - * / % x=a+10*2; y=5%2; y=-5; x=x+5;  x +=5 (+,-,*, /, %) 21 x=x+1;  x +=1  x++ (1 và +, -)
  22. Phép toán và biểu thức ⚫ Phép toán quan hệ: > >= = 5 a==b a != 7 ⚫ Phép toán logic: && || ! x>5 && x 10 3 true !(3 false 22
  23. Toán tử 23
  24. Toán tử ⚫ Bảng mô tả cách viết tắt của các phép toán 24
  25. Toán tử ⚫ The Ternary Operator ⚫ Cú pháp : condition ? true_value : false_value ⚫ Thí dụ : int x = 1; string s = x.ToString() + " "; s += (x == 1 ? "man" : "men"); Console.WriteLine(s); 25
  26. Toán tử ⚫ is int i = 10; if (i is object) { Console.WriteLine("i is an object"); } ⚫ sizeof string s = "A string"; unsafe { Console.WriteLine(sizeof(int)); } 26
  27. An toàn kiểu (Type Safety) ⚫ Bảng chuyển đổi kiểu ngầm định trong C# 27
  28. Boxing and Unboxing ⚫ Boxing là từ dùng để chỉ quá trình chuyển đổi từ một kiểu giá trị sang kiểu tham khảo và tương tự Unboxing thì ngược lại. ⚫ Ví dụ sau đây sử dụng Boxing: using System; class BoxingDemo { public static void Main() { int i = 100; object o = i ; Console.WriteLine(" The object value = {0}" , i); } } 28
  29. Boxing and Unboxing ⚫ Đoạn code sau sử dụng Unboxing , o thuộc kiểu đối tượng object được chuyển thành j kiểu int. int i = 20; object o = i; // Box the int int j = (int)o; // Unbox it back into an int ⚫ Ví dụ sau dùng Boxing và Unboxing long a = 333333423; object b = (object)a; int c = (int)b; 29
  30. Phép toán và biểu thức ⚫ Độ ưu tiên các phép toán Nhân chia trước cộng trừ sau Số học 1 Từ trái sang phải So sánh 2 Not (!) 1 logic 3 And (&&) 2 Or (||) 3 30
  31. Phép toán và biểu thức ⚫ Ví dụ: x = 1+ 1 * 2 * 3 + 4/2 > 3 && 3 3 && 3 < 5 || 10 < 9 true && true || false true ⚫ Các dấu cùng độ ưu tiên thì được thực hiện từ trái sang phải ⚫ Các phép toán nằm trong ngoặc trong cùng được 31 thực hiện trước
  32. Console I/O ⚫ Console.Write() - Viết một giá trị ra của sổ window ⚫ Console.WriteLine() - tương tự trên nhưng sẽ tự động xuống hàng khi kết thúc lệnh ⚫ Console.ReadLine() – đọc một chuỗi từ console ⚫ Ví dụ: string s = Console.ReadLine(); Console.WriteLine(s); int i = 10; int j = 20; 32 Console.WriteLine("{0} plus {1} equals {2}", i, j, i + j);
  33. Console I/O ⚫ Ví dụ: nhập số nguyên và số thực int n; string s = Console.ReadLine(); n = int.Parse(s); double f; s = Console.ReadLine(); f = double.Parse(s); 33
  34. Biểu thức điều kiện if ⚫ Câu lệnh if hoặc if else: Để kiểm tra điều kiện trước khi thực hiện công việc. ⚫ Cú pháp: hoặc if(điều_kiện) if(điều_kiện) { { // thực hiện công việc 1 //thực hiện công việc } } else { //thực hiện công việc 2 } ⚫ Lưu ý: bạn có thể dùng nhiều cặp if – else lồng nhau: 34
  35. Câu lệnh if hoặc if else ⚫ Câu lệnh if hoặc if else: ⚫ Ví dụ Ví dụ 1 if (conn.State != ConnectionState.Open) conn.Open(); Ví dụ 2 int test=2; if (test==0) Console.WriteLine(“Test = 0”); else Console.WriteLine(“Test <>0”); 35 35/152
  36. Câu lệnh switch case ⚫ Câu lệnh switch case: Khi công việc có nhiều lựa chọn và tuỳ vào từng trường hợp để đưa ra công việc phù hợp với điều kiện đưa vào có thể dùng câu lệnh switch case. ⚫ Cú pháp: •Ví dụ: switch (integerA) switch (biểu thức) { { case 1: Console.WriteLine("integerA =1"); casce biểu thức ràng buộc: break; câu lệnh; case 2: Console.WriteLine("integerA =2"); câu lệnh nhảy; break; [default: câu lệnh mặc định] case 3: Console.WriteLine("integerA =3"); } break; default: Console.WriteLine("integerA is not 1,2, or 3"); 36 break; } 36/152
  37. Câu lệnh lặp FOR ⚫ Câu lệnh lặp FOR ⚫ Cú pháp: for(giá trị khởi tạo; điều kiện; biến điều khiển) công việc; ⚫ Ví dụ: string giatri=“”; for (int i = 0; i < 10; i++) giatri += i.ToString(); Console.WriteLine(giatri); 37 37/152
  38. Câu lệnh lặp WHILE ⚫ Câu lệnh lặp WHILE ⚫ Cú pháp: while(điều kiện) công việc; ⚫ Ví dụ: int i = 0; while (i < 5) { Console.WriteLine(i.ToString()); i++; } 38 38/152
  39. Câu lệnh lặp DO - WHILE ⚫ Câu lệnh lặp DO - WHILE ⚫ Cú pháp: do { công việc; } while (điều kiện); ⚫ Ví dụ: int i = 0; do { Console.WriteLine(i.ToString()); i++; } while (i < 3); 39 39/152
  40. Câu lệnh lặp Foreach ⚫ Câu lệnh lặp foreach ⚫ Cú pháp: foreach (type identifier in expression) staterment; ⚫ Ví dụ: foreach (int temp in arrayOfInts) { Console.WriteLine(temp); } 40 40/152
  41. Câu lệnh Break ⚫ Câu lệnh Break ⚫ Ví dụ: int i = 0; do { Console.WriteLine(i.ToString()); i++; if (i == 1) break; } while (i < 3); 41 41/152
  42. Câu lệnh Return ⚫ Câu lệnh Return: Dùng trong các hàm để trả về giá trị của các hàm ⚫ Ví dụ: public int sum(int a, int b) { return a + b; } 42 42/152
  43. Mảng (Array) ⚫ Array là một cấu trúc dữ liệu cấu tạo bởi một số biến được gọi là những phần tử mảng. Tất cả các phần tử này đều thuộc một kiểu dữ liệu. Có thể truy xuất phần tử thông qua chỉ số (index). Chỉ số bắt đầu bằng zero. ⚫ Có nhiều loại mảng (array): mảng một chiều, mảng nhiều chiều. ⚫ Cú pháp : type[ ] array-name; ⚫ Thí dụ: int[] myIntegers; // mảng kiểu số nguyên string[] myString ; // mảng kiểu chuổi chữ 43
  44. Mảng (Array) ⚫ khai báo mảng có chiều dài xác định với từ khoá new như sau: ⚫ // Create a new array of 32 ints int[] myIntegers = new int[32]; integers[0] = 35;// phần tử đầu tiên có giá trị 35 integers[31] = 432;// phần tử 32 có giá trị 432 ⚫ Cũng có thể khai báo như sau: int[] integers; integers = new int[32]; string[] myArray = {"first element", "second element", "third element"}; 44
  45. Mảng (Array) ⚫ Làm việc với mảng (Working with Arrays) ⚫ Chiều dài của mảng : int arrayLength = integers.Length ⚫ Thành phần của mảng là kiểu định nghĩa trước (predefined types), sắp xếp tăng dần dựa vào phương thức static Array.Sort() method: Array.Sort(myArray); ⚫ Đảo ngược mảng đã có nhờ vào static Reverse() method: Array.Reverse(myArray); string[] artists = {"Leonardo", "Monet", "Van Gogh", "Klee"}; Array.Sort(artists); Array.Reverse(artists); foreach (string name in artists) 45 { Console.WriteLine(name); }
  46. Mảng nhiều chiều (Multidimensional Arrays in C#) ⚫ Cú pháp : type[,] array-name; ⚫ Thí dụ: – muốn khai báo một mảng hai chiều gồm hai hàng ba cột với phần tử kiểu nguyên: int[,] myRectArray = new int[2,3]; – Có thể khởi gán mảng int[,] myRectArray = new int[,]{ {1,2},{3,4},{5,6},{7,8}}; mảng 4 hàng 2 cột 46
  47. Mảng jagged ⚫ Jagged là một mảng mà mỗi phần tử là một mảng với kích thước khác nhau. Những mảng con này phải đuợc khai báo từng mảng con một. ⚫ Thí dụ: sau đây khai báo một mảng jagged hai chiều nghĩa là hai cặp [], gồm 3 hàng mỗi hàng là một mảng một chiều: int[][] a = new int[3][]; a[0] = new int[4]; a[1] = new int[3]; a[2] = new int[1]; 47
  48. Enumeration ⚫ Phương án thay thế hằng là enumeration (liệt kê), gồm một tập hợp những hằng đuợc đặt tên. ⚫ Định nghĩa một enumeration như sau : public enum TimeOfDay { Morning = 0, Afternoon = 1, Evening = 2 } 48
  49. Enumeration ⚫ Ví dụ sau sử dụng enumeration: class EnumExample { public enum TimeOfDay { Morning = 0, Afternoon = 1, Evening = 2 } public static int Main() { WriteGreeting(TimeOfDay.Morning); return 0; } 49
  50. Enumeration static void WriteGreeting(TimeOfDay timeOfDay) { switch(timeOfDay) { case TimeOfDay.Morning: Console.WriteLine("Good morning!"); break; case TimeOfDay.Afternoon: Console.WriteLine("Good afternoon!"); break; case TimeOfDay.Evening: Console.WriteLine("Good evening!"); break; default: Console.WriteLine("Hello!"); break; } } 50 }
  51. Namespaces ⚫ Namespace cung cấp cách chúng ta tổ chức quan hệ giữa các lớp và các kiểu khác. ⚫ Namespace là cách mà .NET tránh né việc các tên lớp, tên biến, tên hàm. . đụng độ vì trùng tên giữa các lớp. namespace CustomerPhoneBookApp { using System; public struct Subscriber { // Code for struct here } 51 }
  52. Namespaces ⚫ Ta có thể khai báo nhiều namespace như sau: namespace Wrox { namespace ProCSharp { namespace Basics { class NamespaceExample { // Code for the class here } } } } 52
  53. Namespaces Câu lệnh using ⚫ Từ khoá using giúp giảm thiểu việc phải gõ những namespace trước các hàm hành sự hoặc thuộc tính ⚫ Thí dụ sau sử dụng namespace Wrox.ProCSharp thay vì phải gõ đầy đủ đường dẫn using Wrox.ProCSharp; class Test { public static int Main() { Basics.NamespaceExample NSEx = new Basics.NamespaceExample(); return 0; } } 53
  54. Namespaces Bí danh Namespace ⚫ Một cách sử dụng khác từ khoá using là gán những bí danh cho các lớp và namespace. Nếu có 1 namespace dài lê thê mà muốn quy chiếu nhiều chỗ trên đoạn mã có thể gán một alias cho namespace. ⚫ Cú pháp : using alias = NamespaceName; 54
  55. Namespaces Bí danh Namespace using System; using Introduction = Wrox.ProCSharp.Basics; class Test { public static int Main() { Introduction.NamespaceExample NSEx = new Introduction.NamespaceExample(); Console.WriteLine(NSEx.GetNamespace()); return 0; } } 55
  56. Namespaces Bí danh Namespace namespace Wrox.ProCSharp.Basics { class NamespaceExample { public string GetNamespace() { return this.GetType().Namespace; } } } 56
  57. Phương thức Main() ⚫ Khi một C# console hoặc ứng dụng Windows được biên dịch, theo mặc định trình biên dịch nhìn vào phương thức Main() ⚫ Nếu có nhiều hơn một phương thức Main() , trình biên dịch sẽ trả về thông báo lỗi ⚫ Do đó mỗi chương trình C# phải chứa một hàm main(), được xem là điểm đột nhập vào chương trình 57
  58. Phương thức Main() using System; using System.Collections.Generic; using System.Text; namespace vd1 { class Program { static void Main(string[] args) { int x, y; x = int.Parse(Console.ReadLine()); y = int.Parse(Console.ReadLine()); Console.WriteLine("tong hai so la {0}", x + y); } } 58 }
  59. Khai báo hàm main() nhận thông số (Passing Arguments to Main()) using System; namespace Wrox.ProCSharp.Basics { class ArgsExample { public static int Main(string[] args) { for (int i = 0; i < args.Length; i++) { Console.WriteLine(args[i]); } return 0; } } } 59
  60. Khai báo hàm main() nhận thông số (Passing Arguments to Main()) Chạy chương trình bạn nhớ nhập thêm thông số, Bạn nên chạy bằng công cụ hỗ trợ của .NET kết quả như sau: ArgsExample /a /b /c /a /b /c 60
  61. Sử dụng các ghi chú ⚫ C# sử dụng kiểu chú thích truyền thống của C hàng đơn (// ) và nhiều hàng (/* */). Một chương trình C# cũng có thể chứa những dòng chú giải ⚫ Thí dụ: // This is a single-line comment /* This comment spans multiple lines */ Console.WriteLine(/* Please don't do this! */ "This will compile"); DoSomething(Width, /*Height*/ 100); string s = "/* This is 61 just a normal string */";
  62. Chương 3 C# hướng đối tượng ⚫ Trong chương này sẽ được tiếp xúc một số khái niệm về hướng đối tượng trong C# – Cú pháp kế thừa – Những phương thức nạp chồng – Construction và Destruction – Struct – Nạp chồng toán hạng – Indexers – Giao diện 62
  63. Chương 3 C# hướng đối tượng – Lớp và kế thừa ⚫ Lớp (class) là kiểu mở rộng từ kiểu struct bao gồm các thuộc tính và phương thức. ⚫ Lớp trong C# được định nghĩa với cú pháp: class MyClass { private int someField; public string SomeMethod(bool parameter) { } } 63
  64. Chương 3 C# hướng đối tượng – Lớp và kế thừa ⚫ Các lớp bao gồm nhiều thành viên, mỗi thành viên là thuật ngữ(term) dùng để chỉ đến một dữ liệu hay một chức năng nào đó được định nghĩa trong lớp đó. ⚫ Ví dụ chúng ta dùng thuật ngữ Function để chỉ những thành viên chứa mã như các phương thức(methods), các thuộc tính(properties), constructor, hay các nạp chồng toán hạng(Operator Overloads). 64
  65. Chương 3 C# hướng đối tượng – Lớp và kế thừa ⚫ Ví dụ tạo lớp sinhvien sau: Class Sinhvien { private string ten; private string lop; public string Ten { get { return ten; } set { ten=value;} } public void xuatthongtin() { Console.WriteLine(“Ten sinh vien {0}”, ten); Console.WriteLine(“Hoc lop {0}”, lop); } } 65
  66. Chương 3 C# hướng đối tượng – Lớp và kế thừa ⚫ Tất cả các lớp trong C# là những kiểu tham khảo. Tức là khi khai báo một kiểu lớp thì có một biến lưu trữ tham khảo đến một thể hiện (instance) của lớp đó và sử dụng lệnh new để tạo ra một đối tượng. ⚫ Ví dụ tạo ra đối tượng myObject như sau: MyClass myObject; myObject = new MyClass(); ⚫ Tuy nhiên có thể khai báo và khởi tạo đối tượng cùng một lúc. MyClass myObject = new MyClass(); Ví dụ tạo đối tượng a thuộc lớp Sinhvien Sinhvien a = new Sinhvien(); 66
  67. Chương 3 C# hướng đối tượng- Đơn thừa kế ⚫ C# hỗ trợ đơn thừa kế giữa các lớp. Một lớp có thể thừa hưởng những thuộc tính và phương thức từ một lớp khác. ⚫ Cú pháp: class MyDerivedClass : MyBaseClass { // functions and data members here } ⚫ Trong C# một lớp bắt buột phải thừa kế từ một lớp nào đó. C# hỗ trợ một lớp cơ sở toàn diện gọi là System.Object. 67
  68. Chương 3 C# hướng đối tượng- Đơn thừa kế ⚫ Ví dụ:Xây dựng lớp Sinhvien và lớp Congnhan kế thừa từ lớp Connguoi. class Connguoi { private string ten; private int tuoi; } class Sinhvien: Connguoi { private string lop; } class Congnhan: Connguoi { private string tencongty; } 68
  69. Chương 3 C# hướng đối tượng - Phương thức nạp chồng(Overloading) ⚫ C# hỗ trợ phương thức nạp chồng với một vài dạng phương thức khác nhau về những đặc tính sau: tên, số lượng thông số, và kiểu thông số. ⚫ Nhưng không hỗ trợ những thông số mặc định như C++ và VB. ⚫ Một cách đơn giản là khai báo những phương thức cùng tên nhưng khác số lượng và kiểu của thông số: 69
  70. Chương 3 C# hướng đối tượng - Phương thức nạp chồng(Overloading) class ResultDisplayer { void DisplayResult(string result) { // implementation } void DisplayResult(int result) { // implementation } } 70
  71. Chương 3 C# hướng đối tượng - Phương thức nạp chồng(Overloading) ⚫ C# không hỗ trợ những thông số tuỳ chọn ⚫ C# không chấp nhận hai phương thức chỉ khác nhau về kiểu trả về. ⚫ C# không chấp nhận hai phương thức chỉ khác nhau về đặc tính của một thông số đang được khai báo như ref hay out. 71
  72. Chương 3 C# hướng đối tượng - Phương thức Overriden và Hide ⚫ Bằng cách khai báo virtual trong một hàm ở lớp cơ sở thì cho phép hàm đó được overriden trong bất kỳ một lớp thừa hưởng nào. class MyBaseClass { public virtual string VirtualMethod() { return "This method is virtual and defined in MyBaseClass"; } } 72
  73. Chương 3 C# hướng đối tượng - Phương thức Overriden và Hide class MyDerivedClass : MyBaseClass { public override string VirtualMethod() { return "This method is an override defined in MyDerivedClass"; } } ⚫ Những trường thành viên (member fields) và những hàm tĩnh thì không được khai báo Virtual. 73
  74. Chương 3 C# hướng đối tượng - Phương thức Overriden và Hide ⚫ Nếu một phương thức có cùng đặc tính trong cả hai khai báo ở lớp cơ sở và lớp thừa hưởng nhưng các phương thức này không khai báo virtual hay overriden thì sẽ được gọi là: "lớp thừa hưởng hide lớp cơ sở đó". ⚫ Kết quả là: phương thức nào được gọi phụ thuộc vào kiểu của biến được sử dụng để tham khảo đến thể hiện, chứ không phải kiểu của chính thể hiện đó. ⚫ Nếu tạo ra hai phương thức hoàn toàn giống nhau ở cả lớp thừa hưởng và lớp cơ sở mà không có khai báo virtual và override thì sẽ bị cảnh báo trong khi biên dịch. Trong C#, nên sử dụng từ khoá new để đảm bảo bạn muốn hide phương thức đó. 74
  75. Chương 3 C# hướng đối tượng - Phương thức Overriden và Hide ⚫ Trong C# có một cú pháp đặc biệt để gọi những phiên bản cơ sở của một phương thức từ một lớp thừa hưởng. Cú pháp : base. () ⚫ Ví dụ: class CustomerAccount { public virtual decimal CalculatePrice() { // implementation } } class GoldAccount : CustomerAccount { public override decimal CalculatePrice() { return base.CalculatePrice() * 0.9; } 75
  76. Chương 3 C# hướng đối tượng - lớp và hàm Abstract ⚫ C# cho phép cả lớp và phương thức có thể khai báo abstract. ⚫ Một lớp abstract không được thể hiện và một phương thức abstract không được thực thi mà phải được overriden trong bất kỳ lớp thừa hưởng không abstract nào. ⚫ Một phương thức abstract sẽ tự động được khai báo virtual. Nếu một lớp có phương thức abstract thì nó cũng là lớp abstract và được khai báo như sau: abstract class Building { public abstract decimal CalculateHeatingCost(); // abstract method } 76
  77. Chương 3 C# hướng đối tượng - Sealed các lớp và phương thức ⚫ C# cho phép các lớp và phương thức được khai báo sealed. Nếu là lớp có nghĩa là không được quyền thừa kế lớp đó, nếu là phương thức tức là không được phép override nó. ⚫ C# sử dụng từ khoá sealed trước tên lớp và phương thức: sealed class FinalClass { // etc } class DerivedClass : FinalClass // wrong. Will give compilation error { // etc } 77
  78. Chương 3 C# hướng đối tượng - Sealed các lớp và phương thức class MyClass { public sealed override void FinalMethod() { // etc. } } class DerivedClass : MyClass { public override void FinalMethod() // wrong. Will give compilation error { } } 78
  79. Chương 3 C# hướng đối tượng – Những Bổ Từ Truy cập ⚫ Trong C# cung cấp các bổ từ để cho biết sự tồn tại của một thành viên một lớp. Có 5 bổ ngữ như sau: Accessibility Mô tả public Biến và phương thức có thể được truy cập từ bất kỳ nơi đâu. Internal Biến và phương thức chỉ có thể được truy cập trong cùng một gói Protected Biến hay phương thức chỉ có thể được truy cập từ kiểu của nó hay từ những kiểu kế thừa kiểu đó. Protected internal Biến hay phương thức chỉ có thể được truy cập từ gói hiện tại, hay từ những kiểu kế thừa hiện tại. private Biến hay phương thức chỉ có thể truy cập từ trong kiểu của nó 79
  80. Chương 3 C# hướng đối tượng – Thuộc Tính ⚫ Để định nghĩa thuộc tính trong C# dùng cú pháp sau: public string SomeProperty { get { return "This is the property value"; } set { // do whatever needs to be done to set the property } } 80
  81. Chương 3 C# hướng đối tượng – Thuộc Tính ⚫ Thủ tục get không có tham số và phải trả về cùng kiểu với thuộc tính đã được khai báo. ⚫ Không nên khai báo tường minh các tham số trong thủ tục set, mà trình biên dịch sẽ tự động biết là có một tham số cùng kiểu trỏ đến giá trị. ⚫ Ví dụ: private string foreName; public string ForeName { get { return foreName; } set { if (value.Length > 20) // code here to take error recovery action // (eg. throw an exception) else foreName = value; } 81 }
  82. Chương 3 C# hướng đối tượng – Thuộc Tính ⚫ Thuộc tính chỉ đọc và chỉ viết: ⚫ Có thể tạo ra thuộc tính chỉ đọc bằng cách bỏ thủ tục set trong khai báo và tạo ra thuộc tính chỉ ghi bằng cách bỏ thủ tục get trong khai bao thuộc tính đó. ⚫ Ví dụ để định nghĩa thuộc tính Forename là chỉ đọc: private string foreName; public string ForeName { get { return foreName; } } 82
  83. Chương 3 C# hướng đối tượng – Thuộc Tính ⚫ Bổ từ truy cập: ⚫ C# không cho phép cài đặt những bổ từ khác nhau cho thủ tục set và get. Nếu muốn tạo ra một thuộc tính có public để đọc nhưng lại muốn hạn chế protected trong gán thì đầu tiên phải tạo thuộc tính chỉ đọc với bổ từ public sau đó tạo một hàm set() với bổ từ protected ở bên ngoài thuộc tính đó. public string ForeName { get { return foreName; } } protected void SetForeName(string value) { if (value.Length > 20) // code here to take error recovery action // (eg. throw an exception) else foreName = value; else foreName = value; } 83
  84. Chương 3 C# hướng đối tượng – Thuộc Tính ⚫ Thuộc tính Virtual và Abstract: ⚫ C# cho phép tạo một thuộc tính virtual hay abstract. Để khai báo một thuộc tính virtual, overriden hay abstract bạn chỉ cần thêm từ khoá đó trong lúc định nghĩa thuộc tính. ⚫ Ví dụ để tạo một thuộc tính abstract thì cú pháp như sau: public abstract string ForeName { get; set; } 84
  85. Chương 3 C# hướng đối tượng – Giao Diện ⚫ Việc khai báo một giao diện làm việc giống như việc khai báo một lớp Abstract, nhưng nó không cho phép thực thi bất kỳ một thành phần nào của giao diện. ⚫ Một giao diện chỉ có thể chứa những khai báo của phương thức, thuộc tính, bộ phận lập mục lục, và sự kiện. ⚫ Không thể khởi tạo một giao diện thực sự mà nó chỉ chứa những thành phần bên trong nó, không có Constructor hay các trường, không cho phép chứa các phương thức nạp chồng. ⚫ Nó cũng không cho phép khai báo những bổ từ trên các thành phần trong khi định nghĩa một giao diện. Các thành phần bên trong một giao diện luôn luôn là public và 85 không thể khai báo virtual hay static
  86. Chương 3 C# hướng đối tượng – Giao Diện ⚫ Ví dụ định nghĩa một giao diện sau: public interface IBankAccount { void PayIn(decimal amount); bool Withdraw(decimal amount); decimal Balance { get; } } 86
  87. Chương 3 C# hướng đối tượng – Giao Diện ⚫ Xây dựng các lớp thực thi giao diện public class SaverAccount : IBankAccount { private decimal balance; public void PayIn(decimal amount) { balance += amount; } public bool Withdraw(decimal amount) { if (balance >= amount) { balance -= amount; return true; } Console.WriteLine("Withdrawal attempt failed."); return false; } 87
  88. Chương 3 C# hướng đối tượng – Giao Diện public decimal Balance { get { return balance; } } public override string ToString() { return String.Format("Venus Bank Saver: Balance = {0,6:C}", balance); } } ⚫ Thực tế có thể khai báo một lớp thừa kế từ một lớp khác và nhiều giao diện cú pháp như sau: public class MyDerivedClass : MyBaseClass, IInterface1, IInterface2 88
  89. Chương 3 C# hướng đối tượng – Giao Diện ⚫ Thừa kế từ IBankAccount có nghĩa là SaverAccount lấy tất cả các thành phần của IBankAccount nhưng nó không thể sử dụng các phương thức đó nếu không định nghĩa lại các hành động của từng phương thức. Nếu bỏ quên một phương thức nào thì trình biên dịch sẽ báo lỗi. Các lớp khác nhau có thể thực thi cùng một giao diện. ⚫ Phương thức main() class MainEntryPoint { static void Main() { IBankAccount venusAccount = new SaverAccount(); venusAccount.PayIn(200); venusAccount.Withdraw(100); Console.WriteLine(venusAccount.ToString()); } 89 }
  90. Chương 3 C# hướng đối tượng – Giao Diện ⚫ Một giao diện có thể tham khảo đến bất kỳ lớp nào thực thi giao diện đó. ⚫ Ví dụ ta có một mảng kiểu một giao diện nào đó thì các phần tử của mảng có thể tham khảo đến bất kỳ lớp nào thực thi giao diện đó: IBankAccount[] accounts = new IBankAccount[2]; accounts[0] = new SaverAccount(); accounts[1] = new GoldAccount(); 90
  91. Chương 3 C# hướng đối tượng – Giao Diện ⚫ Thừa kế giao diện: ⚫ C# cho phép những giao diện có thể thừa kế các giao diện khác. Khi một giao diện thừa kế một giao diện khác thì nó có thể thi hành tất cả các phương thức định nghĩa trong giao diện đó và những phương thức của nó định nghĩa. ⚫ Ví dụ tao tạo ra một giao diện mới thừa kế giao diện IBanKAccount : public interface ITransferBankAccount : IBankAccount { bool TransferTo(IBankAccount destination, decimal amount); } 91
  92. Chương 3 C# hướng đối tượng – Giao Diện ⚫ Ví dụ: public class CurrentAccount : ITransferBankAccount { private decimal balance; public void PayIn(decimal amount) { } public bool Withdraw(decimal amount) { } public decimal Balance { } public bool TransferTo(IBankAccount destination, decimal amount) { bool result; if ((result = Withdraw(amount)) == true) destination.PayIn(amount); return result; } public override string ToString() { } 92 }
  93. Chương 3 C# hướng đối tượng - Construction and Disposal ⚫ Constructor ⚫ Cú pháp khai báo một Constructor là khai báo một phương thức mà cùng tên với lớp và không có kiểu trả về. public class MyClass { public MyClass() { } // rest of class definition 93
  94. Chương 3 C# hướng đối tượng - Construction and Disposal ⚫ Các contructor theo cùng luật overloading như các phương thức khác. Cũng có thể tạo nhiều constructor cùng tên và khác tham số (giống phương thức nạp chồng) public MyClass() // zero-parameter constructor { // construction code } public MyClass(int number) // another overload { // construction code } ⚫ Chú ý : khi đã định nghĩa một constructor trong lớp thì trình biên dịch sẽ không tự động tạo ra constructor mặc định 94
  95. Chương 3 C# hướng đối tượng - Construction and Disposal Gọi các constructor trong các constructor khác: class Car { private string description; private uint nWheels; public Car(string model, uint nWheels) { this.description = model; this.nWheels = nWheels; } public Car(string model) { this.description = mode; this.nWheels = 4; } 95
  96. Chương 3 C# hướng đối tượng - Construction and Disposal class Car { private string description; private uint nWheels; public Car(string model, uint nWheels) { this.description = description; this.nWheels = nWheels; } public Car(string model) : this(model, 4) { } 96
  97. Chương 3 C# hướng đối tượng - Construction and Disposal ⚫ Constructor của các lớp thừa hưởng ⚫ Khi tạo ra một thể hiện của một lớp thừa hưởng thì không phải chỉ những constructor của lớp thừa hưởng đó được thực hiện mà cả những constructor của lớp cơ sở cũng được gọi. Và các constructor của lớp cơ sở sẽ được thực hiện trước khi các constructor của lớp thừa hưởng. ⚫ ví dụ xét: abstract class GenericCustomer { private string name; // lots of other methods etc. } class Nevermore60Customer : GenericCustomer { private uint highCostMinutesUsed; // other methods etc. } 97
  98. Chương 3 C# hướng đối tượng - Construction and Disposal ⚫ Destructors và phương thức Dispose() ⚫ C# cũng hỗ trợ Destructor, nhưng không được dùng thường xuyên như trong C++ và cách chúng hoạt động rất khác nhau. Bởi vì các đối tượng trong .NET và C# thì bị xoá bởi bộ thu gom rác (garbage collection). Trong C#, destruction làm việc theo hai giai đoạn: – 1. Lớp sẽ thực thi giao diện System.IDisposable, tức là thực thi phương thức IDisposable.Dispose(). Phương thức này được gọi tường minh khi trong đoạn mã một đối tượng không cần nữa. – 2. Một Destructor có thể được định nghĩa và nó được tự động gọi khi đối tượng bị thu gom rác. Destructor chỉ đóng vai trò như một máy rà soát lại trong một số trường hợp xấu client không gọi phương thức Dispose(). 98
  99. Chương 3 C# hướng đối tượng - Construction and Disposal ⚫ Cú pháp để định nghĩa Destructor và Dispose(): class MyClass : IDisposable { public void Dispose() { // implementation } ~MyClass() // destructor. Only implement if MyClass directly holds unmanaged resources. { // implementation } // etc. 99
  100. Chương 3 C# hướng đối tượng - Construction and Disposal ⚫ Thực thi phương thức Dispose() và một Destructor: ⚫ Destrutor được gọi khi một đối tượng bị huỹ. Có một vài điểm ta phải nhớ như sau: – Không thể biết trước khi nào một thể hiện bị huỹ, tức là ta không biết trước khi nào một Destructor được gọi. – Có thể tác động đến bộ thu gom rác để chạy tại một thời điểm trong đoạn mã bằng cách gọi phương thức System.GC.Collect(). – Có lời khuyên là không nên thực thi một Destructor nếu như lớp không thực sự cần đến nó. ⚫ Chú ý : Không có bất kỳ một tham số nào trong một Destructor, không kiểu trả về và không có bổ từ. Không cần thiết phải gọi tường minh một Destructor của lớp cơ sở mà trình biên dịch sẽ tự động sắp xếp tất cả Destructor được định nghĩa trong các lớp thừa kế đều được gọi. 100
  101. Chương 3 C# hướng đối tượng - Struct ⚫ Cú pháp định nghĩa Struct struct { } – Struct là một kiểu giá trị, không phải là kiểu tham khảo. – Struct không hổ trợ thừa kế. – Có vài sự khác nhau trong cách làm việc của các constructor đối với struct. Trình biên dịch luôn luôn cung cấp một constructor không tham số mặc định, và không được cho phép thay thế. – Với một struct, bạn có thể chỉ rỏ cách mà các trường được đặt ngoài bộ nhớ. 101
  102. Chương 3 C# hướng đối tượng - Struct ⚫ Sử dụng Struct – Ví dụ: struct Dimensions { public double Length; public double Width; } ⚫ Mặc dù struct là kiểu giá trị nhưng cú pháp để sử dụng nó giống như sử dụng lớp. Ví dụ như khai báo như trên thì có thể viết như sau: Dimensions point = new Dimensions(); point.Length = 3; point.Width = 6; 102
  103. Chương 3 C# hướng đối tượng - Struct ⚫ Cũng có thể viết: Dimensions point; point.Length = 3; point.Width = 6; ⚫ Trong struct mọi thứ đều phải được khởi tạo trước khi sử dụng. ⚫ Một struct được xem như được khởi tạo đầy đủ khi thao tác new được gọi hay khi tất cả các trường đều được gán giá trị. ⚫ Một struct được định nghĩa là một trường thành viên của một lớp thì nó sẽ được tự động khởi tạo khi đối tượng khởi tạo. 103
  104. Chương 4 Xử Lý Biệt Lệ Trong C# ⚫ Lỗi và xử lý biệt lệ: – Trong C#, một biệt lệ là một đối tượng được tạo ra (hoặc được ném) khi một trạng thái lỗi biệt lệ cụ thể xuất hiện. những đối tượng này chứa đựng những thông tin mà giúp ích cho việc truy ngược lại vấn đề. – .NET cũng cung cấp cho chúng ta nhiều lớp biệt lệ được định nghĩa trước. 104
  105. Chương 4 Xử Lý Biệt Lệ Trong C# ⚫ Những lớp biệt lệ cơ bản 105
  106. Chương 4 Xử Lý Biệt Lệ Trong C# ⚫ Những lớp biệt lệ cơ bản ⚫ Có 2 lớp quan trọng trong hệ thống các lớp được dẫn xuất từ System.Exception: – System.SystemException - sử dụng cho những biệt lệ thường xuyên được sinh ra trong thời gian chạy của .NET – System.ApplicationException - đây là một lớp quan trọng, bởi vì nó được dùng cho bất kì lớp biệt lệ được định nghĩa bởi những hãng thứ ba 106
  107. Chương 4 Xử Lý Biệt Lệ Trong C# ⚫ Đón bắt ngoại lệ: – Để giải quyết vấn đề này trong C# chia chương trình thành 3 khối khối lệnh ⚫ Khối try: chứa đựng đoạn mã là một phần thao tác bình thường 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 nghiêm trọng. ⚫ Khối catch: chứa đựng đoạn mã giải quyết những trạng thái lỗi nghiêm trọng trong đoạn try ⚫ Khối finally: chứa đựng đoạn mã dọn dẹp tài nguyên hoặc làm bất kì hành động nào thường muốn làm xong vào cuối khối try hay catch 107
  108. Chương 4 Xử Lý Biệt Lệ Trong C# ⚫ Đón bắt ngoại lệ: – Cú pháp C# được sử dụng để thể hiện tất cả điều này như sau: try { // mã cho việc thực thi bình thường } catch { // xử lí lỗi } finally { // dọn dẹp } 108
  109. Chương 4 Xử Lý Biệt Lệ Trong C# ⚫ Có một vài điều có thể thay đổi trong cú pháp trên. – Có thể bỏ qua khối finally. – Có thể cung cấp nhiếu khối catch mà ta muốn xử lí những kiểu lỗi khác nhau. – Có thể bỏ qua khối catch, trong trường hợp cú pháp phục vụ không xác định biệt lệ, nhưng phải đảm bảo rằng mã trong khối finally sẽ được thực thi khi việc thực thi rời khỏi khối try . ⚫ Để chuyển một lỗi trong khối try sang khối catch xử lý nếu lỗi đó xuất hiện thì dùng câu lệnh throw – Ví dụ: throw new OverflowException(); 109
  110. Chương 4 Xử Lý Biệt Lệ Trong C# try {// mã cho thực thi bình thường if (Overflow == true) throw new OverflowException(); // xử lý nhiều hơn if (OutOfBounds == true) throw new IndexOutOfRangeException(); // hoặc tiếp tục xử lí bình thường } catch (OverflowException e) { // xử lí lỗi cho trạng thái lỗi tràn } catch (IndexOutOfRangeException e) { // xử lí lỗi cho trạng thái lỗi chỉ mục nằm ngoài vùng } finally { // dọn dẹp 110 }
  111. Chương 4 Xử Lý Biệt Lệ Trong C# ⚫ Ví dụ: using System; using System.Collections.Generic; using System.Text; namespace chia { class Program { static void Main(string[] args) { 111
  112. Chương 4 Xử Lý Biệt Lệ Trong C# try { int a, b; float c; string x, y; Console.WriteLine("nhap vao a:"); x= Console.ReadLine(); Console.WriteLine("nhap vao b:"); y=Console.ReadLine(); a = int.Parse(x); b = int.Parse(y); c = (float)a / b; string s = c.ToString(); Console.WriteLine("ket qua nhan duoc {0}",s); } 112
  113. Chương 4 Xử Lý Biệt Lệ Trong C# catch (Exception ex) { Console.WriteLine("loi {0}", ex.Message); } } } } 113
  114. Chương 5 Windows Applications ⚫ Ứng dụng Windows applications ⚫ Chạy trên môi trường Windows ⚫ Có giao diện lập trình đồ hoạ ⚫ Có các thành phần lập trình trực quan 114
  115. Chương 5 Windows Application ⚫ Tạo một Project ⚫ Chọn File ->New -> Project ⚫ Chọn Visual C# -> Chọn Windows Application ⚫ Chọn Location ⚫ Gõ tên Project ⚫ Chú ý: Ngầm định tự động tạo ra thư mục chứa Project 115
  116. Chương 5 Windows Applications 116
  117. Chương 5 Windows Applications ⚫ Các thành phần ⚫ Form – Là thành phần của giao diện đồ hoạ – Chứa các điều khiển lập trình sử dụng lại (Reused) ⚫ Tabs – Một tài liệu được mở trong một tab – Dùng để tiết kiệm không gian khi lập trình ⚫ Menu – Chứa các lệnh dùng để xây dựng và thực hiện chương trình ⚫ ToolBar 117 – Chứa các biểu tượng dùng để thực hiện các lệnh
  118. Chương 5 Windows Applications ⚫ Cửa sổ Solution Explorer – Hiển thị các Project trong Solution ⚫ Project đậm được chạy đầu tiên – Hiển thị tất cả các tệp trong Project – Thanh công cụ ⚫ Show All files: Hiển thị các tệp ⚫ Refresh: Đọc lại các tệp ⚫ View Code: Hiển thị mã lệnh ⚫ View Design: Hiển thị thiết kế ⚫ Class Diagram: Hiển thị lược đồ lớp 118
  119. Chương 5 Windows Applications ⚫ Cửa sổ Toolbox – Chứa các điều kiển lập trình trực quan – Nhóm theo các chức năng 119
  120. Chương 5 Windows Applications ⚫ Cửa sổ Properties – Hiển thị các thuộc tính và sự kiện của đối tượng được chọn ⚫ Cột trái là thuộc tính hoặc sự kiện ⚫ Cột phải là giá trị – Thanh công cụ ⚫ Alphabetic: Sắp xếp vần abc ⚫ Properties: Thuộc tính của đối tượng ⚫ Events: Sự kiện của đối tượng – Description 120 ⚫ Mô tả thuộc tính hoặc sự kiện
  121. Chương 5 Windows Applications ⚫ Một số thao tác cơ bản – Hiển thị cửa sổ Solution Explorer ⚫ Chọn biểu tượng Solution Explorer – Hiển thị cửa sổ Properties ⚫ Chọn biểu tượng Properties – Hiển thị cửa sổ ToolBox ⚫ Chọn biểu tượng ToolBox 121
  122. Chương 5 Windows Applications ⚫ Một số thao tác cơ bản – Dịch Project ⚫ Ấn F6 hoặcchọn menu Build -> Build Solution – Chạy Project ⚫ Ấn F5 hoặc chọn menu Debug -> Start Debugging ⚫ Chú ý: – Khi chạy Project máy tự động ghi các thay đổi – Trong một Project có nhiều Form, để chạy Form nào cần vào cửa sổ Solution Explorer và chọn program.cs để khai báo lại Form cần chạy. – Project chỉ chạy được khi mọi Form đã hết lỗi cú pháp. 122
  123. Chương 5 Windows Applications ⚫ Một số điều kiển cơ bản – Form: Đối tượng cửa sổ của chương trình chứa các đối tượng khác. – Label: Đối tượng dùng để hiển thị văn bản và hình ảnh (người dùng không sửa được). – TextBox: Đối tượng dùng để hiển thị và nhập dữ liệu từ bàn phím. – Button: Là nút ấn cho phép Click nó để thực hiện một chức năng 123
  124. Chương 5 Windows Applications ⚫ Một số điều kiển cơ bản – CheckBox: Đối tượng cho phép chọn hoặc không chọn. – ListBox: Đối tượng cho phép xem và chọn dữ liệu từ các dòng. – ComboBox: Đối tượng cho phép chọn dữ liệu từ các dòng. – GroupBox: Đối tượng chứa các đối tượng khác. – Panel: Đối tượng chứa các đối tượng khác. 124
  125. Chương 5 Windows Applications - Form ⚫ Form – Dùng để tạo giao diện cho chương trình – Thêm một Form mới ⚫ Chọn Project -> Add Windows Form ⚫ Chọn Windows Form -> gõ tên Form -> Add – Các kiểu Form ⚫ Dialog ⚫ Window 125
  126. Chương 5 Windows Applications - Form ⚫ Các điều khiển của Form – Là các thành phần đồ hoạ như Label, TextBox, 126
  127. Chương 5 Windows Applications - Form ⚫ Các điều khiển của Form – Mỗi điều khiển tạo ra các đối tượng cùng lớp – Các đối tượng có các thuộc tính, các sự kiện và các phương thức riêng ⚫ Properties: Các thuộc tính mô tả đối tượng ⚫ Methods: Các phương thức thực hiện các chức năng của đối tượng ⚫ Events: Các sự kiện sinh ra bởi sự chuyển động của bàn phím và con chuột, chi tiết do người lập trình viết. 127
  128. Chương 5 Windows Applications - Form ⚫ Các thuộc tính thường dùng – AcceptButton: Nút được click khi ấn phím Enter – CancelButton: Nút được click khi ấn phím Esc – BackgroundImage: Ảnh nền của Form – Font: Font hiển thị của Form và Font ngầm định của các đối tượng của Form. – FormBorderStyle: Kiểu đường viền của Form ⚫ None: Form không có đường viền ⚫ Fix : Cố định kích thước khi chạy Form ⚫ Sizeable: Có thể thay đổi kích thước Form 128
  129. Chương 5 Windows Applications - Form ⚫ Các thuộc tính thường dùng – ForeColor: Màu chữ của Form và màu chữ của các đối tượng của Form. – Text: Dòng văn bản hiển thị trên tiêu đề Form – MaximizeBox: Có/không nút phóng to – MinimizeBox: Có/không nút thu nhỏ – StartPosition: Ví trí bắt đầu khi chạy Form ⚫ CenterScreen: Nằm giữa màn hình – WindowState: Xác định trạng thái ban đầu Form 129
  130. Chương 5 Windows Applications - Form ⚫ Các phương thức thường dùng – Close: Đóng Form và giải phóng các tài nguyên. Một Form đã đóng không thể mở lại. – Hide: Ẩn Form và không giải phóng tài nguyên của Form. – Show: Hiển thị một Form đã ẩn. ⚫ Các sự kiện thường dùng – Load: Xẩy ra khi chạy Form (ngầm định khi nháy đúp chuột trong chế độ thiết kế). 130 – FormClosing: Xảy ra khi đóng Form.
  131. Chương 5 Windows Applications - Label ⚫ Đối tượng hiển thị văn bản kết hợp hình ảnh ⚫ Không sửa được văn bản hiển thị ⚫ Các thuộc tính thường dùng – AutoSize: Tự thay đổi kích thước của đối tượng – Fonts: Font chữ của đối tượng Label – ForeColor: Màu chữ của đối tượng – Image: Ảnh của đối tượng – Text: Văn bản xuất hiện trên đối tượng. – TextAlign: Lề của văn bản. 131
  132. Chương 5 Windows Applications - Textbox ⚫ Đối tượng dùng để nhập dữ liệu từ bàn phím ⚫ Các thuộc tính thường dùng – Enabled: Có/không cho phép thao tác đối tượng – Multiline: Có/không cho phép nhập dữ liệu nhiều dòng (ngầm định là không) – PasswordChar: Nhập ký tự làm mật khẩu – ReadOnly: Có/không cho phép sửa dữ liệu của đối tượng (ngầm định là có) – Text: Văn bản nhập (hiển thị) của đối tượng. 132
  133. Chương 5 Windows Applications - TextBox ⚫ Các sự kiện thường dùng – TextChanged: Xảy ra khi nhập hoặc xoá các ký tự (ngầm định khi nháy đúp chuột trong chế độ thiết kế) – KeyDown: Xảy ra khi ấn một phím bất kỳ trên đối tượng. – KeyUp: Xảy ra khi thả một phím ấn trên đối tượng. ⚫ Chú ý: Dữ liệu nhập vào TextBox là văn bản do đó nếu thực hiện các phép toán số học, logic thì cần chuyển sang kiểu số. 133
  134. Chương 5 Windows Applications - Button ⚫ Đối tượng nút ấn cho phép thực hiện một chức năng ⚫ Có thể hiển thị hình ảnh kết hợp với văn bản ⚫ Các thuộc tính thường dùng – Text: Văn bản hiển thị trên đối tượng – Image: Hình ảnh hiển thị trên đối tượng ⚫ Các sự kiện thường dùng – Click: Xảy ra khi nhấn con trỏ chuột hoặc gõ Enter trên đối tượng (ngầm định khi nháy đúp chuột trong chế độ thiết kế). 134
  135. Chương 5 Windows Applications - Button ⚫ Ví dụ: Form dùng để giải phương trình bậc nhất ⚫ Chuyển dữ liệu từ xâu ký tự sang số – Chuyển không kiểm tra dữ liệu double a = Convert.ToDouble(“123.45”); – Chuyển có kiểm tra dữ liệu bool IsNumber = double.TryParse(str, out num) 135
  136. Chương 5 Windows Applications - Button ⚫ Giải phương trình bậc nhất private void button1_Click(object sender, EventArgs e) { double a, b; bool IsNumber; //Khai bao bien IsNumber = double.TryParse(textBox1.Text, out a); //Chuyen tu xau sang so if (!IsNumber) //Kiem tra xem chuyen duoc khong ? { MessageBox.Show("Nhậphệ số a không hợplệ !", "Thông báo “, MessageBoxButtons.OK, MessageBoxIcon.Information); textBox1.Clear(); //xoa trang textBox1 textBox1.Focus(); //chuyen con tro ve textBox1 return; 136 }
  137. Chương 5 Windows Applications - Button IsNumber = double.TryParse(textBox2.Text, out b); //chuyển từ xâu sang số if (!IsNumber) //kiểm tra xem có chuyển được hay không? { MessageBox.Show("Nhập hệ số b không hợp lệ !", "Thông báo “,MessageBoxButtons.OK, MessageBoxIcon.Information); textBox2.Clear(); //xoa trang textBox1 textBox2.Focus(); //chuyen con tro ve textBox2 return; //thoat khoi su kien } 137
  138. Chương 5 Windows Applications - Button if (a == 0) { if (b == 0) { textBox3.Text ="Phương trình vô số nghiệm !"; } else { textBox3.Text = "Phương trình vô nghiệm !“; } } else { textBox3.Text = Convert.ToString(-b / a); } } 138
  139. Chương 5 Windows Applications – Những Thuộc Tính Chung ⚫ Các thuộc tính thường dùng – BackColor: Màu nền của đối tượng. – BackgroundImage: Ảnh nền của đối tượng – Cursor: Kiểu con trỏ chuột khi đưa con trỏ chuột vào đối tượng – Enabled: Có/không cho phép thao tác với đối tượng – Font: Font chữ của đối tượng – ForeColor: Màu chữ của đối tượng 139
  140. Chương 5 Windows Applications – Những Thuộc Tính Chung ⚫ Các thuộc tính thường dùng – TabIndex: Thứ tự ấn phím Tab để chuyển con trỏ đến đối tượng ⚫ Chọn biểu tượng Tab Order trên thanh công cụ và nháy chuột theo thứ tự để đặt lại TabIndex – Text: Dòng văn bản hiển thị trên đối tượng – TextAlign: Lề của dòng văn bản hiển thị trên đối tượng – Visible: Ần/hiện đối tượng – Anchor: Neo đối tượng so với các cạnh của đối 140 tượng chứa
  141. Chương 5 Windows Applications – Những Thuộc Tính Chung ⚫ Các thuộc tính thường dùng – Dock: Cố định đối tượng trong đối tượng chứa – Location: Ví trí của đối tượng so với đối tượng chứa ⚫ Các phương thức thường dùng – Focus: Chuyển con trỏ đến đối tượng – Hide: Ẩn đối tượng – Show: Hiển thị đối tượng ẩn 141
  142. Chương 5 Windows Applications – Những Thuộc Tính Chung ⚫ Các sự kiện thường dùng – KeyDown: Xảy ra khi một phím được ấn trên đối tượng. – KeyUp: Xẩy ra khi một phím được thả trên đối tượng – KeyEventArg: Tham số cho sự kiện KeyDown và KeyUp. – KeyPress: Xảy ra khi ấn và thả một phím trên đối tượng. – KeyPressEventArg: Tham số cho sự kiện 142 KeyPress
  143. Chương 5 Windows Applications – Những Thuộc Tính Chung ⚫ Các sự kiện thường dùng – MouseEnter: Xảy ra khi đưa con trỏ chuột vào vùng của đối tượng. – MouseLeave: Xảy ra khi đưa con trỏ chuột ra khỏi vùng của đối tượng. – MouseDown: Xảy ra khi ấn nút chuột trong khi con trỏ chuột đang nằm trong vùng của đối tượng. – MouseUp: Xảy ra khi thả nút chuột trong khi con trỏ chuột đang nằm trong vùng của đối tượng. – MouseMove: Xảy ra khi di chuyển con trỏ chuột trong 143 vùng của đối tượng.
  144. Chương 5 Windows Applications - GroupBox ⚫ Đối tượng dùng để chứa các đối tượng khác ⚫ Mỗi đối tượng có tiêu đề ⚫ Thuộc tính thường dùng – Text: Văn bản hiển thị trên tiêu đề GroupBox 144
  145. Chương 5 Windows Applications - Panel ⚫ Đối tượng dùng để chứa các đối tượng khác ⚫ Mỗi đối tượng không tiêu đề ⚫ Thuộc tính thường dùng – BorderStyle: Đường viền của đối tượng (ngầm định là None) 145
  146. Chương 5 Windows Applications - CheckBox ⚫ Đối tượng cho phép chọn/không chọn giá trị ⚫ Cho phép chọn đồng thời nhiều đối tượng ⚫ Các thuộc tính thường dùng – Checked: Có/không đối tượng được chọn – Text: Văn bản hiển thị trên đối tượng ⚫ Các sự kiện thường dùng – CheckedChanged: Xảy ra khi chọn/không chọn đối tượng (ngầm định khi nháy đúp chuột trong chế độ thiết kế) 146
  147. Chương 5 Windows Applications - CheckBox ⚫ Ví dụ – Xây dựng Form hiển thị kiểu chữ của một đối tượng Label 147
  148. Chương 5 Windows Applications - CheckBox //toan tu ^ la toan tu XOR private void checkBox1_CheckedChanged(object sender, EventArgs e) { label1.Font = new Font(label1.Font.Name,label1.Font.Size, label1.Font.Style ^ FontStyle.Bold); } private void checkBox2_CheckedChanged(object sender, EventArgs e) { label1.Font = new Font(label1.Font.Name,label1.Font.Size, label1.Font.Style ^ FontStyle.Italic); } 148
  149. Chương 5 Windows Applications - RadioButton ⚫ Đối tượng cho phép chọn/không chọn giá trị ⚫ Cho phép chọn một đối tượng ở một thời điểm – Để chọn nhiều đối tượng phải đặt các điều khiển trong GroupBox hoặc Panel 149
  150. Chương 5 Windows Applications - RadioButton ⚫ Các thuộc tính thường dùng – Checked: Có/không đối tượng được chọn – Text: Văn bản hiển thị trên đối tượng ⚫ Các sự kiện thường dùng – Click: Xẩy ra khi đối tượng được click. – CheckedChanged: Xảy ra khi chọn/không chọn đối tượng (ngầm định khi nháy đúp chuột trong chế độ thiét kế) 150
  151. Chương 5 Windows Applications - PictureBox ⚫ Đối tượng dùng để hiển thị hình ảnh (Bitmap, GIF, JPEG, Metafile, Icon) ⚫ Các thuộc tính thường dùng – Image: Ảnh hiển thị trong PictureBox. – SizeMode: Chế độ hiển thị ảnh ⚫ Normal:Đặt ảnh ở góc trên bên trái của đối tượng ⚫ CenterImage: Đặt ảnh ở giữa đối tượng ⚫ StretchImage: Thay đổi kích thước ảnh đúng với kích thước đối tượng in PictureBox. ⚫ AutoSize: Thay đổi kích thước đối tượng ⚫ PictureBox đúng với kích thước ảnh. 151
  152. Chương 5 Windows Form- ListBox ⚫ Cho phép xem và chọn các dòng dữ liệu 152
  153. Chương Windows Form- ListBox ⚫ Các phương thức thường dùng – GetSelected(index): Trả về True dòng Index được chọn, ngược lại trả về false. – Add: Thêm một dòng vào ListBox ⚫ listBox1.Items.Add(“Cat”); ⚫ listtBox1.Items.Add(“Mouse”); – RemoveAt(row): Xoá dòng ở vị trí row ⚫ listBox1.Items.RemoveAt(row); – Clear: Xoá tất cả các dòng ⚫ listBox1.Items.Clear(); 153
  154. Chương 5 Windows Form- ListBox ⚫ Các thuộc tính thường dùng – Items: Mảng các dòng trong ListBox. ⚫ Items[0] = “Cat” ⚫ Items[1] = “Mouse” – MultiColumn: Có/không chia ListBox thành nhiều cột. 154
  155. Chương 5 Windows Form- ListBox ⚫ Các thuộc tính thường dùng – SelectedIndex: Trả về dòng hiện thời được chọn ⚫ Nếu chọn nhiều dòng thì trả về 1 giá trị tuỳ ý của các dòng được chọn. ⚫ Nếu không chọn thì trả về giá trị -1. – SelectedIndices: Trả về một mảng các chỉ số của các dòng được chọn. – SelectedItem: Trả về giá trị dòng được chọn. – SelectedItems: Trả về một mảng giá trị các dòng được chọn. 155
  156. Chương 5 Windows Form- ListBox ⚫ Các thuộc tính thường dùng – Sorted: Có/Không sắp xếp dữ liệu trong ListBox. Ngầm định là False. – SelectionMode: Xác định số lượng dòng được chọn của ListBox. ⚫ one: Một dòng ⚫ Multi: Nhiều dòng 156
  157. Chương 5 Windows Form- ListBox ⚫ Sự kiện thường dùng – SelectedIndexChanged: Xảy ra khi chọn một dòng. Ngầm định khi nháy đúp ở chế độ thiết kế. ⚫ Ví dụ – Xây dựng Form 157
  158. Chương 5 Windows Form- ListBox private void btnAdd_Click(object sender, EventArgs e) { listBox1.Items.Add(txtInput.Text); txtInput.Clear(); } private void btnRemove_Click(object sender, EventArgs e) { int row=listBox1.SelectedIndex; if (row != -1) listBox1.Items.RemoveAt(row); } private void btnClear_Click(object sender, EventArgs e) { listBox1.Items.Clear(); 158 }
  159. Chương 5 Windows Form - CheckedListBox ⚫ CheckedListBox là sự mở rộng của ListBox bằng cách thêm CheckBox ở phía bên trái mỗi dòng ⚫ Có thể chọn các dòng 159
  160. Chương 5 Windows Applications - CheckedListBox ⚫ Các thuộc tính thường dùng – CheckedItems: Mảng các giá trị của dòng được đánh dấu Check. – CheckedIndices: Mảng các chỉ số dòng được đánh dấu Check. ⚫ Phương thức thường dùng – GetItemChecked(index): Trả về true nếu dòng được chọn. ⚫ Sự kiện thường dùng – ItemCheck: Xảy ra khi dòng được checked hoặc unchecked. 160
  161. Chương 5 Windows Applications - CheckedListBox ⚫ Ví dụ: – Xây dựng Form khi đánh dấu check thì dòng được đưa sang ListBox bên phải, khi bỏ dấu Check thì xoá dòng trong ListBox bên phải 161
  162. Chương 5 Windows Applications - CheckedListBox 162
  163. Chương 5 Windows Applications - ComboBox ⚫ Là sự kết hợp của TextBox và ListBox ⚫ Các thuộc tính thường dùng – DropDownStyle: Xác định kiểu của ComboBox. ⚫ Simple: Chọn hoặc gõ giá trị ⚫ DropDown (ngầm định): Chọn hoặc gõ giá trị ⚫ DropDownList: Chỉ cho phép chọn giá trị. 163
  164. Chương 5 Windows Applications - ComboBox ⚫ Các thuộc tính thường dùng – Items: Mảng các dòng trong ComboBox – SelectedIndex: Chỉ số dòng được chọn. Nếu không chọn có giá trị -1. – SelectedItem: Giá trị dòng được chọn. – Sorted: Có/Không sắp xếp dữ liệu trong ComboBox. Ngầm định là false. ⚫ Sự kiện thường dùng – SelectedIndexChanged: Xảy ra khi chọn 1 dòng. 164
  165. Chương 5 Windows Applications - ComboBox ⚫ Các phương thức thường dùng – Add: Thêm một dòng vào ComboBox ⚫ comboBox1.Items.Add(“Cat”); ⚫ comboBox1.Items.Add(“Mouse”); – RemoveAt(row): Xoá dòng ở vị trí row ⚫ comboBox1.Items.RemoveAt(row); – Clear: Xoá tất cả các dòng trong ComboBox ⚫ comboBox1.Items.Clear(); 165
  166. Chương 5 Windows Applications - ComboBox ⚫ Ví dụ – Xây dựng Form để lấy Font của hệ thống 166
  167. Chương 5 Windows Applications - ComboBox 167
  168. Chương 5 Windows Applications - Menu ⚫ Dùng để nhóm các lệnh cùng nhau ⚫ Menu có thể chứa – Menu ngang – Menu dọc – Menu con – Các biểu tượng – Các phím nóng – Các đường phân các – „ 168
  169. Chương 5 Windows Applications - Menu ⚫ Xây dựng menu – Kéo biểu tượng MenuStrip vào Form 169
  170. Chương 5 Windows Applications - Menu ⚫ Xây dựng menu – Gõ các dòng cho menu – Đặt tên cho các dòng của menu ⚫ Chọn cửa sổ Properties và đặt thuộc tính Name ⚫ Tên menu đặt bằng tiền tố mnu (ví dụ: mnuFile, mnuEdit) – Chèn hình ảnh cho các dòng của menu ⚫ Nháy chuột phải và chọn Set Image ⚫ Chọn Local Resource -> Import -> chọn hình ảnh – Đặt phím nóng cho các dòng của menu ⚫ Chọn cửa sổ Properties và đặt thuộc tính ShortCutKey 170
  171. Chương 5 Windows Applications - Menu ⚫ Các thuộc tính thường dùng – Name: Tên menu được dùng trong mã lệnh. – Checked: Có/Không dòng menu xuất hiện checked. Ngầm định là false. – ShortCutKey: Đặt phím nóng cho menu – ShowShortcut: Có/Không phím nóng hiển thị trên dòng menu. Ngầm định là true. – Text: Xuất hiện trên dòng menu. 171
  172. Chương 5 Windows Applications - Menu ⚫ Sự kiện thường dùng – Click: Xảy ra khi một dòng của menu được click chuột hoặc ấn phím nóng. Ngầm định khi nháy đúp chuột trong chế độ thiết kế. ⚫ Viết lệnh cho dòng của menu gọi một Form = new ; .Show(); .ShowDialog(); 172
  173. Chương 5 Windows Applications - Menu ⚫ Ví dụ Xây dựng menu 173
  174. Chương 5 Windows Applications – Menu ngữ cảnh ⚫ Menu hiển thị khi nháy chuột phải trên đối tượng của Form hoặc trên Form. ⚫ Thiết kế menu ngữ cảnh – Kéo điều khiển MenuContext vào form – Thiết kế các dòng menu ngữ cảnh giống như thiết kế menu ⚫ Hiển thị menu ngữ cảnh – Chọn đối tượng hoặc Form – Đặt thuộc tính ContextMenuStrip của đối tượng được chọn là tên của menu ngữ cảnh. 174
  175. Chương 5 Windows Applications - Toolbar ⚫ ToolBar dùng để chứa các biểu tượng của các chức năng thường được sử dụng trong chương trình. ⚫ Xây dựng ToolBar – Kéo điều khiển ToolStrip vào Form – Nháy chuột vào biểu tượng phải và chọn đối tượng tạo ToolBar ⚫ Button: Nút ấn ⚫ DropDownButton: Nút sổ xuống ⚫ Separator: Đường phân cách 175
  176. Chương 5 Windows Applications - Toolbar ⚫ Xây dựng ToolBar – Đặt tên cho các nút của ToolBar ⚫ Chọn cửa sổ Properties và đặt thuộc tính Name ⚫ Tên TooBar đặt bằng tiền tố tb (ví dụ: tbNew, tbOpen) – Chèn hình ảnh cho đối tượng của ToolBar ⚫ Nháy chuột phải và chọn Set Image ⚫ Chọn Local Resource -> Import -> chọn hình ảnh – Viết mã lệnh ⚫ Gọi từ menu: .PerformClick() ⚫ Gọi trực tiếp đối tượng 176
  177. Chương 5 Windows Applications – MDI Windows ⚫ Một ứng dụng MDI cho phép người dùng thao tác với nhiều cửa sổ ở một thời điểm. ⚫ SDI và MDI Forms 177
  178. Chương 5 Windows Applications – MDI Windows ⚫ Ví dụ MDI Parent và MDI Child 178
  179. Chương 5 Windows Applications – MDI Windows ⚫ Thuộc tính MDI Parent của Form – IsMdiContainer: Có/Không một Form là form MDI Parent. Ngầm định là False. – ActiveMdiChild: Trả về Form Child đang được kích hoạt. ⚫ Thuộc tính MDI Child – IsMdiChild: Có/Không Form là một MDI child (thuộc tính read-only). – MdiParent: Chi ra một MDI parent của Form .MdiParent = this 179
  180. Chương 5 Windows Applications – MDI Windows ⚫ Phương thức thường dùng – LayoutMdi: Xác định kiểu hiển thị của Form con trong MDI Form. ⚫ ArrangeIcons: Sắp xếp các biểu tượng dưới MDI ⚫ Cascade: Sắp xếp các cửa sổ chồng nhau ⚫ TileHorizontal: Sắp xếp cửa sổ theo chiều ngang ⚫ TileVertical: Sắp xếp cửa sổ theo chiều dọc 180
  181. Chương 5 Windows Applications – MDI Windows ⚫ Các kiểu sắp xếp. 181
  182. Chương 5 Windows Applications - TreeView ⚫ Hiển thị thông tin theo các nút (node) ⚫ Các nút cha có các nút con ⚫ Nút đầu tiên gọi là nút gốc ⚫ Ấn dấu [+] để mở nút ⚫ Ấn dấu [-] để thu gọn nút ⚫ Mỗi nút có hình ảnh kèm theo 182
  183. Chương 5 Windows Applications - TreeView ⚫ Các thuộc tính thường dùng – CheckBoxes: Có/không xuất hiện các checkbox trên các node. Ngầm định là False. – Checked: Có/không một Node được check (thuộc tính CheckBoxes phải được đặt là True) – ImageList: Chỉ ra danh sách ảnh hiển thị trên các node. ⚫ ImageList là một mảng các đối tượng ảnh. ⚫ Tạo danh sách ảnh ImageList bằng cách kéo điều kiển vào Form, nháy chuột phải và chọn Choose Image để thêm các ảnh vào ImageList. 183
  184. Chương 5 Windows Applications - TreeView ⚫ Các thuộc tính thường dùng – Nodes: Mảng các TreeNodes trong TreeView. ⚫ Nodes.Add: Bổ sung một node vào cây. ⚫ Nodes.Clear: Xoá toàn bộ các node trên cây. ⚫ Nodes.Remove: Xoá một node trên cây và các node con của nó. – SelectedNode: Node hiện thời được chọn – FullPath: Chỉ ra đường dẫn đến node bắt đầu từ node gốc. 184
  185. Chương 5 Windows Applications - TreeView ⚫ Các thuộc tính thường dùng – SelectedImageIndex: Chỉ ra chỉ số ảnh được hiển thị trên node khi node được chọn. – ImageIndex: Chỉ ra chỉ số ảnh được hiển thị trên node khi node không được chọn (deselected). – Text: Text hiển thị của Node. – FirstNode: Node con đầu tiên của node. – LastNode: Node con cuối cùng của node. – PrevNode: Node con trước node con hiện thời. – NextNode: Node con tiếp theo node hiện thời. 185
  186. Chương 5 Windows Applications - TreeView ⚫ Các phương thức thường dùng – Collapse: Thu nhỏ các node con của node. – Expand: Mở rộng các node con của node. – ExpandAll: Mở rộng tất cả các node con. – GetNodeCount: Trả về số lượng node con. ⚫ Các sự kiện thường dùng – AfterSelect: Xảy ra khi một node được chọn (ngầm định khi nháy đúp chuột ở chế độ thiết kế). – BeforeExpand: Xẩy ra khi mở rộng một node 186
  187. Chương 5 Windows Applications - TreeView ⚫ Ví dụ: ⚫ Cài đặt các thuộc tính cho các đk ⚫ treeView1 ⚫ txtInput ⚫ comboBox1 ⚫ btnAddRoot ⚫ btnAddChild ⚫ btnDelete ⚫ Khởi tạo trong lớp 187 private TreeNode currentNode;
  188. Chương 5 Windows Applications - TreeView ⚫ Cài đặt thuộc tính của imageList1 ImageCollection: The images stored in this ImageList. ⚫ Load Even 188
  189. Chương 5 Windows Applications - TreeView ⚫ btnAddRoot Click Event ⚫ treeView1_AfterSelect Click Event 189
  190. Chương 5 Windows Applications - TreeView ⚫ btnAddChild and btnDelete Click Event 190
  191. Chương 5 Windows Applications - ListView ⚫ Dùng để hiển thị dữ liệu theo các dòng và các cột – Có thể chọn một hoặc nhiều dòng – Có thể hiển thị các biểu tượng theo các dòng ⚫ Ví dụ ListView hiển thị danh sách thư mục TP và các tệp 191
  192. Chương 5 Windows Applications - ListView ⚫ Các thuộc tính thường dùng – CheckBoxes: Có/không xuất hiện các checkbox trên các dòng dữ liệu (ngầm định là False) – Columns: Các cột hiển thị trong chế độ Details – FullRowSelect: Indicates whether all SubItems are hightlighted along with the Item when selected. – GridLines: Hiển thị lưới (chỉ hiển thị trong chế độ Details). 192
  193. Chương 5 Windows Applications - ListView ⚫ Các thuộc tính thường dùng – Items: Mảng các dòng (ListViewItems) trong ListView. – LargeImageList: Danh sách ảnh (ImageList) hiển thị trên ListView. – SmallImageList: Danh sách ảnh (ImageList) hiển thị trên ListView. – MultiSelect: Có/Không cho phép chọn nhiều dòng (ngầm định là True). – SelectedItems: Mảng các dòng được chọn. 193
  194. Chương 5 Windows Applications - ListView ⚫ Các phương thức thường dùng – Add: Thêm một dòng vào ListView – Clear: Xoá tất cả các dòng của ListView – Remove: Xoá một dòng trong ListView – RemoveAt(index): Xoá một dòng ở vị trí index ⚫ Sự kiện thường dùng – ItemSelectionChanged: Xảy ra khi chọn một dòng. 194
  195. Chương 5 Windows Applications - ListView ⚫ Các thuộc tính thường dùng – View: Kiểu hiện thị của ListView ⚫ Icons: Hiển thị danh sách theo các biểu tượng ⚫ List: Hiển thị danh sách theo một cột ⚫ Details: Hiển thị ListView theo danh sách nhiều cột 195
  196. Chương 5 Windows Applications – TabControl ⚫ Tạo ra các cửa sổ Tab ⚫ Mỗi cửa sổ Tab gọi là một TabPage – TabPages có thể chứa các điều khiển 196
  197. Chương 5 Windows Applications – TabControl ⚫ Thêm và xóa các TabPage. 197
  198. Chương 5 Windows Applications – TabControl ⚫ Ví dụ: tạo TabControl như sau: 198
  199. Chương 6 Truy cập cơ sở dữ liệu với .NET – ADO.Net ⚫ ADO.NET là công nghệ truy nhập dữ liệu có cấu trúc Cung cấp giao diện hướng đối tượng hợp nhất (Uniform object oriented) cho các dữ liệu khác nhau – Cơ sở dữ liệu quan hệ – XML – Các dữ liệu khác ⚫ Được thiết kế cho các ứng dụng phân tán và Web 199
  200. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ ADO.NET = ActiveX Data Objects ⚫ Các đối tượng ADO.NET chứa trong không gian tên System.Data. ⚫ Các đối tượng ADO.NET chia thành 2 loại: – Connected: Các đối tượng truyền thông trực tiếp với cơ sở dữ liệu. – Disconnected: Các đối tượng không truyền thông trực tiếp với cơ sở dữ liệu. 200
  201. Chương 6 Truy cập cơ sở dữ liệu với .NET 201
  202. Chương 6 Truy cập cơ sở dữ liệu với .NET 202
  203. Chương 6 Truy cập cơ sở dữ liệu với .NET 203
  204. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ DataTable – Có thể ánh xạ một bảng vật lý với DataTable – Một DataTable là một mảng 2 chiều gồm các dòng và các cột ⚫ Một số thuộc tính – Columns: Các cột dữ liệu của DataTable ⚫ Count: Số cột trong DataTable – Rows: Các dòng dữ liệu của DataTable ⚫ Count: Số dòng trong DataTable 204
  205. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ Data Table – Tạo một DataTable trong bộ nhớ DataTable myTable = new DataTable(); myTable.Columns.Add(“MaKhoa”, typeof(string)); myTable.Columns.Add(“TenKhoa”, typeof(string)); 205
  206. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ ADO.NET tổ chức thành mô hình đối tượng – System.Data: Các lớp của ADO.NET – System.Data.OleDb: Các lớp làm việc với dữ liệu OLE DB – System.Data.SqlClient: Các lớp làm việc với cở sở dữ liệu SQL Server 206
  207. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ ADO.NET Data Providers – Là các lớp truy nhập dữ liệu nguồn ⚫ Microsoft SQL Server™ 2000, SQL Server 2005 ⚫ Oracle ⚫ Microsoft Access – Thiết lập kết nối giữa DataSetsvà dữ liệu nguồn – Có 2 thư viện ADO.NET Data Providers ⚫ System.Data.OleDb: Dùng truy nhập cơ sở dữ liệu OLE ⚫ System.Data.SqlClient: Truy nhập SQL Server 207
  208. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ ADO.NET Data Providers 208
  209. Chương 6 Truy cập cơ sở dữ liệu với .NET Đối tượng Connection ⚫ Biểu diển kết nối tới cơ sở dữ liệu //Ket noi toi co so du lieu MS Access string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source= "; OleDbConnection myConnection = new OleDbConnection(conStr); myConnection.Open(); //Ket noi toi co so du lieu SQL Server string conStr = “Data Source = ;“ + “Persist Security Info = true;“ + “Initial Catalog = ;“ + “User Id =name; Password=psw;” + “Connect Timeout = ”; SqlConnection myConnection = new SqlConnection(conStr); myConnection.Open(); 209
  210. Chương 6 Truy cập cơ sở dữ liệu với .NET Đối tượng DataAdapter ⚫ Dùng để lấy dữ liệu từ dữ liệu nguồn vào DataSet và để cập nhật dữ liệu từ DataSet vào dữ liệu nguồn ⚫ OleDbDataAdapter làm việc với CSDL MS Access ⚫ SqlDataAdapter làm việc với dữ liệu SQL Server 210
  211. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ Ví dụ phương thức Fill lấy dữ liệu vào DataTable string conStr = “Data Source = may01;" + “Initial Catalog = QLSV;“ + “Persist Security Info = true;“ + “User Id =sa; Password=sa; Connect Timeout =50 ”; //Ket noi toi co so du lieu SqlConnection myConnection = new SqlConnection(conStr); myConnection.Open(); string sqlStr = “SELECT * FROM tblKhoaDaoTao”; SqlDataAdapter myDataAdapter = new SqlDataAdapter(sqlStr,myConnection); DataSet myDataSet = new DataSet(); myDataAdapter.Fill(myDataSet,”tblKhoaDaoTao”); DataTable myTable = myDataSet.Tables[“tblKhoaDaoTao”]; 211
  212. Chương 6 Truy cập cơ sở dữ liệu với .NET Đối tượng DataGridView ⚫ Dùng để hiển thị dữ liệu từ 1 DataTable ⚫ Cách thực hiện – Thêm đối tượng DataGridView vào Form – Nháy chuột phải và chọn Add column hoặc Edit columns – Lần lượt chọn Add để thêm các cột – Mỗi cột cần khai báo các thuộc tính ⚫ Name: Tên cột dùng trong mã lệnh ⚫ Header text: Tiêu đề hiển thị của cột 212 ⚫ DataPropertyName: Tên cột dữ liệu của DataTable.
  213. Chương 6 Truy cập cơ sở dữ liệu với .NET Đối tượng DataGridView ⚫ DataSource: Tên DataTable cần hiển thị lên lưới ⚫ AutoGenerateColumns: Tự động lấy các cột nếu bằng true, ngược lại lấy đúng số cột đã khai báo. ⚫ dataGridView1.AutoGenerateColumns = false; ⚫ dataGridView1.DataSource = myTable; ⚫ AllowUserToAddRows: Cho/không thêm dòng trên lưới ⚫ AllowUserToDeleteRows: Cho/không xoá dòng trên lưới ⚫ Sự kiện thường dùng – RowEnter: Xảy ra khi con trỏ đưa vào một dòng ⚫ e.RowIndex: Dòng hiện thời 213 ⚫ e.ColumnIndex: Cột hiện thời
  214. Chương 6 Truy cập cơ sở dữ liệu với .NET Đối tượng DataGridView ⚫ Hiển thị dữ liệu trong bảng tblKhoaDaoTao lên lưới, khi chuyển con trỏ trên lưới dữ liệu hiển thị lên TextBox. 214
  215. Chương 6 Truy cập cơ sở dữ liệu với .NET private string conStr = "Data Source = (local);" + "Initial Catalog = QLSinhVien;" + "persist security info = true;" + "User Id=sa; Password=sa; Connect Timeout =50"; private SqlDataAdapter myDataAdapter; private DataSet myDataSet; private DataTable myTable; private void frmDataGridView_Load(object sender, EventArgs e) { string SqlStr = "SELECT * FROM tblKhoaDaoTao"; myDataAdapter = new SqlDataAdapter(SqlStr, conStr); myDataSet = new DataSet(); myDataAdapter.Fill(myDataSet,"tblKhoaDaoTao"); myTable = myDataSet.Tables["tblKhoaDaoTao"]; //Chuyen len luoi dataGridView1.DataSource = myTable; dataGridView1.AutoGenerateColumns = false; 215 }
  216. Chương 6 Truy cập cơ sở dữ liệu với .NET private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e) { try { int row = e.RowIndex; txtMaKhoa.Text = myTable.Rows[row]["MaKhoa"].ToString(); txtTenKhoa.Text = myTable.Rows[row]["TenKhoa"].ToString(); } catch (Exception) { } } 216
  217. Chương 6 Truy cập cơ sở dữ liệu với .NET Đối tượng SqlCommand ⚫ Dùng để thực hiện câu lệnh SQL – Insert – Update – Delete 217
  218. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ Khai báo biến private string conStr =“Data Source = ;”; private SqlConnection myConnection; private SqlCommand myCommand; ⚫ Mở kết nối myConnection = new SqlConnection(conStr); myConnection.Open(); ⚫ Thực hiện câu lệnh SQL myCommand = new SqlCommand(sqlStr,myConnection); myCommand.ExecuteNonQuery(); ⚫ Chú ý: sqlStr là câu lệnh SQL 218
  219. Chương 6 Truy cập cơ sở dữ liệu với .NET private void btnSave_Click(object sender, EventArgs e) { string sSql; sSql = "Insert Into tblKhoaDaoTao (MaKhoa, TenKhoa)"+ "Values (N'"+ txtMaKhoa.Text + "',N'" + txtTenKhoa.Text + "')"; myCommand = new SqlCommand(sSql, myConnection); myCommand.ExecuteNonQuery(); Display(); SetControls(false); } 219
  220. Chương 6 Truy cập cơ sở dữ liệu với .NET Đối tượng SqlCommandBuilder ⚫ Tự động thực hiện Update, Insert, Delete ⚫ Khai báo các biến private string conStr = “Data Source = ;”; private SqlConnection myConnection; private SqlDataAdapter myDataAdapter; private SqlCommandBuilder myCommandBuilder; private DataSet myDataSet; private DataTable myTable; private string sqlStr; 220
  221. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ Tạo kết nối tới cơ sở dữ liệu myConnection = new SqlConnection(conStr); ⚫ Tạo một SqlDataAdapter myDataAdapter = new SqlDataAdapter(sqlStr, myConnection); ⚫ Tạo một SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myDataAdapter); ⚫ Tạo một DataTable myDataSet = new DataSet(); myDataAdapter.Fill(myDataSet,” ”); myTable = myDataSet.Tables[“ ”]; 221
  222. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ Xoá một dòng myTable.Rows[pos].Delete(); myDataAdapter.Update(myTable); Trong do : pos là dòng cần xoá ⚫ Thêm một dòng DataRow newRow = myTable.NewRow(); newRow["MAKHOA"] = txtMakhoa.Text; newRow["TENKHOA"] = txtTen.Text; myTable.Rows.Add(newRow); myDataAdapter.Update(myTable); 222
  223. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ Sửa một dòng DataRow editRow =myTable.Rows[pos]; editRow["MAKHOA"] = txtMakhoa.Text; editRow["TENKHOA"] = txtTenkhoa.Text; myDataAdapter.Update(myTable); Note: pos là dòng cần sửa ⚫ Loại bỏ sửa đổi dòng myTable.RejectChanges(); 223
  224. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ Đối tượng ListBox và ComboBox – ListBoxes: Cho phép người dùng xem và chọn các dòng dữ liệu từ danh sách – ComboBox: Sự kết hợp của TextBox và LixtBox ⚫ Cac thuoc tinh – DataSource: Nguồn dữ liệu, là một DataTable – DisplayMember: Cột hiển thị trong ListBox – ValueMember: Cột giá trị trả về khi chọn ListBox – SelectedIndex: Dòng hiện thời được chọn – SelectedValue: Giá trị được chọn trên ListBox 224
  225. Chương 6 Truy cập cơ sở dữ liệu với .NET ⚫ Ví dụ hiển thị dữ liệu trong tblKhoaDaoTao if (myTable.Rows.Count > 0) { comboBox1.DataSource = myTable; comboBox1.DisplayMember = “TenKhoa"; comboBox1.ValueMember = “MaKhoa"; comboBox1.SelectedIndex = 0; } ⚫ Giá trị trả về khi chọn là: comboBox1.SelectValue 225