Tải bản đầy đủ (.doc) (116 trang)

Bài giảng lập trình window 2 C

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.96 MB, 116 trang )

BÀI 1: XỬ LÝ NGOẠI LỆ
1.1 Phát sinh và bắt giữ ngoại lệ
Trong ngôn ngữ C#, chúng ta chỉ có thể phát sinh (throw) những đối tượng các
kiểu dữ liệu là System.Exception, hay những đối tượng được dẫn xuất từ
kiểu dữ liệu này.
Namespace System của CLR chứa một số các kiểu dữ liệu xử lý ngoại lệ mà
chúng ta có thể sử dụng trong chương trình. Những kiểu dữ liệu ngoại lệ
này
bao
gồm
ArgumentNull - Exception, InValidCastException, và
OverflowException , cũng như nhiều lớp khác nữa.
Câu lệnh throw
Để phát tín hiệu một sự không bình thường trong một lớp của ngôn ngữ C#,
chúng ta phát sinh một ngoại lệ. Để làm được điều này, chúng ta sử dụng từ khóa
throw. Dòng lệnh sau tạo ra một thể hiện mới của System.Exception và sau đó throw
nó:
throw new System.Exception();
Khi phát sinh ngoại lệ thì ngay tức khắc sẽ làm ngừng việc thực thi trong khi
CLR sẽ tìm kiếm một trình xử lý ngoại lệ. Nếu một trình xử lý ngoại lệ không được
tìm thấy trong phương thức hiện thời, thì CLR tiếp tục tìm trong phương thức gọi cho
đến khi nào tìm thấy.
Nếu CLR trả về lớp Main() mà không tìm thấy bất cứ trình xử lý ngoại lệ nào,
thì nó sẽ kết
thúc chương trình.
Ví dụ: Throw ngoại lệ.
----------------------------------------------------------------------------namespace Programming_CSharp
{
using System;
public class Test
{


public static void Main()
{
Console.WriteLine(“Enter Main....”);
Test t = new Test();
t.Func1();
Console.WriteLine(“Exit Main...”);
1


}
public void Func1()
{
Console.WriteLine(“Enter Func1...”);
Func2();
Console.WriteLine(“Exit Func1...”);
}
public void Func2()
{
Console.WriteLine(“Enter Func2...”);
throw new System.Exception();
Console.WriteLine(“Exit Func2...”);

}
}
}
Ví dụ minh họa đơn giản này viết ra màn hình console thông tin khi nó nhập
vào trong một hàm và chuẩn bị đi ra từ một hàm. Hàm Main() tạo thể hiện mới của
kiểu Test và sau đó gọi hàm Func1(). Sau khi in thông điệp “Enter Func1”, hàm
Func1() này gọi hàm Func2(). Hàm Func2() in ra thông điệp đầu tiên và phát sinh một
ngoại lệ kiểu System.Exception. Việc thực thi sẽ ngưng ngay tức khắc, và CLR sẽ tìm

kiếm trình xử lý ngoại lệ trong hàm Func2(). Do không tìm thấy ở đây, CLR tiếp tục
vào stack lấy hàm đã gọi trước tức là Func1 và tìm kiếm trình xử lý ngoại lệ. Một lần
nữa trong Func1 cũng không có đoạn xử lý ngoại lệ. Và CLR trả về hàm Main. Tại
hàm Main cũng không có, nên CLR sẽ gọi trình mặc định xử lý ngoại lệ, việc này đơn
giản là xuất ra một thông điệp lỗi.
Câu lệnh catch
Trong C#, một trình xử lý ngoại lệ hay một đoạn chương trình xử lý các ngoại
lệ được gọi là một khối catch và được tạo ra với từ khóa catch.
Trong ví dụ sau, câu lệnh throw được thực thi bên trong khối try, và một khối
catch được sử dụng để công bố rằng một lỗi đã được xử lý.
namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
2


{
Console.WriteLine(“Enter Main...”);
Test t = new Test();
t.Func1();
Console.WriteLine(“Exit Main...”);
}
public void Func1()
{
Console.WriteLine(“Enter Func1...”);
Func2();
Console.WriteLine(“Exit Func1...”);

}
public void Func2()
{
Console.WriteLine(“Enter Func2...”);
try
{
Console.WriteLine(“Entering try block...”);
throw new System.Exception();
Console.WriteLine(“Exiting try block...”);
}
Khi một ngoại lệ được phát sinh, việc thi hành ngay lập tức sẽ bị tạm dừng và
việc thi hành sẽ được chuyển qua khối lệnh catch. Nó không bao giờ trả về luồng thực
hiện ban đầu, tức là các lệnh sau khi phát ra ngoại lệ trong khối try không được thực
hiện. Trong trường hợp này chúng ta sẽ không bao giờ nhận được thông báo “Exiting
try block....”. Khối lệnh catch xử lý lỗi và sau đó chuyển việc thực thi chương trình
đến các lệnh tiếp sau khối catch. Ở đây không có việc quay lại cuộc gọi hàm trước
trong stack. Ngoại lệ bây giờ được xử lý, không có vấn đề gì xảy ra, và chương trình
tiếp tục hoạt động bình thường. Điều này trở nên rõ ràng hơn nếu chúng ta di chuyển
khối try/catch lên hàm Func1 như trong ví dụ minh họa
namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
{
Console.WriteLine(“Enter Main...”);
Test t = new Test();
3



t.Func1();
Console.WriteLine(“Exit Main...”);
}
public void Func1()
{
Console.WriteLine(“Enter Func1...”);
try
{
Console.WriteLine(“Entering try block...”);
Func2();
Console.WriteLine(“Exiting try block...”);
}
catch
{
Console.WriteLine(“Exception caught and handled.”);
}
Console.WriteLine(“Exit Func1...”);
}
public void Func2()
{
Console.WriteLine(“Enter Func2...”);
throw new System.Exception();
Console.WriteLine(“Exit Func2...”);
}
Lúc này ngoại lệ không được xử lý bên trong hàm Func2(), mà nó được xử lý
bên trong hàm Func1(). Khi hàm Func2() được gọi, nó in câu lệnh thông báo vào hàm
rồi phát sinh một ngoại lệ. Việc thực hiện chương trình bị ngưng, CLR tìm kiếm phần
xử lý ngoại lệ, nhưng trong hàm này không có và CLR vào stack lấy hàm gọi trong
trường hợp này là Func1(). Câu lệnh catch sẽ được gọi, và việc thực thi tiếp tục thực

hiện bình thường sau câu lệnh catch.
Hãy chắc chắn rằng chúng ta đã hiểu rõ tại sao câu lệnh “Exiting try block” và
“Exit Func2” không được in ra. Chúng ta có thể dùng cách cũ để kiểm tra việc này
bằng cách dùng chương trình debug cho chương trình chạy từng bước để tìm hiểu rõ
hơn.
Tạo một khối catch xác định:
Ở đây ta chỉ dùng khối catch tổng quát, tức là với bất cứ ngoại lệ nào cũng
được. Tuy nhiên chúng ta có thể tạo ra khối catch xác định để xử lý chỉ một vài các
4


ngoại lệ chứ không phải toàn bộ ngoại lệ, dựa trên kiểu của ngoại lệ phát sinh.
Trong ví dụ này, phương thức DoDivide() sẽ không cho phép chúng ta chia cho
zero bởi một số khác, và cũng không cho phép chia số zero. Nó sẽ phát sinh một đối
tượng của Divide- ByzeroException nếu chúng ta thực hiện chia với zero. Trong toán
học việc lấy zero chia cho một số khác là được phép, nhưng trong ví dụ minh họa của
chúng ta không cho phép thực hiện việc này, nếu thực hiện sẽ phát sinh ra một ngoại lệ
ArithmeticException.
Khi một ngoại lệ được phát sinh, CLR sẽ kiểm tra mỗi khối xử lý ngoại lệ theo
thứ tự và sẽ lấy khối đầu tiên thích hợp. Khi chúng ta thực hiện với a=5 và b=7 thì kết
quả như sau:
5 / 7 = 0.7142857142857143
Như chúng ta mong muốn, không có ngoại lệ được phát sinh. Tuy nhiên, khi
chúng ta thay đổi giá trị của a là 0, thì kết quả là:
ArithmeticException caught!
Ngoại lệ được phát sinh, và CLR sẽ kiểm tra ngoại lệ đầu tiên:
DivideByZeroException. Bởi vì không phù hợp, nên nó sẽ tiếp tục đi tìm và khối xử lý
ArithmeticException được chọn.
Cuối cùng, giả sử chúng ta thay đổi giá trị của b là 0. Khi thực hiện điều này sẽ
dẫn đến ngoại lệ DivideByZeroException.

!Ghi chú: Chúng ta phải cẩn thận thứ tự của câu lệnh catch, bởi
vì DivideByZero- Exception được dẫn xuất từ ArithmeticException. Nếu chúng ta
đảo thứ tự của câu lệnh catch, thì ngoại lệ DivideByZeroException sẽ được phù hợp
với khối xử lý ngoại lệ Arith- meticException. Và việc xử lý ngoại lệ sẽ
không bao giờ được giao cho khối xử lý DivideByZeroException. Thật vậy,
nếu thứ tự này được đảo, nó sẽ không cho phép bất cứ ngoại lệ nào được xử lý bởi
khối xử lý ngoại lệ DivideByZeroException. Trình biên dịch sẽ nhận ra rằng
DivideByZeroException không được thực hiện bất cứ khi nào và nó sẽ thông báo một
lỗi biên dịch.
Chúng ta có thể phân phối câu lệnh try/ catch, bằng cách bắt giữ những ngoại
lệ xác định trong một hàm và nhiều ngoại lệ tổng quát trong nhiều hàm. Mục đích của
thực hiện này là đưa ra các thiết kế đúng. Giả sử chúng ta có phương thức A, phương
thức này gọi một phương thức khác tên là phương thức B, đến lượt mình phương thức
B gọi phương thức C. Và phương thức C tiếp tục gọi phương thức D, cuối cùng
phương thức D gọi phương thức E. Phương thức E ở mức độ sâu nhất trong chương
trình của chúng ta, phương thức A, B ở mức độ cao hơn. Nếu chúng ta đoán trước
5


phương thức E có thể phát sinh ra ngoại lệ, chúng ta có thể tạo ra khối try/catch để bắt
giữ những ngoại lệ này ở chỗ gần nơi phát sinh ra ngoại lệ nhất. Chúng ta cũng có thể
tạo ra nhiều khối xử lý ngoại lệ chung ở trong đoạn chương trình ở mức cao trong
trường hợp những ngoại lệ không đoán trước được
1.2 Những đối tượng ngoại lệ
Cho đến lúc này thì chúng ta có thể sử dụng tốt các ngoại lệ cũng như cách xử
lý khắc phục các ngoại lệ này. Trong phần này chúng ta sẽ tiến hành việc tìm hiểu các
đối tượng được xây dựng cho việc xử lý ngoại lệ. Đối tượng System.Exception cung
cấp một số các phương thức và thuộc tính hữu dụng. Thuộc tính Message cung cấp
thông tin về ngoại lệ, như là lý do tại sao ngoại lệ được phát sinh. Thuộc tính Message
là thuộc tính chỉ đọc, đoạn chương trình phát sinh ngoại lệ có thể thiết lập thuộc tính

Message như là một đối mục cho bộ khởi dựng của ngoại lệ. Thuộc tính HelpLink
cung cấp một liên kết để trợ giúp cho các tập tin liên quan đến các ngoại lệ. Đây là
thuộc tính chỉ đọc. Thuộc tính StackTrace cũng là thuộc tính chỉ đọc và được thiết lập
bởi CLR. Trong ví dụ 13.6 thuộc tính Exception.HelpLink được thiết lập và truy cập
để cung cấp thông tin cho người sử dụng về ngoại lệ DivideBy-ZeroException.
Thuộc tính StackTrace của ngoại lệ được sử dụng để cung cấp thông tin stack
cho câu lệnh lỗi. Một thông tin stack cung cấp hàng loạt các cuộc gọi stack của
phương thức gọi mà dẫn đến những ngoại lệ được phát sinh.
namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
{
Test t = new Test();
t.TestFunc();
}
// chia hai số và xử lý ngoại lệ
Public void TestFunc()
{
Try
{
Console.WriteLine(“ Open file here”);
Double a=12;
Double b=0;
6


Console.WriteLine(“ {0}/{1} = {2}”,a,b,a/b);

}
catch (System.DivideByZeroException e)
{
Console.WriteLine(“\nDivideByZeroException!Msg:
{0},e.Message”);
}
catch
{
Console.WriteLine(“ ko xac dinh”);
}
public double DoDivide(double a,double b)
{
if(b==0)
{
DivideByzeroException e = new DivideByZeroExceptin();
throw e;
}
If (a==0)
{
throw new ArithmeticException();
}
Return a/b;
}
}
Một số lớp ngoại lệ:
CÁC LỚP NGOẠI LỆ
Tên ngoại lệ
MethodAccessException
ArgumentException
ArgumentNullException

arithmeticException
DivideByZeroException
FormatException
IndexOutOfRangeExceptio
n
OverflowException

Mô tả
Lỗi truy cập, do truy cập đến thành viên hay phương
thức không được truy cập
Lỗi tham số đối mục
Đối mục null, phương thức được truyền đối mục null
không được chấp nhận
Lỗi liên quan đến các phép toán
Lỗi chia 0
Định dạng không chính xác một đối mục nào đó
Phép gán không hợp lệ
Lỗi tràn phép toán

7


1.3 Phát sinh lại ngoại lệ
Giả sử chúng ta muốn khối catch thực hiện một vài hành động đúng nào đó rồi
sau đó phát sinh lại ngoại lệ ra bên ngoài khối catch (trong một hàm gọi). Chúng ta
được phép phát sinh lại cùng một ngoại lệ hay phát sinh lại các ngoại lệ khác. Nếu
phát sinh ra ngoại lệ khác, chúng ta có thể phải nhúng ngoại lệ ban đầu vào bên trong
ngoại lệ mới để phương thức gọi có thể hiểu được lai lịch và nguồn gốc của ngoại lệ.
Thuộc tính InnerException của ngoại lệ mới cho phép truy cập ngoại lệ ban đầu.


8


BÀI 2: VISUAL STUDIO.NET
2.1 Lập trình với Visual Studio .NET
Microsoft Visual Studio .NET là ngôn ngữ hướng thành phần (component) rất
mạnh. C# đóng vai trò quan trọng trong kiến trúc .NET Framework của Microsoft.
Visual Studio.NET là môi trường lập trình cung cấp rất nhiều công cụ cần thiết
cho việc xây dựng các dự án lớn hoặc nhỏ.
Thanh trình đơn (menu bar) cho phép truy cập đến các lệnh sẽ sử dụng trong
môi trường lập trình.
Thanh công cụ (toolbar) nằm ngay bên dưới thanh trình đơn cung cấp các nút
truy cập nhanh đến hầu hết các lệnh thường dùng.
Khung cửa sổ soạn thảo (code pane) hiển thị nội dung các tập nguồn, đối với dự
án có nhiều tập tin, mỗi tập tin nguồn có thẻ của riêng nó với nhãn là tên tập tin nguồn.
Để thao tác một tập tin nguồn chỉ việc bấm chọn lên thẻ của tập tin nguồn của dự án.
Khung cửa sổ kết xuất (Output pane) hiển thị các thông điệp biên dịch (bao
gồm các cảnh báo và thông báo lỗi) khi tạo dựng (build) lệnh.
Trước khi viết mã (coding) cần kiểm tra các tập tin trong khung cửa sổ Solution
Explorer, chúng được tạo ra bởi Visual Studio.NET khi tạo dựng dự án.
Ví dụ khi tạo dự án có tên TextHello thì xuất hiện một số tập tin sau:


TextHello.shn: đây là tập tin giải pháp (solution file) cấp trên cùng, mỗi
ứng dụng có 1 tập tin loại này. Mỗi tập tin giải pháp gồm một hay nhiều
tập tin dự án. Trong hệ thống tập tin, mỗi tập tin giải pháp có phần mở
rộng là .shn, với phần tên hiển thị trong Solution Explorer thường dễ đọc.




TextHello.csproj: đây là tập tin dự án (project) của C#. Mỗi tập tin dự án
gồm một hay nhiều tập tin nguồn, các tập tin nguồn trong cùng một dự án
phải được viết cùng một ngôn ngữ. Loại tập tin này được hiển thị trong
Solution Explorer chỉ sử dụng tên của dự án, tuy nhiên nó được lưu trong
hệ thống tập tin với phần mở rộng .csproj.



Class1.cs: đây là 1 tập tin nguồn khác của C#, ta sẽ viết mã trong tập tin
này, Visual Studio.NET cũng tự động cung cấp một số mã lệnh (code) cho
tập tin này.



AssemblyInfo.cs: đây là 1 tập tin nguồn khác của C#, dùng tập tin này để
thêm một số thuộc tính vào chương trình.
9




App.ico: là tập tin icon được kết hợp với chương trình, tất cả các ứng dụng
windows có giao diện người dùng đều có icon, nó xuất hiện trên thanh tác
vụ (taskbar) khi chạy chương trình.

Các ứng dụng của .NET: được trình bày thông qua hình sau:

10



Các thành phần của .NET framework:

2.2 Thêm và điều chỉnh các điều khiển
Các thành phần và điều khiển của windows form:

11


Ví dụ:

Nhấn giữ chuột
phải, kéo và thả
vào form

2.3 Thay đổi kích thước các Form:

Kênh điều khiển
kích thước

Khung lưới này sẽ
không xuất hiện
trong solution

12


BÀI 3: THỰC ĐƠN
3.1 Thực đơn chính
 Thực đơn (Menu) là một thành phần quan trọng của cửa sổ, chúng chứa đựng
các chức năng chính của chương trình mà người dùng có thể thực hiện. Thanh

thực đơn chứa hầu hết tất cả chức năng chính của 1 chương trình, tổ chức theo
dạng phân cấp.
 Thực đơn là điều khiển gồm nhiều phần tử được tổ chức dưới dạng phân cấp.
Thanh thực đơn nằm trên đỉnh cửa sổ (dưới thanh tiêu đề). Các phần tử thực
đơn (Menu Item) xuất hiện trên thanh thực đơn được gọi là Menu Item mức
đỉnh.
 Mỗi Menu Item mức đỉnh có thể chứa Menu Item cấp dưới (SubMenu) hoặc
được gắn trực tiếp với các bộ xử lý sự kiện (Event handler) .
 Khi một menu Item chứa các Menu Item cấp dưới thì thường gọi là Popup
Menu. Các Menu Item được gắn trực tiếp với bộ xử lý sự kiện được gọi là
Command Menu

1. Tạo thêm trình đơn và xử lý các sự kiện trình đơn
Microsoft Visual Studio .NET cho phép thêm thực đơn và các mục thực đơn
vào form theo 2 cách.
-

Có thể sử dụng IDE và trình soạn thảo thực đơn để tạo thực đơn
13


-

Viết mã lệnh để tạo đối tượng Main Menu, sau đó thêm đối tượng MenuItem

vào nó
Tạo thực đơn
-

Khởi động Visual Studio .NET


-

Mở dự án mới

-

Hiển thị MemberForm trong cửa sổ Design View

-

Trong hộp Toolbox, chọn điều khiển MainMenu

Thành phần điều khiển mặc định có tên mainMenu1 xuất hiện cuối form và 1
thanh trình đơn chứa 1 nhãn Type Here được thêm vào form
-

Bấm chọn nhãn Type Here trên thanh thực đơn, nhập vào &File rồi ấn Enter

- Khi nhập 1 giá trị mới, một nhãn Type Here thứ 2 xuất hiện bên phải của
mục hiện thờim và nhãn Type Here thứ 3 xuất hiện bên dưới mục trình đơn File.
Chú ý: Ký tự & phía trước một ký tự cung cấp 1 cách truy xuất nhanh tới mục
trình đơn đó khi người sử dụng ấn phím Alt và ký tự đi theo &.

14


Thiết lập các thuộc tính của mục trình đơn
1.
Bấm chọn thành phần điều khiển mainMenu bên dưới form, trong cửa sổ

Properties thay đổi tên của nó thành mainMenu
2.
Bấm phải chuột lên mục trình đơn File trên thanh trình đơn của
MemberForm, trên trình đơn vừa xuất hiện bấm chọn Edit Names.
3.

Bấm chọn mục menuItem1 trên thanh thực đơn, nhập fileItem rồi ấn

Enter
Các phím truy xuất cho các mục trình đơn này chỉ có sẵn khi trình đơn thật sự
được hiển thị. Các mục trình đơn được truy xuất nói chung cũng sẽ có các phím tắt mà
người sử dụng có thể nhấn bất cứ lúc nào để gọi lệnh tương ứng.
Chọn trình đơn Save Member trong trình đơn File trong MemberForm,
chọn shortcut trong cửa sổ Properties. Chọn CtrlS từ danh sách thả xuống.
4.

Chú ý: Mặc dù các giá trị cho các phím tắt có tên như CtrlS, AltF4,… khi chúng
được hiển thị trên trình đơn, chúng sẽ xuất hiện như sau: Ctrl + S và Alt+F4.
5.
Có 1 thuộc tính khác là ShowShortcut bên dưới thuộc tính Shortcut.
Thuộc tính này quyết định phím tắt được hiển thị trên trình đơn hay không khi ứng
dụng chạy. Kiểm tra rằng thuộc tính này được thiết lập True.
6.
Thay đổi các phím tắt cho các mục trình đơn dùng các giá trị trong bảng sau.
Phải đảm bảo rằng thuộc tính ShowShortcut cho mỗi mục trình đơn còn lại được thiết lập
True.

Mục

Phím tắt


NewItem

CtrlN

openItem

Ctrl

printItem

CtrlP

exitItem

AltF4

Các mục trình đơn có thể được làm cho sử dụng được hoặc không (chúng
không có sẵn hoặc bị làm mờ đi), phụ thuộc vào các hành động và ngữ cảnh hiện thời.
7.
Bấm chọn mục menuPrint trên trình đơn File, sau đó bấm chọn Enable
trong cửa sổ Properties. Chọn tùy chọn False từ danh sách thả xuống. ta sẽ viết code để
cập nhật thuộc tính này thành true sau khi dữ liệu được hiển thị.
Kiểm tra trình đơn
1.

Từ trình đơn Debug, chọn Start (F5) để biên dịch và chạy ứng dụng

15



2.
Khi form xuất hiện, bấm chọn File (Alt+F) khi đó trình đơn mới xuất
hiện. Ở đây các phím tắt của lệnh Print không được hiển thị sẵn.
3.

Đóng form lại.

Các thuộc tính của mục thực đơn khác
Các mục trình đơn có 1 số ít các thuộc tính khác. Bảng dưới đây mô tả những thuộc
tính chung nhất.

Thuộc tính

Mô tả

Name

Thuộc tính này là tên của thực đơn

Checked

Các mục thực đơn có thể hành động như các hộp kiểm và hiện
ra dấu kiểm khi chúng được bấm chọn. Thiết lập thuộc tính này
thành True để hiện thị dấu kiểm, thiết lập False để che dấu

DefaultItem

Thuộc tính này chỉ ra mục thực đơn là mục mặc định hay
không, nếu thiết lập true thì khi người sử dụng nhấp đôi chuột

lên thực đơn cha lệnh tương ứng với mục này sẽ được thực thi.
Các mục mặc định xuất hiện nét đậm khi chúng được hiển thị

Enable

Thuộc tính này chỉ ra mục trình đơn có sẵn dung hay không.
Nếu không có sẵn dùng được nó sẽ bị mờ đi và người dùng sẽ
không thể chọn nó được

RadioCheck

Thuộc tính này hoạt động liên kết với thuộc tính Checked. Nếu
RadioCheck là true thì mục thực đơn xuất hiện với “radio dot”
chứ không là dấu kiểm khi nó được chọn

Shortcut

Thuộc tính này chỉ ra phím tắt người dùng có thể nhấn để thực
thi lệnh tương ứng

ShowShortcut

Nếu thuộc tình là true, phím tắt được hiển thị trên thực đơn
cùng với dòng văn bản của mục trình đơn

Text

Đây là dòng văn bản hiển thị trên trình đơn cho mục trình đơn.
Có thể dùng ký tự & để chi ra phím truy xuất


Visible

Thuộc tính này quyết định một mục có được hiển thị trên trình
đơn hay không. Thường thì dùng thuộc tính Enable để cho thấy
rằng một mục trình đơn có mặt nhưng không sẵn dùng.

Các sự kiện trình đơn

16


Có 5 sự kiện trình đơn khác nhau có thể xảy ra khi người sử dụng đặt được truy
xuất tới một mục thực đơn.
Sự kiện

Mô tả

Click

Sự kiện này xảy ra khi người sử dụng bấm lên mục trình đơn

DrawItem

Sự kiện này xảy ra khi mục trình đơn được vẽ lại.

MeasureItem

Sự kiện này xảy ra khi trình thực thi đang quyết định độ cao của
mục trình đơn. Có thể sẽ không sử dụng sự kiện này thường xuất


Popup

Sự kiện này xảy ra khi trình đơn được thực hiện, sử dụng sự kiện
này để điều chỉnh động các thuộc tính của mục trình đơn, tùy
trường hợp và ngữ cảnh hiện thời.

Select

Sự kiện này xảy ra khi người dùng chọn mục trình đơn nhưng
chưa được bấm chọn.

3.2 Các sự kiện popup và chia sẻ
Hầu hết các ứng dụng windows hiện đại đều có trình đơn popup, xuất hiện khi
nhấn phải chuột form hay thành phần điều khiển. Những trình đơn này thường theo
ngữ cảnh và chỉ hiển thị những lệnh nào có thể áp dụng cho form hay thành phần điều
khiển hiện thời đang được focus.
Tạo trình đơn popup
Trình đơn popup thứ nhất được gắn vào 2 thành phần điều khiển Textbox có tên
là firstname và lastname và cho phép người dùng xóa các thành phần này. Trình đơn
thứ 2 được gắn vào form và chứa các lệnh để lưu thông tin của thành viên hiện thời và
xóa form. Để thực hiện điều này cần dùng 1 trình đơn đang tồn tại và tạo 1 trình đơn
mới.
Tạo trình đơn popup firstname và lastname
1. Trong cửa sổ Design View đang hiển thị MemberForm, rẽ thành phần điều
khiển ContextMenu từ hộp công cụ và thả nó lên form. Một đối tượng
ContextMenu là contextMenu1 xuất hiện cuối form.

17



2. Chọn thành phần điều khiển contextMenu1, nhập vào textboxMenu trong hộp
văn bản (name) trong cửa sổ Properties rồi ấn Enter.
Khi chọn trình đơn popup(textboxMenu) có thể nhận thấy văn bản “Context
Menu” cũng xuất hiện trên thanh trình đơn của MemberForm. Trình đơn không xuất
hiện ở đó khi form chạy.
3.3. Thực đơn ngữ cảnh
Thực đơn ngữ cảnh (ContextMenu) là loại thực đơn gắn với một điều khiển cụ
thể nào đó, ví dụ như bấm hay một hộp soạn thảo… Khi người dùng nhấn phải chuột
vào điều khiển có gắn thực đơn ngữ cảnh thì thực đơn ngữ cảnh của điều khiển đó sẽ
hiện ra và cho phép người dùng chọn công việc từ thực đơn.

18


Tương tự như thực đơn Menu, thực đơn ngữ cảnh gồm nhiều phần tử thực đơn
được tổ chức dưới dạng cây phân cấp. Mỗi phần tử thực đơn có thể là Command
MenuItem hay Popup Menu Item. Tuy nhiên thực đơn ngữ cảnh không nằm trên đỉnh
của cửa sổ, nó gắn trực tiếp với một điều khiển nào đó và xuất hiện khi người dùng
nhấn chuột phải lên đối tượng tương ứng.
Thực đơn ngữ cảnh riêng biệt là thực đơn ngữ cảnh gắn với 1 điều khiển cụ thể,
các trạng thái của menu này chỉ dành riêng cho điều khiển chứa nó sử dụng.
Ví dụ: khi chọn Menu “đậm” của nút nào đó thì nội dung của nó hiển thị dạng
in đậm đồng thời menu tương ứng cũng ở trạng thái Checked và ngược lại. trạng thái
checked của mục “đậm” của menu ngữ cảnh thuộc nút bấm 1 không ảnh hưởng đến
thực đơn của nút bấm 2

19


Bài tâp: thiết kế form như sau


20


BÀI 4: THANH TRẠNG THÁI
4.1 Lớp statusbar
Thanh trạng thái là thanh nằm ngang dưới đáy cửa sổ hiển thị các thông tin về
trạng thái hoạt động của ứng dụng. Một thanh trạng thái có thể có nhiều mục trạng thái
(Status Item) khác nhau, mỗi mục thể hiện một loại thông tin nào đó tới người dùng.



Điều khiển statusstrip dùng để trình bày thông tin về điều khiển đang

thực hiện trên form


Một số các thuộc tính của statusstrip



Dock: chọn vị trí định vị trên form của điều khiển statusstrip



TextDirection: chọn hình thức trình bày statusStrip theo 3 cách



Items: Collection nắm giữ danh sách điều khiển


Chú ý: statusstrip được xem như điều khiển chứa các điều khiển khác.
4.2 Các bảng (panel) thanh trạng thái
4.2.1 Thanh trạng thái với các phần tử văn bản(ToolstripStatusLabel)
Điều khiển ToolstripStatusLabel trình bày chuỗi trên điều khiển StatusStrip
Form trên trình bày thanh status với 3 điều khiển toolstripStatusLabel : Ready,
user, Module trong đó điều khiển Ready có chèn biểu tượng Image.

21


4.2.2 Thanh trạng thái với phần tử là thanh tiến trình (Progress Bar)
Nếu muốn trên thanh trạng thái thể hiện trạng thái thực hiện của một công việc
nào đó, ta có thể đưa thanh tiến trình vào một phần tử trên thanh trạng thái

Ví dụ:
Thiết kế form gồm 1 listview, 1 button, toolstripprogressbar.
Khi người sử dụng click vào nút show thì sẽ load các file trong thư mục
windows\system32 trong ổ C và đưa ra tổng số file.

22


private void Form3_Load(object sender, EventArgs e)
{
this.listView1.Columns.Add("Name", 200,
HorizontalAlignment.Left);
this.listView1.Columns.Add("Files", 50,
HorizontalAlignment.Right);
listView1.View = View.Details;

}
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
// xóa dữ liệu trên điều khiển listview
listView1.Items.Clear();
// khai báo và khởi tạo đối tượng DirectoryInfo
DirectoryInfo dir = new DirectoryInfo(@"C:\WINDOWS\system32\");
ListViewItem item1;
// khai báo thuộc tính Maximum bằng số lượng tập tin
toolStripProgressBar1.Maximum = dir.GetFiles("*.*").Length;
// duyệt qua từng tập tin
foreach (FileInfo f in dir.GetFiles("*.*"))
{
item1 = new ListViewItem(f.Name );
item1.SubItems.Add( f.Length.ToString());
listView1.Items.Add(item1);
23


// khai báo thuộc tính value ứng với tập tin thứ i
toolStripProgressBar1.Value = i;
i++;
}
// gán tổng số lượng tập tin duyệt qua
toolStripStatusLabel1.Text = i.ToString()+" file(s)";
}

24



BÀI 5: CÁC HỘP THOẠI
Có 2 kiểu hộp thoại: kiểu Modal (bắt buộc nhập liệu) và kiểu Modaless (không
bắt buộc nhập liệu). Kiểu Modal yêu cầu người dùng phải hoàn tất thao tác nhập liệu
hoặc những yêu cầu chọn lựa trước khi quay trở về dòng hoạt động chính của chương
trình (ví dụ như các hộp thoại Options trong MS word). Hộp thoại kiểu Modaless có
thể được dùng để thực hiện thao tác nào đó nhưng vẫn cho phép người dùng tương tác
với phần còn lại của chương trình (ví dụ hộp thoại tìm kiếm Search Dialog).
Trong môi trường .NET, hộp thoại là thành phần thiết yếu của Windows Form.
Các điều khiển được đặt lên trên hộp thoại theo cùng cách mà người dùng để đặt trên
các cửa sổ form thông thường của ứng dụng – bằng công cụ trực quan hoặc bằng viết
code.
5.1 Hộp thoại thông điệp
Hộp thoại thông điệp được dùng với mục đích đơn giản hóa và tạo sự tương tác
thống nhất cho người dùng sử dụng hệ điều hành windows. Hộp thoại được hiển thị
bằng cách gọi hàm ShowDialog(). Tất cả các hộp thoại thông điệp đều ra đời và kế
thừa từ lớp System.Windows.Forms.CommonDialog.
Hộp thoại thường sử dụng nhất – FileDialog
Hộp thoại thường được sử dụng nhất trong các hộp thoại đó là hộp thoại mở,
đọc và ghi file (file dialog). Windows Forms định nghĩa hai loại hộp thoại dạng file đó
là hộp thoại mở file (open file dialog) và hộp thoại lưu file (save file dialog). Để dùng
các hộp thoại này trong ứng dụng cần phải khai báo biến thành viên có kiểu
OpenFileDialog hoặc SaveFileDialog trong lớp ứng dụng chính. Và cũng như các hộp
thoại cơ bản khác, 2 lớp này cũng bắt nguồn từ lớp System.Windows.Forms.Dialog.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Sams
{
class fileopenapp : System.Windows.Forms.Form

{
MainMenu m_menu;
MenuItem m_filemenu;
void OnOpenFile(Object sender, EventArgs e)
{
25


×