Giáo trình Lập trình Windows Forms với C#: Phần 1 cung cấp cho người học những kiến thức như: Giới thiệu về C#; Giới thiệu về Windows Forms; Các điều khiển thông thường; Các điều khiển đặc biệt; Điều khiển dùng để xây dựng Menu.
Giới thiệu về C#
Giới thiệu về Microsoft NET Framework
.NET Framework là nền tảng phát triển lý tưởng của Microsoft, cung cấp cho lập trình viên các thư viện chung hỗ trợ phát triển nhiều loại ứng dụng khác nhau.
Ứng dụng mạng và các ứng dụng điều khiển truy cập từ xa
1.1.2 Các thành phần của Microsoft NET Framework
.NET Framework gồm hai thành phần chính là: Common Language Runtime (CLR) và thư viện lớp
CLR là nền tảng của NET Framework, cho phép Microsoft tích hợp nhiều ngôn ngữ lập trình như VB.NET, C#.NET và ASP.NET vào Visual Studio.NET Điều này giúp các ứng dụng viết bằng các ngôn ngữ này có thể chạy trên hệ điều hành Windows Microsoft đạt được điều này nhờ việc biên dịch các ngôn ngữ lập trình thành ngôn ngữ trung gian (Intermediate Language - IL) và sử dụng kiểu dữ liệu hệ thống chung (Common Type System) CLR sau đó sử dụng trình biên dịch Just-in-Time (JIT) để chuyển đổi mã IL thành mã máy và thực thi.
Ngoài ra CLR còn làm các thành phần khác như:
Bộ thu gom rác (Garbage Collection - GC) là một hệ thống tự động quản lý bộ nhớ, có nhiệm vụ thu hồi các vùng nhớ không còn được sử dụng tại những thời điểm được xác định trước.
Code Access Security (CAS) quản lý quyền hạn cho các chương trình dựa trên thiết lập bảo mật của máy tính Ví dụ, nếu thiết lập cho phép chương trình tạo hoặc sửa file mới nhưng không cho phép xóa file, CAS sẽ đảm bảo rằng các đoạn mã tuân thủ đúng các quy định này.
Bộ phận chứng nhận đoạn mã đảm bảo tính chính xác và an toàn của các đoạn mã khi chạy, ngăn chặn việc truy cập trái phép vào các vùng nhớ không được phép.
Thư viện lớp là bộ sưu tập phong phú các lớp do Microsoft phát triển, được thiết kế trực quan và dễ sử dụng, giúp lập trình viên thực hiện nhiều tác vụ trên Windows một cách hiệu quả.
Thư viện lớp cơ bản (Base Class Library) là tập hợp các lớp thiết yếu được sử dụng trong lập trình, và chính những nhà phát triển NET Framework cũng dựa vào nó để xây dựng các lớp cao hơn Một số ví dụ về thư viện trong Base Class Library bao gồm: String, Integer, Exception, và nhiều hơn nữa.
ADO.NET và XML là bộ thư viện quan trọng cho việc xử lý dữ liệu, với ADO.NET thay thế ADO trong thao tác dữ liệu thông thường Các lớp đối tượng XML trong ADO.NET hỗ trợ xử lý dữ liệu theo định dạng XML mới Một số thư viện nổi bật trong ADO.NET và XML bao gồm sqlDataAdapter, SqlCommand và DataSet.
Windows Forms là bộ thư viện lập trình dành cho việc phát triển ứng dụng Windows cơ bản, bao gồm các lớp đối tượng như Form, UserControl, TextBox, Label, Button, ComboBox, ListBox, và TreeView Những thư viện này cung cấp các công cụ cần thiết để xây dựng giao diện người dùng hiệu quả và trực quan.
Web Services là các dịch vụ được cung cấp qua Internet, chủ yếu hướng đến các nhà phát triển phần mềm thay vì người dùng cuối Chúng có thể cung cấp dữ liệu hoặc thực hiện các chức năng tính toán, giúp tối ưu hóa quy trình phát triển ứng dụng.
ASP.NET là nền tảng phát triển ứng dụng web, tận dụng toàn bộ sức mạnh của NET Framework Nó cung cấp một bộ điều khiển Server Control giúp lập trình viên dễ dàng bắt sự kiện và xử lý dữ liệu, tương tự như khi làm việc với ứng dụng Windows Một số thư viện tiêu biểu bao gồm WebControl và HTML Control.
Tổng quan
On February 12, 2002, Microsoft officially launched Visual Studio 2002 alongside NET Framework 1.0, enabling the development of various applications, including Windows Forms and web applications, on the NET platform The primary programming languages utilized by Microsoft for application development are C# and Visual Basic.NET.
C# là ngôn ngữ lập trình được phát triển bởi đội ngũ kỹ sư của Microsoft, do Anders Hejlsberg và Scott Wiltamult dẫn dắt Ra đời sau các ngôn ngữ như Java, C, C++, Perl và Visual Basic, C# sở hữu những đặc điểm nổi trội và mạnh mẽ, đồng thời vẫn giữ được sự đơn giản trong việc sử dụng.
Microsoft thêm vào những đặc điểm mới vào để C# dễ sử dụng hơn:
C# là một ngôn ngữ lập trình đơn giản với cú pháp, biểu thức và toán tử tương tự như C và C++ Ngôn ngữ này loại bỏ những khái niệm phức tạp như con trỏ, macro, đa kế thừa, template và lớp cơ sở ảo, giúp lập trình viên dễ dàng tiếp cận và sử dụng.
C# là một ngôn ngữ lập trình hiện đại, sở hữu đầy đủ các đặc điểm nổi bật như xử lý ngoại lệ, thu gom bộ nhớ tự động, hỗ trợ kiểu dữ liệu mở rộng và đảm bảo an toàn cho mã nguồn.
C# là một ngôn ngữ lập trình thuần hướng đối tượng, mang đầy đủ các đặc điểm cần thiết cho lập trình hướng đối tượng, bao gồm sự đóng gói (Encapsulation), thừa kế (Inheritance) và đa hình (Polymorphism).
- C# là ngôn ngữ mạnh mẽ và mềm dẻo: Có thể sử dụng cho những dự án khác nhau như: xử lý văn bản, ứng dụng đồ họa, bảng tính, …
C# là ngôn ngữ lập trình với số lượng từ khóa hạn chế, chỉ khoảng 80 từ khóa, cùng với hơn 10 kiểu dữ liệu được xây dựng sẵn, như được trình bày trong bảng 1.1.
Table 1.1 provides a comprehensive description of C# keywords, including terms such as abstract, default, foreach, and object It covers various data types and modifiers like bool, double, and int, as well as control flow statements including if, switch, and while The table also includes keywords related to memory management and safety, such as unsafe, stackalloc, and checked Additionally, it features access modifiers like public, private, and protected, along with other important concepts like delegate, event, and interface This resource serves as an essential reference for understanding the syntax and structure of C#.
Cấu trúc tổng quát của một chương trình C#
Các đoạn mã C# có thể được soạn thảo trong một trình soạn thảo văn bản bất kỳ, sau khi biên soạn xong cần lưu tập tin với đuôi cs
Trong quá trình soạn thảo cần lưu ý C# là một ngôn ngữ thuần hướng đối tượng
Do đó tất cả đoạn mã của chương trình đều phải thuộc lớp
Ví dụ 1.1: Soạn thảo một chương trình C# in dòng chữ Hello World ra màn hình
Trong đoạn chương trình, hàm Main được khai báo là static, cho phép nó được sử dụng mà không cần thông qua đối tượng.
Hàm WriteLine thuộc lớp Console, vì vậy cần khai báo dòng lệnh “Using System;” ở đầu để sử dụng nhanh chóng với cú pháp “Console.WriteLine()” Nếu không khai báo “Using System;”, bạn phải viết đầy đủ cú pháp “System.Console.WriteLine()”, trong đó System là một namespace.
- C# phân biệt chữ thường và chữ hoa, do đó lệnh writeline khác lệnh WriteLine
Bước 2: Khi soạn thảo xong Lưu tập tin với tên: ChaoMung.cs
Bước 3: Thực thi chương trình phải thực hiện hai bước:
Mở cửa sổ Command Line và biên dịch tập tin ChaoMung.cs sang mã máy để tạo file có đuôi exe bằng trình biên dịch dòng lệnh C# (csc.exe), chương trình này được cài đặt cùng với NET Framework Nếu bạn đã cài đặt Framework 4.0, hãy truy cập vào đường dẫn thích hợp để thực hiện biên dịch.
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
Hình 1.1: Biên dịch tập tin hello.cs
- Thực thi tập tin có đuôi exe như hình 1.2:
Hình 1.2: Thực thi tập tin Hello.exe
1.3.2 Soạn thảo bằng Microsoft Visual Studio 2010
Bước 1: Mở Microsoft Visual Studio 2010 và tạo 1 dự án mới như hình 1.3
Hình 1.3: Tạo dự án mới
Bước 2: Tạo một loại dự án đơn giản là Console Application để minh họa bằng ngôn ngữ C# và đặt tên Baitap lưu ở ổ đĩa D như hình 1.4
Hình 1.4: Tạo loại dự án và đặt tên cho dự án
Bước 3: Soạn thảo mã C# trong trình biên dịch như hình 1.5
Bước 1: Chọn thực đơn File > New
Step 1: Select the type of project If you are developing in a Console environment, choose the project type as Console Application For a Windows Forms environment, select Windows Forms Application.
Hình 1.5: Giao diện soạn thảo mã lệnh
Bước 4: Biên dịch chương trình: trên thanh menu chọn Build > Build Solution như hình 1.6 hoặc ấn tổ hợp phím Ctrl + Shift + B
Hình 1.6: Biên dịch chương trình
Bước 5: Thực thi chương trình: trên thanh menu chọn Debug > Start Debugging như hình 1.7 hoặc phím F5
Hình 1.7: Thực thi chương trình
Biến và kiểu dữ liệu
Biến là nơi lưu trữ dữ liệu trong chương trình, với dữ liệu nằm trong bộ nhớ RAM và có khả năng thay đổi Để sử dụng biến, lập trình viên cần chỉ định kiểu dữ liệu cụ thể cho biến đó.
Cú pháp khai báo biến:
Lưu ý: Tên biến phải được đặt phù hợp với quy tắc đặt tên
Cú pháp khởi tạo giá trị cho biến:
= là phép toán gán giá trị
Quy tắc đặt tên: Các tên biến, tên hằng, tên hàm, … trong C# đề phải đặt tên đúng với quy tắc sau:
Một tên biến có thể bắt đầu bằng chữ hoa hay chữ thường Tên có thể chứa ký tự hay số và ký tự gạch dưới (_)
Ký tự đầu tiên của biến phải là ký tự , không được là số
Trong C# phân biệt hoa thường
Các từ khóa không thể sử dụng để đặt tên cho biến Nếu muốn dùng từ khóa đặt tên thì ta thêm ký tự @ phía trước
Employee: Hợp lệ student: Hợp lệ
@goto: Hợp lệ static: Không hợp lệ, trùng từ khóa
4myclass: Không hợp lệ, không thể bắt đầu bằng ký tự số
Student&Falculty: Không hợp lệ, không được chứa ký tự đặc biệt
Cũng như ngôn ngữ lập trình C++ hay Java, C# chia thành hai tập kiểu dữ liệu chính:
Trong C#, tất cả các kiểu dữ liệu đều được phân loại thành hai nhóm chính: kiểu giá trị và kiểu tham chiếu Kiểu giá trị được lưu trữ trong stack, trong khi kiểu tham chiếu được lưu trữ trong heap.
Stack: một vùng bộ nhớ dành lưu trữ dữ liệu với chiều dài cố định
Ví dụ 1.3: số nguyên kiểu int luôn chiếm dụng 4 bytes
Mỗi chương trình khi thực thi đều được cấp riêng 1 stack mà các chương trình khác không truy cập tới được
Heap: một vùng bộ nhớ dùng lưu trữ dữ liệu có dung lượng thay đổi
Khi tạo một đối tượng thuộc lớp string, địa chỉ của đối tượng sẽ được lưu trữ trên stack, trong khi giá trị của đối tượng sẽ được lưu trên heap.
Kiểu giá trị thường là các kiểu do C# định nghĩa sẵn bao gồm: double, char, int, float, enum, struct, …
Biến kiểu giá trị lưu trữ một giá trị thực trong stack, không cho phép giá trị null và yêu cầu phải có giá trị xác định.
Bảng 1.2: Bảng mô tả các kiểu dữ liệu giá trị trong C#
Trong C#, các kiểu dữ liệu cơ bản bao gồm: byte (1 byte) là số nguyên dương không dấu với giá trị từ 0 đến 255; char (2 byte) đại diện cho ký tự Unicode; bool (1 byte) là giá trị logic true/false; sbyte (1 byte) là số nguyên có dấu với khoảng từ -128 đến 127; short (2 byte) hay Int16 có giá trị từ -32.768 đến 32.767; ushort (2 byte) hay Uint16 là số nguyên không dấu với khoảng từ 0 đến 65.535; và int (4 byte) hay Int32 là số nguyên có dấu với khoảng từ -2.147.483.648 đến 2.147.483.647.
2.147.483.647 uint 4 Uint32 Số nguyên không dấu: 0 đến
4.294.967.295 float 4 Single Kiểu dấu chấm động, giá trị xấp xỉ từ
3,4E-38 đến 3,4E+38; với 7 chữ số có nghĩa double 8 Double Kiểu dấu chấm động, giá trị xấp xỉ từ
Kiểu số thực trong tính toán tài chính có giá trị từ 1,7E-308 đến 1,7E+308, với độ chính xác lên đến 28 con số và 15-16 chữ số có nghĩa thập phân Để đảm bảo tính chính xác, kiểu này yêu cầu phải có hậu tố.
“m” hay “M” theo sau giá trị long 8 Int64 Kiểu số nguyên có dấu có giá trị trong khoảng:
-9.233.370.036.854.775.808 đến - 9.233.372.036.854.775.807 ulong 8 Uint64 Số nguyên không dấu từ 0 đến
Trong lập trình, kiểu số thực được hiểu là kiểu double trừ khi được khai báo rõ ràng Để gán một số thuộc kiểu float, cần thêm ký tự 'f' sau số đó Ví dụ: float a = 0.15f;
Kiểu giá trị bool trong C# nhất thiết phải là true hoặc false
Biến kiểu dữ liệu tham chiếu lưu trữ địa chỉ của biến khác trên bộ nhớ heap, với các lớp đối tượng như String và Object được xem là kiểu dữ liệu tham chiếu Bên cạnh đó, các kiểu dữ liệu do người dùng tự xây dựng cũng thuộc loại kiểu tham chiếu.
“A” Địa chỉ biến str Giá trị của biến str
1.4.2.3 Bảng so sánh sự khác biệt giữa kiểu giá trị và kiểu tham chiếu
Bảng 1.3: Bảng so sánh sự khác biệt giữa kiểu giá trị và kiểu tham chiếu
Kiểu giá trị Kiểu tham chiếu Biến lưu trữ Giá trị của biến Địa chỉ của biến
Vị trí lưu trữ giá trị Stack Heap
Giá trị mặc định 0 Null
Phép toán gán Sao chép giá trị Sao chép địa chỉ
Việc chuyển đổi kiểu dữ liệu trong C# có thể thực hiện bằng một trong các cách sau:
Lớp Convert trong C# là một lớp được xây dựng sẵn, giúp chuyển đổi giữa các kiểu dữ liệu khác nhau Hầu hết các phương thức trong lớp này đều là phương thức tĩnh, phục vụ cho việc thực hiện các chuyển đổi dữ liệu một cách dễ dàng và hiệu quả.
Tham số có thể là chuỗi ký tự, hằng số, biến số nguyên, số thực hoặc kiểu bool Nếu tham số được chuyển kiểu là null, hàm Convert sẽ trả về giá trị mặc định.
Sử dụng phương thức Parse:
Phương thức Parse trong C# cho phép chuyển đổi chuỗi thành các kiểu dữ liệu cụ thể Mỗi kiểu dữ liệu có sẵn đều hỗ trợ phương thức này, ví dụ: int a = Convert.ToInt32("10") chuyển chuỗi "10" thành số nguyên, trong khi bool b = Convert.ToBoolean(27) chuyển số 27 thành kiểu boolean Tuy nhiên, nếu chuỗi không đúng định dạng như bool a = Convert.ToBoolean("hello") sẽ không chuyển được, hay int b = Convert.ToInt32("123456787654") có thể gây tràn bộ nhớ Đặc biệt, khi chuyển đổi từ null sang double như double d = Convert.ToDouble(null), phương thức sẽ trả về giá trị mặc định.
- Double.Parse(): Chuyển chuỗi về kiểu Double
- Int32.Parse(): Chuyển chuỗi về kiểu Int32
- Int64.Parse(): Chuyển chuỗi về kiểu Int64
- Boolean.Parse(): Chuyển chuỗi về kiểu Boolean
- Single.Parse(): Chuyển chuỗi về kiểu Single
Sử dụng phương thức TryParse:
Phương thức TryParse trong C# được sử dụng để chuyển đổi chuỗi thành kiểu dữ liệu cụ thể, tương tự như phương thức Parse Tất cả các kiểu dữ liệu cơ bản trong C# đều hỗ trợ phương thức TryParse Điểm khác biệt giữa TryParse và Parse là cách xử lý lỗi: TryParse không ném ra ngoại lệ khi chuyển đổi không thành công, mà trả về giá trị boolean để cho biết kết quả.
Cú pháp sử dụng TryParse có sự khác biệt với hai tham số: tham số đầu tiên là chuỗi cần chuyển đổi, trong khi tham số thứ hai là biến nhận giá trị chuyển đổi, và biến này phải được truyền theo dạng tham chiếu.
- Giá trị trả về của TryParse sẽ là true nếu chuyển kiểu thành công và trả về false nếu chuyển kiểu không thành công
Casting (ép kiểu) là phương pháp chuyển đổi giữa các kiểu dữ liệu tương tự, thường áp dụng cho kiểu số Ví dụ, ta có thể sử dụng `Int32.Parse("123")` để gán giá trị 123 cho biến `a`, hoặc `Float.Parse("20.7")` để gán 20.7 cho biến `b` Tuy nhiên, việc chuyển đổi có thể thất bại nếu dữ liệu không đúng định dạng, như `Int32.Parse("Hello")` sẽ không thành công Tương tự, `Byte.Parse("10000000000")` vượt quá giới hạn cho phép và `Boolean.Parse(null)` sẽ không chuyển đổi được do tham số là null.
Int32.TryParse(“123”, out a); //a sẽ mang giá trị 123 bool b;
Boolean.TryParse(“false”, out b); //b sẽ mang giá trị false int a;
Int32.TryParse("hello", out a); //trả về giá trị false, a mang giá trị 0 bool b;
Boolean.TryParse("", out b); //trả về giá trị false, b mang giá trị false
Trong quá trình chuyển đổi kiểu dữ liệu, có thể xảy ra lỗi khi chuyển giữa các kiểu không tương thích, chẳng hạn như từ kiểu chuỗi sang kiểu số hoặc từ kiểu boolean sang kiểu float.
Câu lệnh phân nhánh
Phân nhánh trong lập trình có thể được thực hiện thông qua các từ khóa như if, else, switch và case Quá trình này chỉ xảy ra khi biểu thức điều kiện được xác định là đúng.
Khi thân của câu lệnh if hoặc else chứa nhiều lệnh, các lệnh này cần được bao bọc trong một khối lệnh, tức là phải nằm trong dấu ngoặc nhọn { }.
Khi có nhiều điều kiện để lựa chọn, câu lệnh if có thể trở nên phức tạp và dài dòng Các ngôn ngữ lập trình cao cấp thường cung cấp câu lệnh switch, cho phép liệt kê các giá trị và chỉ thực hiện những giá trị phù hợp.
] if (biểu thức điều kiện)
}] int x= 10; float y = x; //chuyển đổi ngầm định, y = 10 int z = (int)y; //chuyển đổi rõ ràng, z = 10 int x = 10;
Lệnh nhảy trong lập trình được sử dụng để kết thúc một case, trong cấu trúc switch, các lệnh nhảy phổ biến là break và goto Nếu một case không có lệnh nhảy, trình biên dịch sẽ thực hiện tuần tự các câu lệnh trong từng case theo thứ tự từ trên xuống dưới.
- Trong trường hợp switch sử dụng nhiều case, có thể nhảy trực tiếp đến case cụ thể nào đó bằng goto; hoặc thoát khỏi switch sử dụng break
- : là hằng nguyên hoặc biến; Nếu là biến bắt buộc phải là biến kiểu số nguyên.
Câu lệnh lặp
C# kế thừa cú pháp câu lệnh của C/C++:
Ngoài ra 3 lệnh lặp cơ bản trên, C# còn có thêm lệnh lặp foreach dùng để làm việc với mảng, tập hợp
C# cũng cung cấp các lệnh nhảy như: break, goto, continue và return sử dụng kết hợp với lệnh lặp
1.6.1 Lệnh lặp while Ý nghĩa của vòng lặp while là: “Trong khi điều kiện đúng thì thực hiện các công việc này”
Cú pháp: switch (biểu thức điều kiện)
]
Biểu thức trong vòng lặp while đóng vai trò quan trọng trong việc xác định điều kiện thực hiện các lệnh Điều kiện này phải trả về giá trị kiểu bool, tức là true hoặc false.
Ví dụ 1.11: Viết chương trình tính tổng các số lẻ >0 và nhỏ hơn 10
1.6.2 Lệnh lặp do/ while Ý nghĩa của vòng lặp do/ while là: “làm điều này trong khi điều kiện vẫn còn đúng”
Sự khác biệt tối quan trọng của while và do while là tối thiểu sẽ có một lần các câu lệnh trong do while được thực hiện
Ví dụ 1.12: Viết chương trình tính tổng các số lẻ >0 và nhỏ hơn 10
Vòng lặp for bao gồm ba phần chính:
Khởi tạo biến đếm vòng lặp
Kiểm tra điều kiện biến đếm, nếu đúng thì sẽ thực hiện các lệnh bên trong vòng for static void Main(string[] args) { int i = 1, tong = 0; while (i < 10) { tong = tong + i; i = i+2;
} } do {
}while ( điều kiện ); static void Main(string[] args) { int i = 1, tong = 0; do { tong = tong + i; i = i+2;
Ví dụ 1.13: Viết chương trình tính tổng các số lẻ >0 và nhỏ hơn 10
Vòng lặp foreach cho phép tạo vòng lặp thông qua một tập hợp hay một mảng
Vòng lặp foreach được sử dụng để lặp qua tất cả các thành phần của một mảng hoặc tập hợp theo thứ tự sắp xếp Khi đến phần tử cuối cùng trong tập hợp, chương trình sẽ tự động thoát khỏi vòng lặp này.
Ví dụ 1.14: Tính tổng các số lẻ trong mảng A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} for ( [phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp])
} static void Main(string[] args) { int i, tong = 0; for(i=1; i < 10; i=i+2) tong = tong + i;
} foreach ( in < tên tập hợp>)
} static void Main(string[] args) { int[] intArray = {0,1,2,3,4,5,6,7,8,9,10}, tong = 0; foreach( int item in intArray) { if (item % 2 != 0) tong = tong + item;
Lớp String
1.7.1 Giới thiệu về chuỗi ký tự
Trong C#, chuỗi được xem như một kiểu dữ liệu cơ bản, mang lại sự linh hoạt, mạnh mẽ và dễ sử dụng Chỉ mục của chuỗi bắt đầu từ số 0, và để thao tác với chuỗi, C# sử dụng lớp System.String Khi khai báo một chuỗi bằng từ khóa string, người dùng thực chất đang tạo ra một đối tượng thuộc lớp System.String.
Ví dụ 1.15: string chuoi=“hello”;
Ngoài việc, ta cũng có thể khởi tạo chuỗi từ 1 mảng char:
// Khởi tạo mảng ký tự char[] chars = {'c', 's', 'h', 'a', 'r', 'p'};
// Khởi tạo chuỗi từ mảng ký tự string str = new string(chars);
Khi gán giá trị trong chuỗi có thể chứa ký tự escape: „\n‟, „\t‟, „\a‟, …
Ví dụ 1.17: string newString = “Day la chuoi \n trich dan”;
Trong trường hợp muốn lưu đường dẫn thư mục vào một chuỗi:
Ví dụ 1.18: string path = “ c:\baitap”;
Do đó muốn trình biên dịch hiểu „\b‟ như những ký tự thông thường thì người dùng phải thêm một ký tự „\‟ phía trước:
Ví dụ 1.19: string path = “ c:\\baitap”;
Ngoài việc sử dụng dấu \ để giữ nguyên các ký tự trong chuỗi, chúng ta có thể khai báo chuỗi dưới dạng chuỗi nguyên văn bằng cách thêm ký tự @ ở phía trước chuỗi.
Ví dụ 1.20: string path = @“D:\soft\VMWare”
Trình biên dịch báo lỗi, vì không hiểu ký tự escape „\b‟
1.7.2 Phương thức và thuộc tính lớp String
Bảng 1.4: Bảng tổng hợp các phương thức lớp String
Phương thức/ Thuộc tính Ý nghĩa
Empty Thuộc tính tĩnh; Thể hiện chuỗi rỗng
Compare() Phương thức tĩnh; So sánh hai chuỗi
Các phương thức tĩnh của chuỗi trong lập trình bao gồm CompareOrdinal(), dùng để so sánh hai chuỗi mà không quan tâm đến thứ tự; Concat(), cho phép tạo ra chuỗi mới từ một hoặc nhiều chuỗi khác; và Copy(), giúp tạo chuỗi mới bằng cách sao chép từ chuỗi hiện có Phương thức Equal() kiểm tra xem hai chuỗi có cùng giá trị hay không, trong khi Insert() trả về chuỗi mới với một chuỗi xác định được chèn vào LastIndexOf() chỉ ra vị trí xuất hiện cuối cùng của chuỗi xác định trong chuỗi ban đầu Để canh lề, PadLeft() chèn khoảng trắng hoặc ký tự vào bên trái, trong khi PadRight() thực hiện tương tự ở bên phải Cuối cùng, phương thức Remove() cho phép xóa đi một số ký tự xác định từ chuỗi.
Hàm Split() trả về chuỗi được phân tách theo các ký tự xác định trong chuỗi, trong khi hàm StartWith() kiểm tra xem chuỗi có bắt đầu bằng một số ký tự nhất định hay không.
SubString() Lấy một chuỗi con
Phương thức ToCharArray() cho phép sao chép các ký tự từ một chuỗi vào một mảng ký tự Trong khi đó, ToLower() trả về một bản sao của chuỗi với tất cả ký tự được chuyển sang chữ thường, và ToUpper() cung cấp một bản sao của chuỗi với tất cả ký tự được chuyển sang chữ hoa.
Phương thức tĩnh Format() được sử dụng để định dạng một chuỗi dựa trên các ký tự lệnh định dạng đã xác định Trong khi đó, phương thức tĩnh Join() cho phép kết nối các chuỗi lại với nhau, ngăn cách mỗi thành phần của mảng chuỗi bằng một ký tự xác định.
Length Trả về chiều dài của chuỗi
CompareTo() So sánh hai chuỗi
Hàm CopyTo() cho phép sao chép một số ký tự xác định vào một mảng ký tự Unicode Hàm EndsWith() xác định vị trí của chuỗi phù hợp với chuỗi đã cho Hàm Trim() giúp xóa bỏ tất cả khoảng trắng trong chuỗi, trong khi TrimEnd() chỉ xóa các khoảng trắng ở cuối chuỗi.
TrimStart() Xóa các khoảng trắng ở vị trí đầu
Thuộc tính Empty: Đại diện cho 1 chuỗi rỗng Sử dụng khi muốn khai báo 1 chuỗi là rỗng
Ví dụ 1.21: string chuoi = string.Empty;
Khi ta khai báo như trên nghĩa là tương đương với khai báo: string chuoi = “”;
Thuộc tính Length: Dùng để xác định chiều dài của chuỗi
Ví dụ 1.22: static void Main(string[] args) { string str = "pham phuong nguyen"; int chieudai = str.Length;
Nhóm các phương thức so sánh chuỗi: Compare, CompareOrdinal, CompareTo, Equal
- Phương thức Compare: Phương thức tĩnh so sánh hai chuỗi
Nếu gt = 0: hai chuỗi bằng nhau
Nếu gt = 1: chuỗi 1 lớn hơn chuỗi 2
Nếu gt = -1: chuỗi 1 nhỏ hơn chuỗi 2
Khi sử dụng phương thức mà không có tham số true, hệ thống sẽ phân biệt giữa chữ thường và chữ hoa Ngược lại, nếu có tham số true, việc phân biệt này sẽ không còn nữa.
The CompareOrdinal method in C# is used to compare two strings, returning an integer value that indicates their relative order It sequentially checks each character from the start to the end of the strings, calculating the ASCII values of any differing characters to determine the result For example, using `String.Compare("abDb", "abdb")` yields a result of 1, while `String.Compare("abDb", "abdb", true)` returns 0, indicating a case-insensitive comparison Additionally, comparing "abdaF" with "abdb" results in -1, showing that the first string precedes the second in order.
- Phương thức so sánh chuỗi CompareTo: Phương thức thành viên lớp, giúp so sánh 2 chuỗi và trả về 1 giá trị kiểu int
Nếu gt = 0: hai chuỗi bằng nhau
Nếu gt = 1: chuỗi 1 lớn hơn chuỗi 2
Nếu gt = -1: chuỗi 1 nhỏ hơn chuỗi 2
Phương thức so sánh chuỗi Equal được sử dụng để xác định xem hai chuỗi ký tự có giống nhau hay không Nếu hai chuỗi hoặc ký tự giống nhau, phương thức này sẽ trả về giá trị true; ngược lại, nếu không giống nhau, nó sẽ trả về giá trị false.
Nếu sử dựng phương thức không chỉ định tham số StringComparisonType thì sẽ so sánh từng ký tự một giữa hai chuỗi và phân biện hoa thường
To perform case-insensitive string comparisons in C#, use the `StringComparison.OrdinalIgnoreCase` parameter For example, `int result = String.CompareOrdinal("abcd", "aBcd");` will yield a comparison result of 0, indicating equality You can also compare strings of different lengths, such as `String.CompareOrdinal("abcd", "aBcdefg");`, which will return a negative value Additionally, the method `String.Equal(str1, str2, [StringComparisonType])` can be utilized for more flexible comparison options.
Nhóm phương thức nối chuỗi và chèn chuỗi: Concat, Join, Inser
- Phương thức Concat: Phương thức tĩnh Concat dùng để nối hai hay nhiều chuỗi lại với nhau và trả về 1 chuỗi mới
- Phương thức Join: dùng để nối 1 mảng chuỗi lại với nhau, giữa các phần tử có thể chèn thêm 1 chuỗi nào đó để phân cách
The Insert method, a class method, allows for the insertion of a string at a specified position within another string In the provided code example, two strings, "ITlab" and "itlac," are compared using the String.Equals method with a case-insensitive comparison If the strings are identical, a message box displays "The strings are the same"; otherwise, it shows "The strings are not the same."
} string = String.Concat(,); public static void Main(string []args) { string chuoi1=“abc”; string chuoi2=“aBc”; string kq = String.Concat(chuoi1,chuoi2); //kq = “abcaBc”
} string = String.Join(,); public static void Main(string []args) { string[] chuoi = { "mot", "hai", "ba" }; string str = String.Join(" -", chuoi);
Nhóm phương thức kiểm tra và định vị: Contain, StartsWith, EndsWith, IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny
Phương thức Contain là một phương thức thuộc lớp, cho phép tìm kiếm một từ hoặc chuỗi bất kỳ trong một chuỗi khác Nếu từ hoặc chuỗi được tìm thấy, phương thức sẽ trả về giá trị true; ngược lại, nếu không tìm thấy, nó sẽ trả về false.
Phương thức Contain trong lập trình cho phép kiểm tra xem chuỗi thứ hai (chuoi2) có xuất hiện trong chuỗi thứ nhất (chuoi1) hay không Lưu ý rằng việc tìm kiếm này phân biệt giữa ký tự hoa và ký tự thường.
Phương thức StartsWith thuộc lớp, được sử dụng để kiểm tra xem một chuỗi có bắt đầu bằng một số ký tự nhất định hay không Phương thức này trả về kiểu dữ liệu Boolean, với giá trị true hoặc false.
Mảng
Mảng là một tập hợp có thứ tự của các đối tượng cùng kiểu, với cú pháp khai báo kết hợp giữa C và định nghĩa lớp của C# Nhờ đó, các đối tượng trong mảng có thể truy cập các phương thức và thuộc tính của lớp System.Array.
Ví dụ 1.52: Khai báo mảng số nguyên có 100 phần tử int [] mang = new int[100];
Hoặc có thể khai báo mảng đồng thời khởi tạo giá trị cho các phần tử mang:
Lưu ý: khi khởi tạo mảng bẳng toán tử new thì các phần tử của mảng sẽ mang giá trị mặc định như bảng 1.5 sau:
Bảng 1.5: Bảng mô tả các giá trị mặc định của kiểu dữ liệu
Kiểu dữ liệu Giá trị mặc định int, long, byte, … 0 bool false char „\0‟ (null) enum 0 reference null
Để truy cập các phần tử trong mảng, bạn cần sử dụng toán tử chỉ mục [] Lưu ý rằng phần tử đầu tiên trong mảng có chỉ số là 0.
Ngoai ra C# hỗ trợ thuộc tính Length để xác định chiều dài của mang
Ví dụ 1.53: Tính tổng các phần tử của mảng A = {1, 2, 3, 4, 5}
[] = new [];
[] = {, , , …., }; public static void Main(string []args)
{ int[] mang={1,2,3,4,5,6}; int tong = 0; for(int i=0; i Project như hình 1.8
Hình 1.8: Tạo mới dự án
The ordinal abc could not be located in the dynamic-link library xyz.dll
Bước 2: Chọn loại dự án là Class Library và đặt tên “LoiChao” cho tập tin DLL
Hình 1.9: Chọn loại dự án và đặt tên dự án
Bước 3: Giao diện soạn thảo mã lệnh được hiển thị, tiến hành viết mã lệnh như hình 1.10
Hình 1.10: Giao diện soạn thảo mã lệnh
Để hoàn thành việc tạo tập tin DLL, bạn cần nhấn F5 để biên dịch dự án Tập tin DLL sẽ được tạo và lưu trữ trong thư mục Bin của dự án.
Bước 1: Chọn loại dự án
Bước 2: Đặt tên dự án
1.9.3 Các bước để sử dụng tập tin DLL
Bước 1: Tạo dự án mới như hình 1.11
Hình 1.11: Tạo dự án mới
Bước 2: Bên cửa sổ Solution Explorer, nhấp phải chuột vào References và chọn Add References để thêm *.DLL vào dự án này như hình 1.12
Hình 1.12: Thêm tập tin DLL vào dự án
Bước 3: Sử dụng tập tin DLL
Bước 1:Chọn loại dự án Windows Forms Application
Bước 2: Đặt tên dự án và chọn đường dẫn lưu trữ
Bước 1: Nhấp phải chuột vào References và chọn Add References
Bước 2: Trên cửa sổ Add Reference chọn tab Browse
Bước 3: Tìm đến đường dẫn chứa tập tin DLL
Bước 4: chọn tập tin DLL
Ví dụ: Xây dựng tập tin DLL hỗ trợ giải phương trình bậc hai
Bước 1: Tao dự án loại Class Library và đặt tên là Giai_phuong_trinh_bac_hai như hình 1.14
Hình 1.14: Tạo dự án Class Library
Khai báo không gian tên của DLL
Khai báo đối đượng và sử dụng phương thức trong DLL
Bước 2: Viết mã lệnh cho điều khiển using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Giai_phuong_trinh_bac_hai
{ int a, b, c; public int C { get { return c; } set { c = value; } } public int B { get { return b; } set { b = value; } } public int A { get { return a; } set { a = value; } } public string TimNghiem()
Để giải phương trình bậc hai ax² + bx + c, ta tính delta bằng công thức b² - 4ac Nếu a khác 0, có ba trường hợp xảy ra: nếu delta nhỏ hơn 0, phương trình không có nghiệm; nếu delta bằng 0, phương trình có nghiệm kép x1 = -b / (2a); nếu delta lớn hơn 0, ta tính hai nghiệm x1 và x2 bằng công thức x1 = (-b - √delta) / (2a) và x2 = (-b + √delta) / (2a).
} else ketqua = "Đây không phải là phương trình bậc hai"; return ketqua;
Bài tập cuối chương
Bài 1: Tạo tập tin thư viện tên ToaDo.DLL, hỗ trợ cộng và trừ hai tọa độ
Bài 2: Tạo tập tin thư viện tên PhanSo.DLL, hỗ trợ cộng, trừ, nhân, chia hai phân số
Bài 3: Tạo tập tin thư viện tên PTB1.DLL, hỗ trợ người sử dụng giải phương trình bậc nhất: ax + b = 0
Bài 4: Tạo tập tin thư viện tênPTB4.DLL, hỗ trợ người sử dụng giải phương trình trùng phương: ax 4 + bx 2 + c = 0
Bài 5: Tạo tập tin thư viện tên HePTB1.DLL, hỗ trợ người sử dụng giải hệ phương trình bậc nhất hai ẩn số:
Giới thiệu về Windows Forms
Giới thiệu
Windows Forms là nền tảng ứng dụng cơ bản của Microsoft, cho phép lập trình viên dễ dàng tạo ra các form Nền tảng này hỗ trợ nhiều điều khiển và thành phần, giúp xây dựng và tùy chỉnh giao diện form một cách nhanh chóng Lập trình viên có thể tạo ra các form với kích thước và hình dạng khác nhau, đồng thời bố trí các điều khiển và thành phần phù hợp với nhu cầu và mục đích sử dụng của người dùng.
Windows Forms cung cấp nhiều sự kiện cho các điều khiển, giúp lập trình viên tương tác hiệu quả với thiết bị Các sự kiện này bao gồm sự kiện ấn nút bàn phím, nhấp chuột và ấn tổ hợp phím, cho phép sử dụng linh hoạt trong phát triển ứng dụng.
Tạo một dự án Windows Forms: Để tạo một dự án Windows Forms với C#, cần thực hiện một số bước sau :
Bước 1: Sau khi cài xong Micorsoft Visual Studio 2010, tiến hành bật ứng dụng Visual Studio 2010 lên bằng cách nhấp vào biểu tượng như hình 2.1:
Hình 2.1: Mở ứng dụng Visual Studio 2010
Bước 2: Sau khi đã chọn biểu tượng Visual Studio 2010 giao diện như hình 2.2 sẽ được hiển thị:
Hình 2.2: Giao diện ứng dụng Visual Studio 2010
Bước 3: Chọn Menu File > New > Project
Hình 2.3: Giao diện tạo dự án mới
Sau khi hoàn thành bước 3, cửa sổ New Project sẽ xuất hiện, cho phép lập trình viên chọn ngôn ngữ lập trình và loại ứng dụng Ở đây, lập trình viên chọn ngôn ngữ Visual C# và loại ứng dụng Windows Forms Tiếp theo, lập trình viên cần đặt tên cho dự án và xác định đường dẫn lưu trữ dự án.
Hình 2.4: Cửa sổ New Project
Sau khi hoàn thành việc tạo dự án, một form mặc định tên là Form1 sẽ tự động được thêm vào dự án, như hình 2.5 Lập trình viên có thể tiến hành thiết kế giao diện cho Form1 bằng cách thêm các thành phần cần thiết phù hợp với yêu cầu của phần mềm.
Hình 2.5: Giao diện chính của dự án Windows Forms
Chọn ngôn ngữ lập trình
Chọn loại ứng dụng Đặt tên cho dự án
Chọn đường dẫn lưu dự án
Giao diện ban đầu của form
Thêm form mới vào dự án:
Trong các dự án phần mềm, việc thêm form mới là rất phổ biến Lập trình viên có thể thực hiện điều này tại thời điểm thiết kế bằng cách vào menu Project và chọn Add Windows Form Hộp thoại Add New Item sẽ xuất hiện, cho phép chọn Windows Form và đặt tên cho form mới Cuối cùng, nhấp Add để hoàn tất việc thêm form vào dự án phần mềm.
Để thêm một Form mới sau khi thiết kế giao diện hoàn tất, lập trình viên cần viết mã chương trình để tạo form Sau đó, form mới sẽ được tạo ra và hiển thị khi chương trình được thực thi.
Khái báo đối tượng thuộc lớp Form như sau:
Form form1; form1 = new Form();
Để hiển thị Form trong quá trình thực thi chương trình, bạn có thể sử dụng phương thức Show() hoặc ShowDialog(), ví dụ: form1.Show(); và đặt tên cho Form mới Hãy chọn loại Windows Form để thực hiện.
Namespace, hay không gian tên, đóng vai trò quan trọng trong việc ngăn chặn xung đột tên lớp trong các dự án Nó giúp phân nhóm các lớp có chức năng tương tự, từ đó dễ dàng quản lý mã nguồn Ví dụ, trong C#, lớp Console được tạo ra để làm việc với màn hình Console, chứa các thuộc tính và phương thức chuyên dụng, và lớp này được đặt trong không gian tên System.
Không gian tên tổ chức được phân cấp giống như cấu trúc cây thư mục, cho phép chứa nhiều lớp khác nhau Trong cùng một không gian tên, các lớp phải có tên khác nhau để tránh trùng lặp Hình 2.7 minh họa sự phân cấp của không gian tên một cách rõ ràng.
Không gian tên System chứa không gian tên Data;
Không gian tên Data chứa không gian tên Oracle và SqlClient;
Trong không gian tên SqlClient chứa nhiều lớp khác tên nhau như: lớp SqlCommand, lớp SqlConnection, …
Hình 2.7: Tổ chức phân cấp của không gian tên trong C#
Sử dụng không gian tên:
C# cung cấp nhiều lớp đối tượng được tổ chức trong các không gian tên khác nhau để hỗ trợ lập trình Để khai thác các không gian tên này trong C#, bạn cần sử dụng từ khóa "using".
Ví dụ 2.1: using System; using System.Windows.Forms;
When creating a Windows Application project, it automatically incorporates eight default namespaces: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; and using System.Drawing.
SqlCommand using System.Linq; using System.Text; using System.Windows.Forms; Ý nghĩa của các không gian tên như sau:
- Không gian tên System: Chứa các lớp và các kiểu dữ liệu cơ sở (int, double, byte, short, …)
- Không giam tên System.Data: Chứa các lớp của ADO.NET, các lớp giúp kết nối hoặc thao tác với cơ sở dữ liệu (SQL Server, Oracle, Microsoft Access)
- Không gian tên System.Drawing: Chứa các lớp làm việc với đồ họa
System.ComponentModel là một không gian tên quan trọng, bao gồm các lớp cơ sở và giao diện cần thiết cho việc thực thi chuyển đổi kiểu, quản lý thuộc tính, liên kết dữ liệu nguồn và hỗ trợ các thành phần cấp phép.
- Không gian tên System.Collections.Generic: Chứa các lớp hỗ trợ cho việc thiết lập các tập hợp dạng chung mẫu (template) như:
ArrayList List: Tập hợp chung mẫu có thể thay đổi kích thước khi vận hành
Queue Queue: Tập hợp chung mẫu theo mô hình vào trước ra trước(FIFO)
Stack Stack: Tập hợp chung mẫu theo mô hình vào sau ra trước (LIFO)
- Không gian tên System.Text: Cung cấp các lớp giúp mã hóa các ký tự Ascii hoặc Unicode
- Không gian tên System.Linq: Cung cấp các lớp hỗ trợ cho việc sử dụng ngôn ngữ truy vấn tích hợp (Language-Integrated Query – LinQ)
Không gian tên System.Windows.Forms là không gian tên chính cung cấp các lớp cần thiết để phát triển ứng dụng kiểu Windows Application Nó được chia thành nhiều nhóm khác nhau, mỗi nhóm phục vụ cho các mục đích và chức năng cụ thể trong quá trình xây dựng ứng dụng.
Menu, toolbar: ToolStrip, MenuStrip, ContextMenuStrip, StatusStrip
Controls: TextBox, ComboBox, ListBox, ListView, WebBrowser, Label, …
Layout: FlowLayoutPanel, TableLayoutPanel, … Giúp trình bày các điều khiển trên form
Data và DataBinding: Gồm các công cụ BindingNavigator, BindingSource, … giúp liên kết dữ liệu từ cơ sở dữ liệu đến các điều khiển Dataset hoặc DataGridView
Command Dialog Boxes: Gồm các điều khiển OpenFileDialog, SaveFielDialog, ColorDialog, FontDialog, PrintDialog làm việc với tập tin, màu sắc, phông chữ, in ấn
Danh sách các Component/Control được phân loại theo nhóm giúp lập trình viên dễ dàng kéo thả vào form để thiết kế giao diện chương trình Sau khi hoàn thành dự án, giao diện chính sẽ hiển thị như hình 2.8, với thanh công cụ nằm ở phía bên trái.
Ngoài những điều khiển hiển thị mặc định trong thanh công cụ, lập trình viên cũng có thể thêm các thành phần mới vào bằng các chọn Project/AddReference
Hình 2.8: Giao diện chính với thanh công cụ bên trái
Nếu giao diện chính không hiển thị thanh công cụ, lập trình viên có thể hiển thị bằng cách chọn View/ Toolbox như hình 2.9
Hình 2.9: Hiển thị thanh công cụ
Thanh công cụ bố trí các điều khiển thành những nhóm riêng biệt như hình 2.10:
Hình 2.10: Thanh công cụ Với việc phân loại các điều khiển theo nhóm giúp cho lập trình viên dễ dàng tìm kiếm điều khiển cần sử dụng hơn
Chứa các điều khiển giúp trình bày các điểu khiển khác trên form
Chứa các điều khiển thông dụng như: TextBox, Label,
Chứa các điều khiển giúp làm việc với cơ sở dữ liệu
Chứa các điều khiển giúp kiểm tra dữ liệu nhập như: ErrorProvider, HelpProvider
Chứa các điều khiển giúp tạo thanh thực đơn và thanh trạng thái: MenuStrip, StatusStrip
Chứa các điều khiển giúp làm việc với việc in ấn: PrintDialog,
Chứa các điều khiển làm việc với báo cáo
Chứa các điều khiển làm việc với tập tin
Chứa điều khiển cho phép đặt điều khiển của WPF trong cửa sổ Windows Form:
ElemenHost Chứa điều khiển cho phép vẽ các hình ô vuông, hình tròn, trên form, hoặc in form
2.1.4 Định dạng mã C# Để định dạng mã lệnh khi lập trình Lập trình viên của thể tùy chỉnh lại định dạng mã trong cửa sổ Option Đầu tiên bật cửa sổ Option bằng cách chọn Tools/
Hình 2.11: Giao diện cửa sổ Option
Sau khi đã mở cửa sổ Option, chọn mục Evironment/ Fonts and Colors như hình 2.12 để định dạng lại mã lệnh:
Hình 2.12: Giao diện định dạng mã lệnh
Các loại Form
Thiết lập giá trị thuộc tính form trong cửa sổ Properties:
Mục muốn định dạng như: chú thích, chuỗi văn bản, từ khóa, …
Windows Forms cung cấp nhiều thuộc tính cho việc tùy chỉnh giao diện form Lập trình viên có khả năng thay đổi các thuộc tính này thông qua cửa sổ Properties, cho phép điều chỉnh kích thước, màu sắc, font chữ và nhiều yếu tố khác để phù hợp với yêu cầu thiết kế.
Hình 2.13: Giao diện cửa sổ Properties
Bảng 2.1 mô tả một số thuộc tính thường sử dụng trong việc thiết kế form
Bảng 2.1: Bảng mô tả thuộc tính Form
Giá trị thuộc tính AcceptButton trong một form là tên của nút bấm Khi thiết lập thuộc tính này, người dùng có thể thực hiện lệnh bằng cách nhấn phím Enter trên bàn phím thay vì phải nhấp chuột vào nút.
Backcolor Thiết lập màu nền của form
BackgroundImage Thiết lập hình nền cho form
BackgroundImageLayout Thiết lập việc hiển thị hình vừa thêm trong thuộc tính BackgroundImage sẽ hiển thị trên form ở dạng: bình thường (None), giữa (Center), …
Giá trị thuộc tính CancelButton là tên của một nút trên form, cho phép người dùng thực hiện hành động bằng cách nhấn phím Escape trên bàn phím thay vì phải nhấp chuột vào nút đó.
ControlBox Mang giá trị true hoặc false Nếu thiết lập thuộc tính là false thì sẽ loại bỏ các nút minimize và nút maximize trên form
Cusor Thiết lập hình dạng con trỏ khi di chuyển con trỏ vào form
Enable Mang giá trị true hoặc false; Nếu thiết lập thuộc tính là false thì điều khiển trong form sẽ không cho phép người dùng thao tác
Font Thiết lập văn bản hiển thị trên điều khiển
ForeColor Thiết lập màu mặc định cho chuỗi của các điều khiển trên form
FormBorderStyle Thiết lập đường viền của form và hành vi của form khi chạy chương trình
Thuộc tính HelpButton có giá trị true hoặc false; khi thiết lập thành true, một nút có dấu ? sẽ xuất hiện trên thanh tiêu đề, nhưng nút này chỉ hiển thị khi cả hai thuộc tính MinimizeBox và MaximizeBox được thiết lập.
MaximizeBox được thiết lập là false)
Icon Biểu tượng hiển thị bên trái trên thanh titlebar của form
KeyReview Mang giá trị true hoặc false: nếu thiết lập thuộc tính là true cho phép các sự kiện bàn phím của form có hiệu lực
Location Khi thuộc tính StartPosition được thiết lập là Manual, thì thuộc tính Location có tác dụng thiết lập vị trí hiển thị của form trên màn hình
MaximizeBox Mang giá trị true hoặc false: nếu thiết lập thuộc tính là false thì nút maximize form trên thanh titlebar sẽ mất đi
MaximumSize Thiết lập kích thước lớn nhất của form
MinimizeBox Mang giá trị true hoặc false: nếu thiết lập thuộc tính là false thì nút minimize form trên thanh titlebar sẽ mất đi
MinimumSize Thiết lập kích thước nhỏ nhất của form
Opacity Thiết lập độ trong suốt cho form
StartPosition Vị trí hiển thị của form trên màn hình
Text Chuỗi văn bản hiển thị trên titlebar của form
TopMost Mang giá trị true hoặc false: nếu thiết lập thuộc tính là true thì form sẽ luôn hiển thị trên các cửa sổ khác
Giá trị của thuộc tính Visible Mang có thể là true hoặc false: nếu được thiết lập là true, form sẽ hiển thị trên màn hình; ngược lại, nếu là false, form sẽ không hiển thị.
WindowState Có 3 giá trị: Normal: hiển thị form bình thường; Minimized: khi chạy chương trình form sẽ bị thu nhỏ dưới thanh taskbar;
Maximized: form hiển thị có kích thước đầy màn hình
IsMDIContainer Mang giá trị True hoặc False
- Nếu là True: Form ở dạng MDI Form
- Nếu là False: Form ở dạng bình thường
MdiParent mang giá trị là đối tượng MDI Form Khi thiết lập giá trị cho thuộc tính MdiParent thì form sẽ trở thành Child Form
Thiết lập giá trị thuộc tính form bằng mã lệnh:
Ngoài việc thiết kế form thông qua việc thiết lập các giá trị trong cửa sổ properties, lập trình viên còn có thể thiết lập giá trị thuộc tính của form bằng cách sử dụng mã lệnh.
- Thay đổi chuỗi văn bản hiển thị trên titlebar bằng cách thiết lập giá trị cho thuộc tính Text:
- Thiết lập kích thước form: Có thể thiết lập giá trị cho thuộc tính Width và thuộc tính Height để quy định chiều rộng và chiều cao cho form
Form1.Text = “Đây là Form1”; hoặc:
Note: If the StartPosition property is set to WindowsDefaultBounds, the form will adopt the default size If the StartPosition is assigned a different value, the form's size will be determined by the Size property settings.
- Thiết lập độ trong suốt cho form:
To set the initial display position of a form on the screen, utilize the StartPosition property This property allows you to define the starting location of the form effectively.
StartPosition là một trong các giá trị quy định sẵn trong biến kiểu liệt kê FormStartPosition:
Bảng 2.2: Mô tả các giá trị của FormStartPosition
Manual Nếu StartPosition mang giá trị Manual thì vị trí form hiển thị sẽ là vị trí thiết lập tại thuộc tính
CenterScreen Form hiển giữa màn hình
Form hiển thị tại vị trí mặc định với kích thước form sẽ là kích thước form được thiết lập tại thuộc tính Size
WindowsDefaultBounds Form hiển thị tại vị trí mặc định với kích thước form sẽ là kích thước mặc định CenterParent Form hiển thị ở vị trí giữa form cha
Ví dụ 2.2: Hiển thị Form1 ở vị trí giữa màn hình
Thiết lập form hiển thị:
Trong C#, lập trình viên có thể chỉ định form hiển thị đầu tiên khi dự án được thực thi bằng cách chỉnh sửa mã trong hàm main của lớp Program.
Lớp Program bao gồm một hàm chính là hàm Main Khi dự án được thực thi, mã lệnh trong hàm Main sẽ được thực hiện trước tiên.
Dòng lệnh xác định rằng Form1 sẽ là form đầu tiên hiển thị Do đó, lập trình viên chỉ cần chỉnh sửa mã lệnh để chỉ định một form khác bằng cách thay thế tên Form1 bằng tên của form mong muốn.
Ví dụ 2.3: Hiển thị form có tên Form2 trong dự án
Trong ứng dụng Windows Forms, có 3 loại form: form bình thường (Normal
Form), form cha (Mdi Form), form con (Child Form)
Mdi Form là form có thể chứa các Child Form bên trong Để làm được công việc đó thì form phải được thiết lập thuộc tính:
Developers can set the IsMdiContainer property in the Properties window on the form design screen or through code Once the property is configured, it enables the form to act as a container for multiple child forms, enhancing the application's user interface and functionality.
IsMdiContainer là True thì hình dạng form sẽ thay đổi như hình 2.15
Lớp Program mặc định được tao ra trong dự án
Các đoạn mã mặc định trong lớp Program
Hình 2.15: Hình dạng form khi chuyển từ Normal Form sang Mdi Form
Child Form là một loại form nằm trong vùng làm việc của Mdi Form, tức là nó được chứa bên trong Mdi Form Để một form trở thành Child Form, lập trình viên cần khai báo thuộc tính MdiParent với giá trị là đối tượng của Mdi Form Lưu ý rằng thuộc tính MdiParent không hiển thị trong cửa sổ Properties, vì vậy lập trình viên phải thiết lập giá trị này thông qua mã lệnh.
Ví dụ 2.4: Viết chương trình biểu diễn Mdi Form và Child Form như hình 2.16
Hình 2.16: Mdi Form và Child Form
Bước 1: Tạo một dự án mới bằng C#, loại dự án là Windows Forms Application Giao diện đầu tiên của chương trình hiển thị Form1 như hình 2.17
Hình 2.17: Giao diện Form1 khi tạo dự án
Bước 2: Viết mã lệnh cho chương trình
Tại sự kiện Load của Form1 viết các dòng lệnh sau:
Bước 3: Nhấn Ctrl + Shift + B để biên dịch mã nguồn và nhấn F5 để thực thi chương trình sẽ được Mdi Form và Child Form như hình 2.16
Normal Form là loại form hoạt động độc lập, không chứa hoặc bị chứa bởi bất kỳ form nào khác Khi tạo một dự án Windows Forms Application mới, form mặc định được tạo và hiển thị đầu tiên là Normal Form Giao diện của Normal Form được minh họa trong hình 2.17.
2.2.3 Các hình dạng của Form
Mặc định, các form trong Windows Forms được tạo ra dưới dạng hình chữ nhật Để tạo form với hình dạng khác như hình tròn hoặc hình đa giác, lập trình viên cần thiết lập thuộc tính Region trong sự kiện Form_Load Tuy nhiên, hình dạng mới của form chỉ có thể được xem sau khi chạy ứng dụng, không thể thấy trong lúc thiết kế.
{ this.Text = "Mdi Form"; this.IsMdiContainer = true;
Form frm = new Form(); frm.Text = "Child Form"; frm.MdiParent = this; frm.Show();
Bài tập cuối chương
Để tạo và hiển thị một đối tượng Windows Form mới tên là Form1, mã lệnh đúng là: a) Form1 frm = new Form1(); frm.Show();
Form1.Show(); c) Form1 frm ; frm.Show(); d) Form frm; frm.Show(); e) Form Form1 = new Form();
In the context of setting display content on the title bar and configuring the background color of a form, the relevant properties are the Text property for the title bar and the BackColor property for the form's background.
//Tạo đối tượng lớp Form
//Thiết lập tiêu đề trên titlebar của form
Form2.Text = "Giao diện Form 2";
//Thiết lập vị trí hiển thị form
//Thiết lập màu nền cho form
//Kiểm tra giá trị trả về của phương thức ShowDialog() //nếu giá trị trả về là DialogResult.Cancel thì Form2 //đã đóng, tiến hành đóng Form1 bằng phương thức
//Close() if (Form2.ShowDialog() == DialogResult.Cancel)
} d) Thuộc tính Display và ForeColor
Câu 3: Các thuộc tính sau, thuộc tính nào cho phép thiết lập form trở thành Mdi Form a) IsMdiContainer b) MdiParent c) MdiContainer d) ParentForm
Câu 4: Các thuộc tính sau, thuộc tính nào cho phép thiết lập form trở thành Child Form a) IsMdiContainer b) MdiParent c) MdiContainer d) ParentForm
Câu 5: Trong các sự kiện sau, sự kiện nào sẽ phát sinh khi form đã đóng a) FormClosed b) FormClosing c) ClosedForm d) ClosingForm e) Load f) Click
Câu 6: Xây dựng form có dạng hình tam giác như hình 2.21:
Hình 2.21: Form hình dạng tam giác