BÀI 7: CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN CỦA C# 2008

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ổ Properties lú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)

  1. 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.

  2. 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.

  3. 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)

  1. 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ề true nếu được chọn, false nếu không).

  2. 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.

  3. 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).

  4. 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

  1. Tạo dự án Windows Forms Application mới tên BaiTap5_DangNhap.

  2. 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 PasswordChar của txtPassword thà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.

  1. Mở Visual Studio 2008.

  2. Chọn menu File -> New -> Project….

  3. 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

  4. Ở ô Name: (Tên) bên dưới, gõ chính xác: BaiTap5_DangNhap

  5. Nhấ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.

  1. 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

  2. Kéo-thả các đối tượng:

    • Tìm Label trong Toolbox, kéo thả nó vào Form1. Làm 2 lần (cho 2 Label).

    • Tìm TextBox trong Toolbox, kéo thả nó vào Form1. Làm 2 lần (cho 2 TextBox).

    • Tìm Button trong Toolbox, kéo thả nó vào Form1. Làm 2 lần (cho 2 Button).

  3. 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.

  1. Cách làm: Nhấp chọn 1 đối tượng trên Form (ví dụ: button1).

  2. Nhìn vào cửa sổ Properties (thường ở góc dưới bên phải).

  3. Tìm thuộc tính Name hoặc Text và thay đổi giá trị.

Hãy làm lần lượt cho tất cả các đối tượng:

Đối tượngThuộc tính cần đổiGiá trị mớiÝ nghĩa
label1TextTên đăng nhập:Đặt lại nhãn hiển thị.
label2TextMậ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.
 TextThoá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”

  1. Quay lại tab thiết kế Form1.cs [Design].

  2. Nhấp đúp (double-click) vào nút Thoát (nút btnThoat của bạn).

  3. 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.

  4. 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”

  1. Quay lại tab thiết kế Form1.cs [Design].

  2. Nhấp đúp (double-click) vào nút Đăng nhập (nút btnDangNhap của bạn).

  3. Visual Studio sẽ tạo thêm một hàm rỗng nữa là btnDangNhap_Click.

  4. 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ử

  1. Nhấn phím F5 (hoặc nút Start Debugging <img>) để chạy.

  2. Form Đăng nhập của bạn sẽ xuất hiện.

  3. Thử nghiệm 1 (Thành công):

    • admin vào ô Tên đăng nhập.

    • 123 và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!”.

  4. Thử nghiệm 2 (Thất bại):

    • admin555.

    • 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!”.

  5. 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à txtSoAtxtSoB.

    • 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 Items củ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:

  1. Lấy dữ liệu & Ép kiểu an toàn:

    • Lấy dữ liệu từ txtSoAtxtSoB.

    • 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.

  2. 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.

  3. 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ở.

  4. 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)

  1. Mở Visual Studio 2008.

  2. Chọn menu File -> New -> Project….

  3. 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.

  4. Ở ô Name: (Tên) bên dưới, gõ chính xác: BaiTap5_MayTinh

  5. Nhấn OK.

Bước 2: Thiết kế giao diện (Kéo-thả)

  1. Mở Toolbox (Hộp công cụ) (vào menu View -> Toolbox nếu bị ẩn).

  2. 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.

  3. 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.

  1. Cách làm: Nhấp chọn 1 đối tượng trên Form.

  2. Nhìn vào cửa sổ Properties (góc dưới bên phải).

  3. Tìm thuộc tính Name hoặc Text và thay đổi giá trị.

Hãy làm lần lượt cho tất cả các đối tượng:

Đối tượngThuộc tính cần đổiGiá trị mớiÝ nghĩa
label1TextSố a:Nhãn cho ô số a.
label2TextSố b:Nhãn cho ô số b.
label3TextPhé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.
 TextTínhNhãn hiển thị trên nút.
label4(Name)lblKetQua(Quan trọng) Tên code.
(Thêm 1 Label nữa)TextKết quả: ...Nhãn hiển thị.

Bước đặc biệt: Thêm mục cho ComboBox

  1. Nhấp chọn đối tượng ComboBox (cbPhepTinh) trên Form.

  2. Trong cửa sổ Properties, tìm thuộc tính tên là Items.

  3. Nhấp vào chữ (Collection) và sau đó nhấp vào nút ba chấm ...

  4. Một cửa sổ “String Collection Editor” sẽ hiện ra.

  5. Gõ các phép tính, mỗi phép tính trên một dòng:

    Cộng
    Trừ
    Nhân
    Chia
    
  6. Nhấ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

  1. Quay lại tab thiết kế Form1.cs [Design].

  2. Nhấp đúp (double-click) vào nút Tính (nút btnTinh của bạn).

  3. Visual Studio sẽ tự động chuyển sang code (Form1.cs) và tạo hàm btnTinh_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.

C#
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ử

  1. Nhấn phím F5 để chạy.

  2. Form Máy tính của bạn sẽ xuất hiện.

  3. Thử nghiệm 1 (Cộng): Nhập 10 (Số a), 5 (Số b). Chọn Cộng. Nhấn “Tính” -> Kết quả: 15.

  4. Thử nghiệm 2 (Chia): Nhập 10 (Số a), 4 (Số b). Chọn Chia. Nhấn “Tính” -> Kết quả: 2.5.

  5. Thử nghiệm 3 (Lỗi chia 0): Nhập 10 (Số a), 0 (Số b). Chọn Chia. Nhấn “Tính” -> Hộp thoại “Không thể chia cho 0!” hiện ra.

  6. Thử nghiệm 4 (Lỗi nhập liệu): Nhập abc (Số a), 5 (Số b). Chọn Cộ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

  1. Mở Visual Studio 2010: Khởi chạy Visual Studio.
  2. Tạo dự án mới: Vào File → New → Project…
  3. Chọn loại dự án: Chọn “Visual C#” → “Windows” → “Windows Forms Application”.
  4. Đặt tên dự án: Ví dụ: “MinOfFourNumbers”, chọn thư mục lưu → nhấn OK.
  5. 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)

  1. 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”.
  2. Thêm Button:
    • Kéo thả: Thả một “Button”.
    • Đặt tên: Name = buttonFindMin, Text = “Tìm số nhỏ nhất”.
  3. 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

  1. Mở Designer: Chọn nút buttonFindMin trên Form.
  2. Tạo handler: Nhấp đúp chuột vào nút để Visual Studio tự tạo phương thức buttonFindMin_Click trong Form1.cs.
  3. 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

  1. Nhập đoạn mã sau vào bên trong class Form1 (trong file Form1.cs). Giữ nguyên phương thức InitializeComponent() 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ử

  1. Chạy chương trình: Nhấn F5 (hoặc nút Start).
  2. Nhập dữ liệu: Gõ 4 số vào 4 TextBox (có thể số thập phân).
  3. Bấm nút: Nhấn “Tìm số nhỏ nhất”.
  4. 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

  1. Mở Visual Studio 2010.
  1. Chọn File → New Project → Windows Forms Application (C#).

  2. Đặt tên project: GiaiPhuongTrinhBac2.

Bước 2: Thiết kế Form

  1. Thêm 3 TextBox để nhập hệ số:
    • textBoxA (Label: “Hệ số a”)

    • textBoxB (Label: “Hệ số b”)

    • textBoxC (Label: “Hệ số c”)

  2. Thêm Button: Name = buttonSolve, Text = “Giải phương trình”.

  3. 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ùng Environment.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.

  1. Nhập vào Họ và tên
  2. Nhập vào phái bằng nút Radio
  3. Nhập vào ngày tháng năm sinh dạng dd/mm/yyyy
  4. Nhập vào trình độ ngoại ngữ bằng check box (5 ngoại ngữ)
  5. Nhập vào Nơi sinh chọn bằng Combox
  6. 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.

Hướng dẫn làm bài