7.1. Giới thiệu Windows Forms
Khái niệm: Windows Forms (WinForms) là một công nghệ (API) trong .NET Framework, cho phép tạo các ứng dụng desktop có giao diện đồ họa (GUI) chạy trên Windows.
Form (Biểu mẫu): Là cửa sổ chính của ứng dụng (ví dụ:
Form1). Nó là một “container” (vật chứa) để chứa tất cả các đối tượng điều khiển khác.Controls (Đối tượng điều khiển): Là các thành phần tương tác trên giao diện (ví dụ: nút bấm, ô nhập liệu).
7.2. Thuộc tính (Properties) và Sự kiện (Events)
Đây là 2 khái niệm cốt lõi của lập trình trực quan:
Thuộc tính (Properties): Là đặc điểm của đối tượng. Bạn thay đổi chúng trong cửa sổ
Propertieslúc thiết kế, hoặc thay đổi bằng mã lệnh lúc chạy.Ví dụ:
Text(Dòng chữ hiển thị),Name(Tên dùng để gọi trong code),Size(Kích thước),BackColor(Màu nền),Enabled(Cho phép/Vô hiệu hóa).
Sự kiện (Events): Là hành động mà người dùng (hoặc hệ thống) tác động lên đối tượng. Bạn viết phương thức xử lý sự kiện (event handler) để đáp ứng lại các hành động này.
Ví dụ:
Click(Xảy ra khi nhấn chuột vào Button),TextChanged(Xảy ra khi nội dung TextBox thay đổi),Load(Xảy ra khi Form được tải lên).
7.3.Các điều khiển thông thường (Common Controls)
Label (Nhãn):
Công dụng: Dùng để hiển thị văn bản tĩnh (người dùng không sửa được).
Thuộc tính chính:
Text.
TextBox (Ô nhập liệu):
Công dụng: Cho phép người dùng nhập và sửa văn bản.
Thuộc tính chính:
Name(ví dụ:txtUsername),Text(dùng để lấy hoặc gán giá trị).Sự kiện chính:
TextChanged.
Button (Nút bấm):
Công dụng: Kích hoạt một hành động khi người dùng nhấn vào.
Thuộc tính chính:
Name(ví dụ:btnDangNhap),Text(ví dụ: “Đăng nhập”).Sự kiện chính:
Click.
Ví dụ (Xử lý sự kiện Button Click):
C#
// Giả sử có 1 TextBox tên là 'txtHoTen' và 1 Button tên là 'btnChao' // Đây là phương thức xử lý sự kiện, được tạo tự động // khi bạn nhấp đúp vào Button trong giao diện thiết kế private void btnChao_Click(object sender, EventArgs e) { // 1. Lấy dữ liệu từ TextBox string hoTen = txtHoTen.Text; // 2. Xử lý logic string loiChao = "Xin chào " + hoTen; // 3. Hiển thị kết quả (dùng MessageBox) MessageBox.Show(loiChao, "Thông báo"); }
7.4. Điều khiển đặc biệt (Lựa chọn)
CheckBox (Hộp kiểm):
Công dụng: Cho phép chọn một hoặc nhiều tùy chọn (bật/tắt).
Thuộc tính chính:
Text,Checked(trả vềtruenếu được chọn,falsenếu không).
RadioButton (Nút chọn):
Công dụng: Cho phép chọn một tùy chọn duy nhất trong một nhóm (thường phải đặt trong
GroupBox).Thuộc tính chính:
Text,Checked.
ComboBox (Hộp chọn):
Công dụng: Cung cấp danh sách thả xuống để chọn.
Thuộc tính chính:
Items(để thêm các mục vào danh sách),Text(mục đang hiển thị),SelectedIndex(chỉ số của mục được chọn).
ListBox (Hộp danh sách):
Công dụng: Tương tự ComboBox nhưng hiển thị danh sách đầy đủ.
7.5. Các điều khiển khác
MenuStrip (Thanh menu): Dùng để tạo menu chính cho ứng dụng (ví dụ: File, Edit, View…).
Panel, GroupBox, TabControl (Điều khiển chứa đựng): Dùng để nhóm các điều khiển khác lại cho gọn gàng, logic.
MessageBox (Hộp thoại): Không phải là điều khiển kéo-thả, mà là một lớp dùng để hiển thị hộp thoại thông báo nhanh.
MessageBox.Show("Nội dung");
Dialogs (OpenFileDialog, SaveFileDialog…): Các điều khiển (kéo vào Form) dùng để mở hộp thoại chuẩn của Windows (chọn tệp, lưu tệp, chọn màu…).
Bài tập thực hành (4 giờ)
Bài tập 7.1: Xây dựng Form Đăng nhập
Tạo dự án Windows Forms Application mới tên
BaiTap5_DangNhap.Thiết kế giao diện (kéo-thả từ
Toolbox):2
Label(Text: “Tên đăng nhập:”, “Mật khẩu:”).2
TextBox(Name:txtUsername,txtPassword).(Nâng cao: Đặt thuộc tính
PasswordCharcủatxtPasswordthành*).2
Button(Name:btnDangNhap,btnThoat. Text: “Đăng nhập”, “Thoát”).
Hướng dẫn :
Bước 1: Tạo dự án (Windows Forms Application)
Đây là bước quan trọng nhất, chúng ta không tạo Console Application nữa.
Mở Visual Studio 2008.
Chọn menu File -> New -> Project….
Trong cửa sổ “New Project”:
Bên trái (Project types): Chọn Visual C#.
Bên phải (Templates): Chọn Windows Forms Application. 1
Ở ô Name: (Tên) bên dưới, gõ chính xác:
BaiTap5_DangNhapNhấn OK.
Visual Studio sẽ tạo dự án và mở ra một Form trống tên là Form1.cs [Design]. 2
Bước 2: Thiết kế giao diện (Kéo-thả)
Bây giờ chúng ta sẽ “vẽ” giao diện.
Mở Toolbox (Hộp công cụ):
Nhìn sang bên trái màn hình, tìm tab Toolbox.
Nếu không thấy, vào menu View -> Toolbox để mở nó ra. 3
Kéo-thả các đối tượng:
Tìm
Labeltrong Toolbox, kéo thả nó vàoForm1. Làm 2 lần (cho 2 Label).Tìm
TextBoxtrong Toolbox, kéo thả nó vàoForm1. Làm 2 lần (cho 2 TextBox).Tìm
Buttontrong Toolbox, kéo thả nó vàoForm1. Làm 2 lần (cho 2 Button).
Dùng chuột sắp xếp các đối tượng trên Form cho giống hình minh họa.
Bước 3: Thiết lập thuộc tính (Properties)
Đây là bước “đặt tên” và “thay đổi nhãn” cho các đối tượng bạn vừa kéo vào.
Cách làm: Nhấp chọn 1 đối tượng trên Form (ví dụ:
button1).Nhìn vào cửa sổ Properties (thường ở góc dưới bên phải).
Tìm thuộc tính
NamehoặcTextvà thay đổi giá trị.
Hãy làm lần lượt cho tất cả các đối tượng:
| Đối tượng | Thuộc tính cần đổi | Giá trị mới | Ý nghĩa |
label1 | Text | Tên đăng nhập: | Đặt lại nhãn hiển thị. |
label2 | Text | Mật khẩu: | Đặt lại nhãn hiển thị. |
textBox1 | (Name) | txtUsername | (Quan trọng) Đặt tên code. |
textBox2 | (Name) | txtPassword | (Quan trọng) Đặt tên code. |
PasswordChar | * | (Nâng cao) Ký tự che mật khẩu. | |
button1 | (Name) | btnDangNhap | (Quan trọng) Đặt tên code. |
Text | Đăng nhập | Đặt lại nhãn hiển thị. | |
button2 | (Name) | btnThoat | (Quan trọng) Đặt tên code. |
Text | Thoát | Đặt lại nhãn hiển thị. |
Ghi chú (Name) vs (Text):
(Name): Là tên dùng để gọi trong code (ví dụ:
txtUsername).Text: Là nội dung hiển thị ra cho người dùng thấy.
Bước 4: Viết mã nguồn (Xử lý sự kiện) (Chi tiết)
Bây giờ chúng ta sẽ làm cho các nút bấm “hoạt động”.
4.1. Viết code cho nút “Thoát”
Quay lại tab thiết kế
Form1.cs [Design].Nhấp đúp (double-click) vào nút Thoát (nút
btnThoatcủa bạn).Visual Studio sẽ tự động chuyển sang màn hình code (
Form1.cs) và tạo sẵn một hàm rỗng tên làbtnThoat_Click.Bạn chỉ cần gõ một dòng code vào bên trong hàm đó:
C#
private void btnThoat_Click(object sender, EventArgs e) { // Lệnh this.Close() dùng để đóng Form hiện tại (Form1) this.Close(); }
4.2. Viết code cho nút “Đăng nhập”
Quay lại tab thiết kế
Form1.cs [Design].Nhấp đúp (double-click) vào nút Đăng nhập (nút
btnDangNhapcủa bạn).Visual Studio sẽ tạo thêm một hàm rỗng nữa là
btnDangNhap_Click.Hãy gõ đoạn mã logic sau vào bên trong hàm đó:
C#
private void btnDangNhap_Click(object sender, EventArgs e) { // 1. Lấy dữ liệu từ 2 TextBox (dùng thuộc tính .Text) // Dùng tên (Name) mà bạn đã đặt ở Bước 3 string user = txtUsername.Text; string pass = txtPassword.Text; // 2. Kiểm tra logic (dùng if...else) if (user == "admin" && pass == "123") { // 3a. Nếu đúng -> Thông báo thành công [cite_start]// MessageBox là một hộp thoại thông báo [cite: 1577] MessageBox.Show("Đăng nhập thành công!", "Thông báo"); // (Sau này học, chúng ta sẽ mở Form chính ở đây) } else { // 3b. Nếu sai -> Thông báo lỗi MessageBox.Show("Sai tên đăng nhập hoặc mật khẩu!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Bước 5: Chạy và kiểm thử
Nhấn phím F5 (hoặc nút Start Debugging <img>) để chạy.
Form Đăng nhập của bạn sẽ xuất hiện.
Thử nghiệm 1 (Thành công):
Gõ
adminvào ô Tên đăng nhập.Gõ
123vào ô Mật khẩu (bạn sẽ thấy***).Nhấn nút “Đăng nhập” -> Sẽ hiện thông báo “Đăng nhập thành công!”.
Thử nghiệm 2 (Thất bại):
Gõ
adminvà555.Nhấn nút “Đăng nhập” -> Sẽ hiện thông báo “Sai tên đăng nhập hoặc mật khẩu!”.
Thử nghiệm 3 (Thoát):
Nhấn nút “Thoát” -> Chương trình sẽ đóng lại.
Bài tập 7.2: Xây dựng Máy tính đơn giản trên Windows Forms:
1. Mục tiêu bài tập
Xây dựng một ứng dụng giao diện (GUI) cho phép người dùng nhập vào 2 số, chọn một phép tính (Cộng, Trừ, Nhân, Chia) từ danh sách, sau đó nhấn nút để xem kết quả. Bài tập giúp rèn luyện kỹ năng sử dụng ComboBox, xử lý ngoại lệ (try...catch) và cấu trúc điều khiển switch...case.
2. Yêu cầu về Giao diện (GUI)
Bạn cần tạo một dự án Windows Forms Application tên là BaiTap5_MayTinh và thiết kế Form với các đối tượng sau:
Nhập liệu:
2 TextBox để nhập số A và số B. Đặt tên code (
Name) lần lượt làtxtSoAvàtxtSoB.1 ComboBox (hộp chọn) để chọn phép tính. Đặt tên là
cbPhepTinh.Yêu cầu đặc biệt: Trong thuộc tính
Itemscủa ComboBox, phải thêm sẵn 4 dòng: “Cộng”, “Trừ”, “Nhân”, “Chia”.
Điều khiển:
1 Button để thực hiện tính toán. Đặt tên là
btnTinh, văn bản hiển thị (Text) là “Tính”.
Hiển thị:
Các Label tiêu đề (ví dụ: “Số thứ nhất:”, “Số thứ hai:”, “Phép tính:”).
1 Label quan trọng để hiện kết quả. Đặt tên là
lblKetQua.
3. Yêu cầu về Mã lệnh (Logic)
Viết code cho sự kiện Click của nút “Tính” (btnTinh) đảm bảo các chức năng sau:
Lấy dữ liệu & Ép kiểu an toàn:
Lấy dữ liệu từ
txtSoAvàtxtSoB.Sử dụng khối
try...catchđể chuyển đổi dữ liệu sang kiểu số thực (double). Nếu người dùng nhập chữ, phải hiện thông báo lỗi “Vui lòng nhập số” và không làm gì tiếp theo.
Xử lý phép tính:
Lấy giá trị phép tính đang được chọn trong
cbPhepTinh.Sử dụng cấu trúc
switch...caseđể kiểm tra phép tính là “Cộng”, “Trừ”, “Nhân” hay “Chia” và thực hiện lệnh toán học tương ứng.
Xử lý lỗi nghiệp vụ:
Nếu phép tính là “Chia” và số thứ hai (
txtSoB) là 0, phải hiện thông báo lỗi “Không thể chia cho 0” và dừng lại.Nếu người dùng chưa chọn phép tính nào trong ComboBox, hiện thông báo nhắc nhở.
Xuất kết quả:
Hiển thị kết quả tính toán cuối cùng lên
lblKetQua(ví dụ: “Kết quả: 15.5”).
Hướng dẫn làm bài
Bước 1: Tạo dự án (Windows Forms Application)
Mở Visual Studio 2008.
Chọn menu File -> New -> Project….
Trong cửa sổ “New Project”:
Bên trái (Project types): Chọn Visual C#.
Bên phải (Templates): Chọn Windows Forms Application.
Ở ô Name: (Tên) bên dưới, gõ chính xác:
BaiTap5_MayTinhNhấn OK.
Bước 2: Thiết kế giao diện (Kéo-thả)
Mở Toolbox (Hộp công cụ) (vào menu View -> Toolbox nếu bị ẩn).
Kéo-thả các đối tượng sau vào
Form1:3
Label.2
TextBox.1
ComboBox(Đây là hộp chọn thả xuống).1
Button.
Dùng chuột sắp xếp các đối tượng trên Form cho hợp lý (xem hình minh họa).
Bước 3: Thiết lập thuộc tính (Properties)
Đây là bước quan trọng, đặc biệt là cách thêm các mục (Items) cho ComboBox.
Cách làm: Nhấp chọn 1 đối tượng trên Form.
Nhìn vào cửa sổ Properties (góc dưới bên phải).
Tìm thuộc tính
NamehoặcTextvà thay đổi giá trị.
Hãy làm lần lượt cho tất cả các đối tượng:
| Đối tượng | Thuộc tính cần đổi | Giá trị mới | Ý nghĩa |
label1 | Text | Số a: | Nhãn cho ô số a. |
label2 | Text | Số b: | Nhãn cho ô số b. |
label3 | Text | Phép tính: | Nhãn cho hộp phép tính. |
textBox1 | (Name) | txtSoA | (Quan trọng) Tên code. |
textBox2 | (Name) | txtSoB | (Quan trọng) Tên code. |
comboBox1 | (Name) | cbPhepTinh | (Quan trọng) Tên code. |
button1 | (Name) | btnTinh | (Quan trọng) Tên code. |
Text | Tính | Nhãn hiển thị trên nút. | |
label4 | (Name) | lblKetQua | (Quan trọng) Tên code. |
(Thêm 1 Label nữa) | Text | Kết quả: ... | Nhãn hiển thị. |
Bước đặc biệt: Thêm mục cho ComboBox
Nhấp chọn đối tượng
ComboBox(cbPhepTinh) trên Form.Trong cửa sổ Properties, tìm thuộc tính tên là Items.
Nhấp vào chữ
(Collection)và sau đó nhấp vào nút ba chấm...Một cửa sổ “String Collection Editor” sẽ hiện ra.
Gõ các phép tính, mỗi phép tính trên một dòng:
Cộng Trừ Nhân ChiaNhấn OK.
Bước 4: Viết mã nguồn (Xử lý sự kiện) (Chi tiết)
Chúng ta sẽ viết code cho sự kiện Click của nút “Tính”.
4.1. Tạo sự kiện btnTinh_Click
Quay lại tab thiết kế
Form1.cs [Design].Nhấp đúp (double-click) vào nút Tính (nút
btnTinhcủa bạn).Visual Studio sẽ tự động chuyển sang code (
Form1.cs) và tạo hàmbtnTinh_Click.
4.2. Viết code vào hàm btnTinh_Click
Bây giờ, hãy gõ toàn bộ đoạn code sau vào bên trong hàm btnTinh_Click. Hãy đọc kỹ các chú thích để hiểu.
private void btnTinh_Click(object sender, EventArgs e)
{
// Chúng ta dùng 'double' thay vì 'int' để có thể tính số thập phân
double soA, soB, ketQua;
// 1. Dùng try...catch để bắt lỗi nếu người dùng nhập chữ
try
{
// 2. Lấy giá trị từ TextBox và chuyển sang kiểu số (double)
soA = double.Parse(txtSoA.Text);
soB = double.Parse(txtSoB.Text);
}
catch (FormatException)
{
// Nếu nhập sai (ví dụ: nhập chữ "abc")
MessageBox.Show("Vui lòng nhập số hợp lệ!", "Lỗi");
lblKetQua.Text = "Kết quả: Lỗi nhập liệu";
return; // Thoát khỏi hàm, không làm gì thêm
}
// 3. Lấy phép tính người dùng chọn từ ComboBox
string phepTinh = cbPhepTinh.Text;
// 4. Khai báo biến kết quả
ketQua = 0;
// 5. Dùng switch...case để xử lý phép tính
switch (phepTinh)
{
case "Cộng":
ketQua = soA + soB;
break;
case "Trừ":
ketQua = soA - soB;
break;
case "Nhân":
ketQua = soA * soB;
break;
case "Chia":
// 6. Bẫy lỗi chia cho 0
if (soB == 0)
{
MessageBox.Show("Không thể chia cho 0!", "Lỗi");
lblKetQua.Text = "Kết quả: Lỗi chia cho 0";
return; // Thoát
}
else
{
ketQua = soA / soB;
}
break;
default:
MessageBox.Show("Bạn chưa chọn phép tính!", "Lỗi");
return; // Thoát
}
// 7. Hiển thị kết quả ra Label
// Dùng .ToString() để chuyển số 'ketQua' về lại chuỗi
lblKetQua.Text = "Kết quả: " + ketQua.ToString();
}
Mã nguồn hoàn chỉnh (Form1.cs)
Đây là toàn bộ tệp Form1.cs của bạn sẽ trông như thế nào sau khi hoàn thành:
C#
using System;
using System.Windows.Forms;
namespace BaiTap5_MayTinh
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnTinh_Click(object sender, EventArgs e)
{
// Chúng ta dùng 'double' thay vì 'int' để có thể tính số thập phân
double soA, soB, ketQua;
// 1. Dùng try...catch để bắt lỗi nếu người dùng nhập chữ
try
{
// 2. Lấy giá trị từ TextBox và chuyển sang kiểu số (double)
soA = double.Parse(txtSoA.Text);
soB = double.Parse(txtSoB.Text);
}
catch (FormatException)
{
// Nếu nhập sai (ví dụ: nhập chữ "abc")
MessageBox.Show("Vui lòng nhập số hợp lệ!", "Lỗi");
lblKetQua.Text = "Kết quả: Lỗi nhập liệu";
return; // Thoát khỏi hàm, không làm gì thêm
}
// 3. Lấy phép tính người dùng chọn từ ComboBox
string phepTinh = cbPhepTinh.Text;
// 4. Khai báo biến kết quả
ketQua = 0;
// 5. Dùng switch...case để xử lý phép tính
switch (phepTinh)
{
case "Cộng":
ketQua = soA + soB;
break;
case "Trừ":
ketQua = soA - soB;
break;
case "Nhân":
ketQua = soA * soB;
break;
case "Chia":
// 6. Bẫy lỗi chia cho 0
if (soB == 0)
{
MessageBox.Show("Không thể chia cho 0!", "Lỗi");
lblKetQua.Text = "Kết quả: Lỗi chia cho 0";
return; // Thoát
}
else
{
ketQua = soA / soB;
}
break;
default:
MessageBox.Show("Bạn chưa chọn phép tính!", "Lỗi");
return; // Thoát
}
// 7. Hiển thị kết quả ra Label
// Dùng .ToString() để chuyển số 'ketQua' về lại chuỗi
lblKetQua.Text = "Kết quả: " + ketQua.ToString();
}
}
}
Bước 5: Chạy và kiểm thử
Nhấn phím F5 để chạy.
Form Máy tính của bạn sẽ xuất hiện.
Thử nghiệm 1 (Cộng): Nhập
10(Số a),5(Số b). ChọnCộng. Nhấn “Tính” -> Kết quả:15.Thử nghiệm 2 (Chia): Nhập
10(Số a),4(Số b). ChọnChia. Nhấn “Tính” -> Kết quả:2.5.Thử nghiệm 3 (Lỗi chia 0): Nhập
10(Số a),0(Số b). ChọnChia. Nhấn “Tính” -> Hộp thoại “Không thể chia cho 0!” hiện ra.Thử nghiệm 4 (Lỗi nhập liệu): Nhập
abc(Số a),5(Số b). ChọnCộng. Nhấn “Tính” -> Hộp thoại “Vui lòng nhập số hợp lệ!” hiện ra.
Bài tập 7.3. Tìm 1 số nhỏ nhất trong 4 số được nhập vào từ bàn phím thông qua hộp text.
Hướng dẫn
B1:Tạo dự án Windows Forms
- Mở Visual Studio 2010: Khởi chạy Visual Studio.
- Tạo dự án mới: Vào File → New → Project…
- Chọn loại dự án: Chọn “Visual C#” → “Windows” → “Windows Forms Application”.
- Đặt tên dự án: Ví dụ: “MinOfFourNumbers”, chọn thư mục lưu → nhấn OK.
- Mở Form mặc định: Visual Studio tạo sẵn Form1, mở ở chế độ Designer.
B2: Thêm và bố trí các điều khiển (controls)
- Thêm 4 TextBox:
- Kéo thả: Từ Toolbox → kéo “TextBox” vào Form, tạo 4 ô nhập.
- Đặt tên: Chọn từng TextBox, trong Properties đặt Name lần lượt:
textBox1,textBox2,textBox3,textBox4. - Canh hàng: Sắp xếp theo cột dọc, thêm Label bên trái (tùy chọn) ghi “Số 1”, “Số 2”, “Số 3”, “Số 4”.
- Thêm Button:
- Kéo thả: Thả một “Button”.
- Đặt tên: Name =
buttonFindMin, Text = “Tìm số nhỏ nhất”.
- Thêm Label hiển thị kết quả:
- Kéo thả: Thả một “Label”.
- Đặt tên: Name =
labelResult, Text = để trống (hoặc “Kết quả sẽ hiện ở đây”). - Thiết lập: AutoSize = true để tự giãn theo nội dung.
Gợi ý: Đặt TabIndex theo thứ tự nhập: textBox1 = 0, textBox2 = 1, … buttonFindMin = 4. Người dùng nhấn Tab sẽ di chuyển đúng thứ tự.
B4: Tạo sự kiện Click cho nút
- Mở Designer: Chọn nút
buttonFindMintrên Form. - Tạo handler: Nhấp đúp chuột vào nút để Visual Studio tự tạo phương thức
buttonFindMin_Clicktrong Form1.cs. - Xác nhận: Form1.cs mở ra với khung phương thức sự kiện.
B5: Viết mã xử lý nhập liệu và tìm Min
- Nhập đoạn mã sau vào bên trong class
Form1(trong file Form1.cs). Giữ nguyên phương thứcInitializeComponent()và các phần có sẵn.
using System; // Thư viện cơ bản của C#, cung cấp các lớp và phương thức chuẩn.
using System.Windows.Forms; // Thư viện để xây dựng ứng dụng Windows Forms (giao diện người dùng).
namespace MinOfFourNumbers // Khai báo namespace để nhóm các lớp liên quan.
{
public partial class Form1 : Form // Lớp Form1 kế thừa từ lớp Form (một cửa sổ giao diện).
{
public Form1()
{
InitializeComponent(); // Khởi tạo các thành phần giao diện (textbox, button, label...).
}
private void buttonFindMin_Click(object sender, EventArgs e)
{
// Khai báo biến để lưu 4 số nhập vào
double n1, n2, n3, n4;
// Đọc và kiểm tra dữ liệu từ ô nhập số 1
if (!double.TryParse(textBox1.Text.Trim(), out n1))
{
MessageBox.Show("Giá trị ở ô Số 1 không hợp lệ. Vui lòng nhập số.",
"Lỗi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox1.Focus(); // Đưa con trỏ về ô nhập sai để người dùng sửa
return; // Thoát khỏi hàm nếu nhập sai
}
// Đọc và kiểm tra dữ liệu từ ô nhập số 2
if (!double.TryParse(textBox2.Text.Trim(), out n2))
{
MessageBox.Show("Giá trị ở ô Số 2 không hợp lệ. Vui lòng nhập số.",
"Lỗi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox2.Focus();
return;
}
// Đọc và kiểm tra dữ liệu từ ô nhập số 3
if (!double.TryParse(textBox3.Text.Trim(), out n3))
{
MessageBox.Show("Giá trị ở ô Số 3 không hợp lệ. Vui lòng nhập số.",
"Lỗi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox3.Focus();
return;
}
// Đọc và kiểm tra dữ liệu từ ô nhập số 4
if (!double.TryParse(textBox4.Text.Trim(), out n4))
{
MessageBox.Show("Giá trị ở ô Số 4 không hợp lệ. Vui lòng nhập số.",
"Lỗi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox4.Focus();
return;
}
// Tính số nhỏ nhất trong 4 số
double min12 = Math.Min(n1, n2); // Tìm số nhỏ nhất giữa n1 và n2
double min34 = Math.Min(n3, n4); // Tìm số nhỏ nhất giữa n3 và n4
double minAll = Math.Min(min12, min34); // Tìm số nhỏ nhất trong cả 4 số
// Hiển thị kết quả ra label
labelResult.Text = $"Số nhỏ nhất là: {minAll}";
}
}
}
Tóm tắt ý nghĩa
double.TryParse: Kiểm tra xem dữ liệu nhập vào có phải là số hợp lệ không. Nếu đúng thì gán giá trị cho biến, nếu sai thì báo lỗi.MessageBox.Show: Hiển thị thông báo lỗi cho người dùng.Math.Min: Hàm có sẵn trong C#, dùng để tìm số nhỏ nhất giữa hai số.labelResult.Text: Hiển thị kết quả cuối cùng lên giao diện.
B6: Chạy và kiểm thử
- Chạy chương trình: Nhấn F5 (hoặc nút Start).
- Nhập dữ liệu: Gõ 4 số vào 4 TextBox (có thể số thập phân).
- Bấm nút: Nhấn “Tìm số nhỏ nhất”.
- Xem kết quả: Kết quả hiển thị trên
labelResult. Nếu nhập sai (chữ, để trống), sẽ có hộp thoại báo lỗi và trỏ lại ô cần sửa.
Bài tập 7.4: Hãy viết phần mềm giải và biện luận phương trình bậc 2 bằng Windows Forms trong C#.
Hướng dẫn:
Bước 1: Tạo Project
- Mở Visual Studio 2010.
Chọn File → New Project → Windows Forms Application (C#).
Đặt tên project:
GiaiPhuongTrinhBac2.
Bước 2: Thiết kế Form
- Thêm 3 TextBox để nhập hệ số:
textBoxA(Label: “Hệ số a”)textBoxB(Label: “Hệ số b”)textBoxC(Label: “Hệ số c”)
Thêm Button: Name =
buttonSolve, Text = “Giải phương trình”.Thêm Label: Name =
labelResult, Text = “Kết quả sẽ hiển thị ở đây”.
Bước 3: Viết code xử lý sự kiện buttonSolve_Click
Trong Form1.cs, nhấp đôi vào nút buttonSolve để tạo sự kiện Click, rồi viết code:
// Import các thư viện cần thiết
using System; // Chứa các lớp cơ bản như Math, Convert, ...
using System.Windows.Forms; // Chứa các lớp để xây dựng giao diện Windows Forms
namespace GiaiPhuongTrinhBac2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); // Khởi tạo các thành phần giao diện (TextBox, Button, Label...)
}
// Sự kiện xảy ra khi người dùng bấm nút "Giải phương trình"
private void buttonSolve_Click(object sender, EventArgs e)
{
double a, b, c; // Khai báo 3 biến kiểu double để lưu hệ số a, b, c
// --- KIỂM TRA DỮ LIỆU NHẬP ---
// TryParse: cố gắng chuyển chuỗi nhập vào thành số double
// Nếu thành công → gán vào biến a, trả về true
// Nếu thất bại → trả về false, hiện thông báo lỗi
if (!double.TryParse(textBoxA.Text.Trim(), out a))
{
MessageBox.Show("Hệ số a không hợp lệ.", "Lỗi nhập liệu",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBoxA.Focus(); // Đưa con trỏ về ô nhập a để người dùng sửa
return; // Thoát khỏi hàm, không chạy tiếp
}
if (!double.TryParse(textBoxB.Text.Trim(), out b))
{
MessageBox.Show("Hệ số b không hợp lệ.", "Lỗi nhập liệu",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBoxB.Focus();
return;
}
if (!double.TryParse(textBoxC.Text.Trim(), out c))
{
MessageBox.Show("Hệ số c không hợp lệ.", "Lỗi nhập liệu",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBoxC.Focus();
return;
}
// --- BIỆN LUẬN PHƯƠNG TRÌNH ---
// Trường hợp a = 0 → phương trình trở thành bậc nhất hoặc vô nghiệm/vô số nghiệm
if (a == 0)
{
if (b == 0)
{
if (c == 0)
labelResult.Text = "Phương trình vô số nghiệm."; // 0x = 0 → vô số nghiệm
else
labelResult.Text = "Phương trình vô nghiệm."; // 0x = c (c ≠ 0) → vô nghiệm
}
else
{
// Phương trình bậc nhất: bx + c = 0 → nghiệm x = -c/b
double x = -c / b;
labelResult.Text = "Phương trình có nghiệm duy nhất: x = " + x;
}
}
else
{
// Trường hợp a ≠ 0 → phương trình bậc 2
// Tính delta = b² - 4ac
double delta = b * b - 4 * a * c;
if (delta < 0)
{
// Nếu delta < 0 → phương trình vô nghiệm
labelResult.Text = "Phương trình vô nghiệm.";
}
else if (delta == 0)
{
// Nếu delta = 0 → phương trình có nghiệm kép x = -b / (2a)
double x = -b / (2 * a);
labelResult.Text = "Phương trình có nghiệm kép: x = " + x;
}
else
{
// Nếu delta > 0 → phương trình có 2 nghiệm phân biệt
double x1 = (-b + Math.Sqrt(delta)) / (2 * a); // Math.Sqrt: tính căn bậc 2
double x2 = (-b - Math.Sqrt(delta)) / (2 * a);
labelResult.Text = "Phương trình có 2 nghiệm phân biệt:"
+ Environment.NewLine // Xuống dòng trong Label
+ "x1 = " + x1 + ", x2 = " + x2;
}
}
}
}
}Giải thích các lệnh chính
double.TryParse(...): kiểm tra và chuyển chuỗi nhập thành số thực, tránh lỗi khi nhập chữ.MessageBox.Show(...): hiển thị hộp thoại thông báo cho người dùng.textBoxA.Focus(): đưa con trỏ về ô nhập liệu để sửa.return;: thoát khỏi hàm ngay lập tức, không chạy tiếp.if (a == 0): biện luận trường hợp phương trình không phải bậc 2.Math.Sqrt(delta): tính căn bậc hai của delta.Environment.NewLine: ký tự xuống dòng trong chuỗi, hiển thị đẹp trong Label.
Biện luận:
Nếu
a = 0→ phương trình bậc nhất hoặc vô nghiệm/vô số nghiệm.Nếu
a ≠ 0→ tính delta = b² – 4ac:delta < 0→ vô nghiệm.delta = 0→ nghiệm kép.delta > 0→ 2 nghiệm phân biệt.
Hiển thị kết quả: Gán chuỗi vào
labelResult.Text. DùngEnvironment.NewLineđể xuống dòng trong Label.
Bước 5: Kiểm thử
- Nhập
a = 1, b = -3, c = 2→ Kết quả: x1 = 2, x2 = 1. Nhập
a = 0, b = 2, c = -4→ Kết quả: x = 2.Nhập
a = 0, b = 0, c = 0→ Vô số nghiệm.Nhập sai dữ liệu (ví dụ: “abc”) → Báo lỗi nhập liệu.
Bài tập 7.5. Hãy viết phần mềm tìm 1 số lớn nhất trong 4 số được nhập vào từ bàn phím thông qua hộp text trong C#.
Bài tập 7.6. Hãy viết phần mềm trong C# ứng dụng Winform với các yêu cầu sau đây.
- Nhập vào Họ và tên
- Nhập vào phái bằng nút Radio
- Nhập vào ngày tháng năm sinh dạng dd/mm/yyyy
- Nhập vào trình độ ngoại ngữ bằng check box (5 ngoại ngữ)
- Nhập vào Nơi sinh chọn bằng Combox
- In thông tin ra màn hình
Tất cả các đối tượng đều phải có kiểm tra tính đúng đắn của dữ liệu nhập vào.
