Mở đầu
•Biến, toán tử, biểu thức
•Viết phương thức vàáp dụng phạm
vi
•Cáccâulệnh lựa chọn
•Phátbiểu lặp
•Quản lý lỗi và ngoại lệ
409 trang |
Chia sẻ: Mr Hưng | Lượt xem: 1045 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Giáo trình Ngôn ngữ lập trình C#, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
báo cài
đặt bộ chỉ mục là ảo.
class RawInt: IRawInt{
......
public virtual bool this[int index]
{
get{......}
set{......}
}
}
16
• Có thể chọn cài đặt một bộ chỉ mục
dùng cú pháp cài đặt giao diện tường
minh:
struct RawInt: IRawInt{
......
bool IRawInt.this[int index]
{
get{......}
set{......}
}
}
1Chương 16
Ủy nhiệm hàm và
sự kiện
Nguyễn Hồng Phương
Khoa CNTT, ĐHBKHN
2Sử dụng khai báo ủy nhiệm hàm
và các thể hiện
• Một ủy nhiệm hàm là một kiểu trông
và hành xử như 1 phương thức.
• Ủy nhiệm hàm là 1 sự trừu tượng của
1 phương thức.
• Ta có thể coi nó là 1 phương thức
thông minh.
3Ví dụ không dùng ủy nhiệm hàm
• Viết 1 chương trình cứ mỗi giây thực
hiện 1 tác vụ
class Ticker{
public void Attach(Subscriber newSub){subscribers.Add(newSub);}
public void Detach(Subscriber newSub){subscribers.Remove(newSub);}
private void Notify(){
foreach(Subscriber s in subscribers){s.Tick();}
}
......
private ArrayList subscribers = new ArrayList();
}
4Ví dụ không dùng ủy nhiệm hàm
class Subscriber{
public void Tick(){......}
}
class ExampleUse{
static void Main(){
Ticker pulsed = new Ticker();
Subscriber worker = new Subscriber();
pulsed.Attach(worker);
.......
}
}
5Nâng cấp
interface Tickable{
void Tick();
}
class Ticker{
public void Attach(Subscriber newSub){subscribers.Add(newSub);}
public void Detach(Subscriber
newSub){subscribers.Remove(newSub);}
private void Notify(){
foreach(Tickable t in subscribers){ t.Tick(); }
}
......
private ArrayList subscribers = new ArrayList();
}
6Nâng cấp
class Clock: Tickable{
......
public void Tick(){......}
}
class ExampleUse{
static void Main(){
Ticker pulsed = new Ticker();
Clock wall = new Clock();
pulsed.Attach(wall);
.......
}
}
7Ví dụ dùng ủy nhiệm hàm
• Khai báo 1 ủy nhiệm hàm
– Có thể khai báo 1 ủy nhiệm hàm phù hợp với
chữ ký của phương thức Tick() ở trên:
delegate void Tick();
– Ví dụ này khai báo 1 kiểu mới: Tick là tên kiểu.
Có thể dùng tên kiểu để khai báo trong 1
trường hay 1 tham số:
void Example(Tick param){......}
• Kiểu ủy nhiệm hàm hoàn toàn được nhận
từ lớp System.Delegate. Kiểu ủy nhiệm
hàm có thể chứa phương thức, toán tử,
thuộc tính nên bạn có thể truyền chúng
như là tham số tới các phương thức khác.
8Gọi một ủy nhiệm hàm
Ví dụ trước:
void Example(Tick param){......}
• Nếu param là số int thì ta có thể sử
dụng giá trị của nó và áp dụng các
phép toán +,-,+=,...
• Tuy nhiên ở đây, param là 1 ủy
nhiệm hàm. Ta dùng ủy nhiệm hàm
như là 1 phương thức, gọi ủy nhiệm
hàm bằng các dấu ngoặc:
void Example(Tick param){ param(); }
9Gọi một ủy nhiệm hàm
• Một ủy nhiệm hàm là 1 kiểu tham
chiếu nên nó có thể là null. Nếu
param là null trong ví dụ trên thì
trình biên dịch sẽ đưa ra thông báo
NullReferenceException
• Phải gọi ủy nhiệm hàm 1 cách chính
xác. Trong ví dụ này, param có kiểu
là Tick, và Tick được khai báo như
sau:
delegate void Tick();
10
Gọi một ủy nhiệm hàm
• Việc khai báo này cho biết khi gọi 1 ủy
nhiệm hàm Tick (vd: param), ta không
được phép truyền bất kỳ đối số nào và lời
gọi không trả về điều gì:
void Example(Tick param){
param(42); // lỗi biên dịch
int result = param(); // lỗi biên dịch
Console.WriteLine(param()); // lỗi biên dịch
}
• Có thể khai báo 1 ủy nhiệm hàm với
bất kỳ chữ ký nào bạn muốn.
delegate void Tick(int hh, int mm, int ss);
11
Gọi một ủy nhiệm hàm
• Dùng ủy nhiệm hàm có tham số:
void Example(Tick method){
method(12, 29, 50);
}
12
Tạo 1 thể hiện của 1 ủy nhiệm hàm
• Dùng cú pháp như với lớp hay cấu trúc:
viết từ khóa new, theo sau là tên kiểu(tên
ủy nhiệm hàm), và theo sau là tên đối số
trong dấu ngoặc. Đối số phải là phương
thức có chữ ký phù hợp chính xác với chữ
ký của ủy nhiệm hàm. Ví dụ:
class Example{
private void Method(){......}
......
private void Create(){
Tick m = new Tick(this.Method);
}
}
13
Khai báo 1 sự kiện
• Viết từ khóa event, theo sau là tên
của kiểu (kiểu này phải là 1 kiểu ủy
nhiệm hàm) và sau nữa là tên của sự
kiện. Ví dụ:
delegate void TickHandler();
class Ticker{
public event TickHandler Tick;
}
14
Gắn 1 ủy nhiệm hàm với 1 sự kiện
• Tạo 1 thể hiện ủy nhiệm hàm (cùng
kiểu như sự kiện) và đính kèm thể
hiện ủy nhiệm hàm này tới sự kiện
dùng toán tử +=. Ví dụ:
class Clock{
......
public void Start(){
ticker.Tick += new TickHandler(this.RefreshTime);
}
private void RefreshTime(){......}
private Ticker ticker = new Ticker();
}
15
Tách 1 ủy nhiệm hàm ra
khỏi 1 sự kiện
• Tạo 1 thể hiện ủy nhiệm hàm cùng
kiểu như sự kiện và tách thể hiện ủy
nhiệm hàm này ra khỏi sự kiện dùng
toán tử -=. Ví dụ:
class Clock{
......
public void Stop(){
ticker.Tick -= new TickHandler(this.RefreshTime);
}
private void RefreshTime(){......}
private Ticker ticker = new Ticker();
}
16
Cài đặt 1 sự kiện
• Dùng dấu ngoặc chính xác như sự
kiện là 1 phương thức, cung cấp đối
số phù hợp kiểu. Nhớ kiểm tra sự
kiện có là null hay không. Ví dụ:
class Ticker{
public event TickHandler Tick;
......
private void Raise(){
if(Tick != null){ Tick(); }
}
}
1Chương 17
Toán tử nạp chồng
Nguyễn Hồng Phương
Khoa CNTT, ĐHBKHN
2Làm việc với các toán tử
• Bạn dùng các kí hiệu toán tử chuẩn (vd:
+, -) để thực thi các thao tác chuẩn (vd:
cộng, trừ) trên các kiểu (vd: int, double)
• Các kiểu số được xây dựng sẵn đi cùng với
các hành vị được định nghĩa trước của
chúng cho mỗi toán tử nhưng các kiểu
định nghĩa người dùng thì không.
• C# cho phép các kiểu định nghĩa người
dùng thực thi hành vi quen thuộc.
3Toán tử
• Mỗi kí hiệu toán tử có 1 quyền ưu
tiên. Vd: * có quyền cao hơn +
• Sự kết hợp từ trái qua phải hay từ
phải qua trái.
• Toán tử 1 ngôi là toán tử chỉ có 1
toán hạng,vd: ++
• Toán tử 2 ngôi là toán tử có 2 toán
hạng, vd: *
4Thực thi các ràng buộc toán tử
• C# cho phép bạn thực thi hầu hết các kí
hiệu toán tử đang tồn tại cho các kiểu của
chính bạn
• Các quy tắc:
– Không thể thay đổi độ ưu tiên và sự kết hợp
của 1 toán tử. VD: a+b*c thì luôn là a+(b*c).
– Không thể thay thế số toán hạng của 1 toán
tử.VD: Toán tử * luôn là 2 ngôi.
– Không thể phát minh ra kí hiệu toán tử mới.
VD: phép ** cho lũy thừa!!!
– Không thể thay đổi ý nghĩa của các toán tử khi
áp dụng cho những kiểu có sẵn.
– Có vài kí hiệu toán tử mà bạn không thể nạp
chồng.VD: toán tử chấm (truy cập thành phần)
5Các toán tử nạp chồng
• Để định nghĩa hành vi toán tử của
chính bạn, bạn phải nạp chồng 1 toán
tử được chọn.
• Bạn dùng cú pháp như phương thức
với kiểu trả về các tham số nhưng
tên của phương thức là từ khóa
operator cùng kí hiệu toán tử bạn
đang khai báo.
• Ví dụ: cấu trúc Hour định nghĩa toán
tử 2 ngôi để cộng 2 thể hiện của Hour
lại:
6Các toán tử nạp chồng
struct Hour{
public Hour(int initialValue){
value = initialValue;
}
public static Hour operator+(Hour lhs, Hour rhs){
return new Hour(lhs.value + rhs.value);
}
private int value;
}
•Tất cả các toán tử là toàn cục
•Toán tử là tĩnh. Các toán tử không bao giờ là đa hình, vì vậy
chúng không thể dùng ảo, trừu tượng, ghi đè, niêm phong.
•Toán tử không bao giờ có 1 tham số ẩn this như trong C++
7Tạo các toán tử đối xứng
void Direct(Hour a, int b){
Hour sum = a+b;
}
void Indirect(Hour a, int b){
Hour sum = a+new Hour(b);
}
struct Hour{
public Hour(int initialValue){ value = initialValue; }
public static Hour operator+(Hour lhs, Hour rhs){
return new Hour(lhs.value + rhs.value);
}
public static Hour operator+(Hour lhs, int rhs){
return lhs + new Hour(rhs);
}
public static Hour operator+(int lhs, Hour rhs){
return new Hour(lhs + rhs.value);
}
private int value;
}
8Tìm hiểu phép gán kết hợp
• C# không cho phép khai báo bất kì
toán tử gán định nghĩa người dùng.
Tuy nhiên, một toán tử gán kết hợp
(vd: +=) luôn được thực thi: a+=b
luôn được thực thi a=a+b.
void Example(Hour a, int b){
a+=a; // tương tự a=a+a
a+=b; // tương tự a=a+b
b+=a; //không hợp lệ
}
9Khai báo các toán tử tăng giảm
• C# cho phép khai báo phiên bản của
các toán tử tăng(++) và giảm(--)
của chính bạn.
struct Hour{
......
public static Hour operator++(Hour arg){
arg.value++;
return arg;
}
}
10
Các toán tử tăng giảm
Hour now = new Hour(9);
Hour postfix = now++;
Hour now = new Hour(9);
Hour prefix = ++now;
Hour now = new Hour(9);
Hour postfix = now;
now = Hour.operator++(now);
Hour now = new Hour(9);
now = Hour.operator++(now);
Hour postfix = now;
11
Sử dụng toán tử đôi
• Nếu đã khai báo phải khai báo != và ==
theo cặp.
• Quy tắc này không áp dụng cho ,
=.
struct Hour{
public Hour(int initialValue){......}
public static bool operator==(Hour lhs, Hour rhs){
return lhs.value==rhs.value;
}
public static bool operator!=(Hour lhs, Hour rhs){
return lhs.value!=rhs.value;
}
private int value;
}
12
Cấu trúc và lớp
• Việc thực thi toán tử tăng trong cấu
trúc Hour là chính xác, nhưng nếu đổi
Hour thành lớp thì không còn chính
xác nữa.
13
Khai báo các toán tử chuyển đổi kiểu
• Giá trị của 1 kiểu được chuyển sang
giá trị của 1 kiểu khác.
class Example{
public static void Method(double param){......}
}
Example.Method(42);// chuyển int sang double
• Không chuyển từ double sang int.
Muốn chuyển phải ép kiểu
14
Toán tử chuyển đổi định nghĩa
người dùng
• Cú pháp: toán tử chuyển đổi là toàn cục và tĩnh
struct Hour{
public static implicit operator int(Hour from){
return from.value;
}
private int value;
}
• Toán tử chuyển đổi không tường minh (implicit)
hay tường minh (explicit).
• Nếu toán tử chuyển đổi là tường minh thì nó yêu
cầu sự ép kiểu tường minh.
1Chương 18
Windows Forms
Nguyễn Hồng Phương
Khoa CNTT, ĐHBKHN
2Giới thiệu
• Một form đơn giản là lớp kế thừa từ
System.Windows.Forms.Form.
• Mã nguồn chứa các phương thức:
Main, Dispose, phương thức khởi
tạo,...
• Phương thức Main là điểm vào của
ứng dụng.
• Phương thức Dispose giải phóng các
tài nguyên mà form giữ.
3Các thuộc tính chung của Windows Forms
Thuộc tính Mô tả
(Name) Tên form. hai form trong cùng dự án
không được trùng tên.
BackColor Màu nền của văn bản hay hình ảnh
trên form
BackgroundI
mage
Hình nền của form. Nếu nhỏ hơn
form, nó sẽ được làm đầy form
Font Font dùng cho các thành phần nhúng
trên form, hiển thị văn bản. Nó bao
gồm: tên, kích thước, nghiêng,...
ForeColor Màu nổi bật của văn bản hay hình
ảnh trên form
4Các thuộc tính chung của Windows Forms
Thuộc tính Mô tả
FormBorderSt
yle
Diện mạo và kiểu đường viền form.
Mặc định là Sizable
Icon Icon xuất hiện trên thanh tác vụ
MaximizeBox Lệnh maximize trên trình đơn hay
thanh tiêu đề có tác dụng?
MaximumSize Kích thước lớn nhất của form. Mặc
định (0,0) chỉ ra rằng không có kích
thước lớn nhất và user có thể thay
đổi kích thước của form
MinimizeBox Đối ngẫu MaximizeBox
MinimumSize Đối ngẫu với MaximumBox
5Các thuộc tính chung của Windows Forms
Thuộc tính Mô tả
Size Kích thước của form khi lần đầu hiển
thị
Text Văn bản xuất hiện trên thanh tiêu
đề
WindowState Trạng thái khởi đầu của form khi nó
xuất hiện lần đầu
ControlBox Gỡ bỏ trình đơn hệ thống khỏi thanh
tiêu đề khi nó = False
Opacity Độ trong suốt của form
6Thay đổi thuộc tính ở thời gian chạy
• Có thể viết mã chương trình để thay
đổi động các thuộc tính ở thời gian
chạy.
• Ví dụ: thay đổi kích thước form.
• Thực hiện ví dụ BellRingers chương
18.
7Tạo ứng dụng Windows Forms
• Tạo ứng dụng Middleshire Bell Ringers
Association bằng cách tạo một dự án mới,
thiết kế giao diện, thêm các thành phần điều
khiển lên form.
• Các bước tiến hành:
– Khởi động VS.NET
– Từ trình đơn File, chọn New, chọn Project
– Trong khung Project Types, chọn Visual C#
Projects
– Trong khung Templates, chọn Windows Application
– Nhập vào hộp Name tên “BellRingers”
– Định vị dự án dùng Location.
8Tạo ứng dụng Windows Forms
– Bấm OK, một dự án mới được tạo ra, chứa một
form trống có tên là Form1
• Thiết lập các thuộc tính của form:
– Hiển thị cửa sổ Properties từ trình đơn view
– Dùng thuộc tính Name, đổi tên form thành
“MemberForm”
– Chọn thuộc tính Text, nhập “Middleshire Bell
Ringers Association – Members” để thay đổi
tiêu đề form
– Chọn thuộc tính BackgroundImage, bấm nút
tỉnh lược (...) mở hộp thoại, chọn file ảnh
Bell.gif
9Tạo ứng dụng Windows Forms
• Chọn thuộc tính BackColor, nhấn mũi
tên xuống, chọn thẻ System, bấm chọn
Windows để thiết lập màu nền cho tất
cả thành phần điều khiển thả trên
form.
• Chọn thuộc tính đa hợp Font, thiết lập
Size của font là 12, thuộc tính Bold là
True.
• Thay đổi thuộc tính đa hợp Size: thuộc
tính Width là 600, Height là 450
10
Tạo ứng dụng Windows Forms
• Biên dịch thử, thấy có lỗi vì ta đã thay
đổi tên form thành MemberForm
• Sửa chữa:
–Hiển thị mã nguồn Form1.cs bằng cách ấn
F7.
–Tìm phương thức Main, sửa lại đoạn mã
thành: Application.Run(new MemberForm());
• Tạo dựng và chạy lại ứng dụng thành
công.
11
Tạo ứng dụng Windows Forms
• Thêm các thành phần điều khiển lên
form:
12
Thiết lập giá trị cho các thuộc tính
của các điều khiển
Điều khiển Thuộc tính Giá trị
label1 Text
Location
First Name
10, 20
textBox1 (Name)
Location
Size
Text
firstName
120, 20
170, 26
để trống
label2 Text
Location
Last Name
300, 20
textBox2 (Name)
Location
Size
Text
lastName
400, 20
170, 26
để trống
13
Thiết lập giá trị cho các thuộc tính của các điều khiển
Điều khiển Thuộc tính Giá trị
label3 Text
Location
Tower
10, 72
comboBox1 (Name)
DropDownStyle
Location
Size
tower
DropDownList
120, 72
260, 28
checkBox1 (Name)
Location
Size
Text
CheckAlign
captain
400, 72
100, 26
Captain
MiddleLeft
label4 Text
Location
Size
Member Since
10, 128
120, 23
14
Thiết lập giá trị cho các thuộc tính của các điều khiển
Điều khiển Thuộc tính Giá trị
DateTimePicker (Name)
Location
Size
memberSince
140, 128
200, 26
groupBox1 (Name)
Location
Size
Text
experience
10, 184
260, 160
Experience
radioButton1 (Name)
Location
Size
Text
novice
16, 32
220, 24
Up to 1 year
radioButton2 (Name)
Location
Size
Text
intermediate
16, 64
220, 24
1 to 4 years
15
Thiết lập giá trị cho các thuộc tính của các điều khiển
Điều khiển Thuộc tính Giá trị
radioButton3 (Name)
Location
Size
Text
experienced
16, 96
220, 24
5 to 9 years
radioButton4 (Name)
Location
Size
Text
accomplished
16, 128
220, 24
10 or more years
checkedListBox1 (Name)
Location
Size
Sorted
methods
300, 192
270, 160
True
16
Thiết lập giá trị cho các thuộc tính của các điều khiển
Điều khiển Thuộc tính Giá trị
button1 (Name)
Location
Size
Text
add
190, 368
75, 40
Add
button2 (Name)
Location
Size
Text
clear
335, 368
75, 40
Clear
17
Thay đổi thuộc tính bằng mã lệnh
• Bạn đã học cách thiết lập giá trị các thuộc
tính lúc design.
• Bạn cũng có thể thiết lập và lấy giá trị thuộc
tính bằng mã chương trình, và đặc biệt, có 1
số thuộc tính chỉ có thể thiết lập ở thời gian
chạy.
• Chúng ta tiếp tục thực hành ví dụ trên bằng
cách tạo phương thức Reset:
– Từ trình đơn View, bấm chọn Class View
– Trong cửa sổ Class View, mở rộng dự án
BellRingers, bấm phải chuột lên lớp MemberForm
18
Thay đổi thuộc tính bằng mã lệnh
–Trỏ chuột đến Add, chọn Add Method
–Nhập Reset vào hộp Method name, bấm
Finish
–Trong cửa sổ soạn thảo, thêm dòng mã:
firstName.Text = “”;
lastName.Text = “”;
• Đưa dữ liệu vào ComboBox:
– thêm các phát biểu sau:
tower.Items.Clear();
tower.Items.Add(“Great Shevington”);
tower.Items.Add(“Little Mudford”);
tower.Items.Add(“Upper Gumtree”);
tower.Items.Add(“Downley Hatch”);
19
Thay đổi thuộc tính bằng mã lệnh
• Thiết lập ngày hiện thời: khởi tạo
thành phần DateTimePicker
memberSince tới ngày hiện thời
memberSince.Value = DateTime.Today;
• Khởi tạo CheckBox: CheckBox captain
mặc định là False
captain.Checked = false;
• Khởi tạo nhóm nút radio: sức mạnh
của radio tăng lên khi bạn đặt chúng
vào trong GroupBox. Thêm dòng sau:
novice.Checked = true;
20
Thay đổi thuộc tính bằng mã lệnh
• Điền giá trị vào ListBox: hoàn tất
phương thức Reset với các dòng:
methods.Items.Clear();
methods.ITems.Add(“Andover Bob Minor”);
methods.ITems.Add(“Antelope Place Doubles”);
methods.ITems.Add(“Hayfield Royal”);
methods.ITems.Add(“West Chiltington Doubles”);
methods.ITems.Add(“Brandon Parva Maximus”);
methods.ITems.Add(“Buckfast Abbey Triples”);
methods.ITems.Add(“Skelwith Bridge Minor”);
methods.ITems.Add(“Acton Trussel Bob Royal”);
21
Gọi phương thức Reset
Đặt Reset()
tại đây
22
Xử lý sự kiện trong Windows Forms
• Xử lý sự kiện cho nút Clear:
–Ở chế độ Design View, chọn nút Clear
trên form.
–Trong cửa sổ Properties, chọn Events.
–Chọn sự kiện Click.
–Nhập clearClicked vào và nhấn Enter.
–Viết mã:
private void clearClicked(object sender,
System.EventArgs e)
{
Reset();
}
23
Xử lý sự kiện trong Windows Forms
• Xử lý sự kiện cho nút Add:
– Ở chế độ Design View, chọn nút Add.
– Trong cửa sổ Properties, chọn Events.
– Chọn sự kiện Click.
– Nhập addClicked vào và nhấn Enter.
– Viết mã:
private void addClick(object sender, System.EventArgs e)
{
string details;
details = "Member name " + firstName.Text + "
" + lastName.Text +
" from the tower at " + tower.Text;
MessageBox.Show(details, "Member
Information");
}
24
Sự kiện Closing của form
• Được phát sinh khi user cố đóng
form trước khi form thực sự được
đóng lại.
• Có thể dùng sự kiện này để nhắc
user lưu dữ liệu hoặc hỏi họ có chắc
chắn không.
• Thực hành:
– Trở về chế độ Design View, chọn form
– Chọn Events, nhập “memberFormClosing”
trong sự kiện Closing rồi nhấn Enter
25
Sự kiện Closing của form
• Thêm lệnh sau vào:
private void memberFormClosing(object sender,
System.ComponentModel.CancelEventArgs e)
{
DialogResult key =
MessageBox.Show("Are you sure you want to quit",
"Confirm",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
e.Cancel = (key ==
DialogResult.No);
}
1Chương 19
Trình đơn
Nguyễn Hồng Phương
Khoa CNTT, ĐHBKHN
2Trình đơn và kiểu trình đơn
• Mục đầu tiên là trình đơn File, thường
có các lệnh: tạo mới, mở tài liệu, lưu
tài liệu, in tài liệu, thoát ứng dụng.
• Trình đơn Edit có: Cut, Paste, Clear,
Find,...
• Trình đơn Help ở cuối cùng chứa lệnh
giúp đỡ và thông tin “about”
• Tham khảo hướng dẫn trên web
3Tạo và xử lý các sự kiện trình đơn
• Có 2 cách để tạo trình đơn:
–Hướng đồ họa: dùng môi trường IDE
–Viết mã lệnh: tạo đối tượng MainMenu,
sau đó thêm đối tượng MenuItem
• Thực hành tạo trình đơn theo hướng
tiếp cận đồ họa cho ứng dụng
Middleshire Bell Ringers Association
trong chương 18.
4Tạo trình đơn File
• Mở dự án BellRingers
• Hiển thị MemberForm trong cửa sổ
Design View.
• Kéo thả thành phần MainMenu từ
Toolbox lên form.
• Bấm chọn nhãn Type Here, nhập
vào &File rồi nhấn Enter.
• Tiếp tục thêm &New, &Open, &Save
Member, dấu gạch ngang, &Print,
dấu gạch ngang, E&xit
5Tạo trình đơn File
6Thiết lập các thuộc tính của mục trình đơn
• Bấm chọn thành phần điều khiển
mainMenu1 bên dưới form. trong cửa
sổ Properties, thay đổi tên thành
mainMenu.
• Bấm chuột phải lên mục trình đơn
File trên thanh trình đơn của form,
chọn Edit Names.
7Thiết lập các thuộc tính của mục trình đơn
• Bấm chọn mục menuItem1, nhập fileItem,
nhấn Enter.
• Đổi tên các mục trình đơn còn lại:
Mục Tên mới
[menuItem2] newItem
[menuItem3] openItem
[menuItem4] saveItem
[menuItem6] printItem
[menuItem8] exitItem
• Khi hoàn tất, bấm phải chuột lên trình đơn
filemenu, bỏ chọn dòng lệnh Edit Names
8Thiết lập các thuộc tính của mục trình đơn
• Thêm phím tắt vào một mục trình đơn
bằng cửa sổ Properties:
– Chọn mục trình đơn Save Member trong trình
đơn File trên form. Bấm chọn Shortcut trong
cửa sổ Properties. Chọn CtrlS.
– Chọn thuộc tính ShowShortcut bên dưới, đặt
nó là true.(phím tắt được hiển thị)
– Làm tương tự với các mục khác:
NewItem(CtrlN), openItem(CtrlO),
printItem(CtrlP), exitItem(AltF4).
• Nếu muốn mục nào đó không thể chọn,
thiết lập thuộc tính Enabled trong cửa sổ
Properties là False. Ví dụ menuPrint không
thể chọn nếu chưa có dữ liệu.
9Các thuộc tính của mục trình đơn
Thuộc tính Mô tả
(Name) Tên của mục trình đơn
Checked Các mục hành động như hộp kiểm và hiện ra
dấu kiểm khi được chọn. Giá trị True/False
DefaultItem Mục trình đơn là mặc định hay không
Enabled Mục trình đơn rõ hay mờ đi
RadioCheck Liên kết với thuộc tính Checked
Shortcut Phím tắt
ShowShortcut Hiển thị phím tắt nếu là True
Text Dòng văn bản hiển thị
Visible Một mục có hiển thị hay không
10
Các sự kiện trình đơn
• Có 5 sự kiện trình đơn khác nhau khi user
truy xuất tới một mục trình đơn:
Sự kiện Mô tả
Click Xảy ra khi user bấm lên mục trình đơn
DrawItem Xảy ra khi mục trình đơn được vẽ lại
MeasureItem Xảy ra khi trình thực thi đang quyết định
độ cao của mục trình đơn.
Popup Xảy ra khi trình đơn được hiển thị
Select Xảy ra khi user chọn mục trình đơn
11
Xử lý các sự kiện mục trình đơn
• Sự kiện bấm chọn mục New trên File:
–Bấm chọn File và chọn New
–Trong cửa sổ Properties, nhấn Events, chọn
sự kiện Click, nhập newClick, ấn Enter
–Một phương thức sự kiện mới ra đời, nhập
vào đoạn mã dòng lệnh: Reset();
• Enabled của Print thành True:
printItem.Enabled = true;
• Phương thức sự kiện Click cho Exit:
nhập vào Close();
12
• Ép buộc tất cả các form đóng lại:
Application.Exit();
13
Trình đơn Popup
• Tạo trình đơn Popup:
–Tạo 1 trình đơn Popup gắn vào 2
textbox firstName và lastName cho
phép user xóa các thành phần này.
–Tạo 1 trình đơn Popup 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.
14
Tạo trình đơn Popup
• Trong cửa sổ Design View đang hiển thị
MemberForm, kéo thả điều khiển
ContextMenu vào form
• Chọn thành phần điều khiển
contextMenu1, đổi tên (Name) thành
textBoxMenu
• Bấm chọn văn bản Context Menu, nhãn
Type Here xuất hiện.
• Bấm chọn Type Here, nhập vào Clear
Text, ấn Enter.
• Chọn thành phần điều khiển Clear Text,
nhập textBoxClearItem trong hộp Name
của cửa sổ Properties rồi nhấn Enter.
15
Tạo trình đơn Popup
• Bấm chọn hộp văn bản firstName, đổi
thuộc tính ContextMenu thành
textBoxMenu.
• Tương tự với hộp văn bản lastName.
• Nhấp phải chuột lên thành phần
textBoxMenu ở cuối form, chọn Edit Menu.
Một trình đơn xuất hiện bên dưới nhãn
Context Menu
• Từ trình đơn, chọn Clear Text
• Trong cửa sổ Properties, chọn Events,
nhập “textBoxClearClick” vào hộp văn bản
sự kiện Click rồi nhấn Enter
16
Tạo trình đơn Popup
• Thêm phát biểu sau vào phương thức
sự kiện:
private void textBoxClearClick(object sender, System.EventArgs e)
{
if
(textBoxMenu.SourceControl.Equals(firstName))
{
firstName.Clear();
}
else
{
lastName.Clear();
}
} Nếu thuộc tính SourceControl của
trình đơn Popup tham chiếu tới
hộp văn bản firstName thì
firstName.Clear() sẽ làm rỗng nó
17
Tạo trình đơn Popup động sử dụng
mã chương trình
• Chuyển qua Code View của
MemberForm, xác định phương thức
khởi dựng cho MemberForm.
• Trình đơn Popup này sẽ chứa 2 mục
là Save member và Clear.
• Thêm dòng sau vào dưới Reset()
trong phương thức khởi dựng:
18
Tạo trình đơn Popup động sử dụng
mã chương trình
MenuItem[] formMenuItemList = new MenuItem[2];
formMenuItemList[0] =
saveItem.CloneMenu();
MenuItem clearItem = new
MenuItem("&Clear",
new System.EventHandler(clearClicked));
formMenuItemList[1] = clearItem;
ContextMenu formMenu = new
ContextMenu(formMenuItemList);
this.ContextMenu = formMenu;
1Chương 20
Thực thi hiệu lực
Nguyễn Hồng Phương
Khoa CNTT, ĐHBKHN
2Hiệu lực dữ liệu
• Thuộc tính Cause Validation: đều có ở các
điều khiển và form. Mặc định là True.
• Nếu là true, thì khi điều khiển đó nhận
focus và điều khiển trước mất focus sẽ
được hiệu lực.
• Nếu hiệu lực này thất bại thì focus sẽ trả
lại điều khiển trước.
• Nhận xét: thuộc tính Cause Validation
không áp dụng đối với bản thân điều khiển
đó nhưng có tác dụng với tất cả các điều
khiển khác trên form
3Các sự kiện hiệu lực
• Để hiệu lực dữ liệu trong một điều khiển,
bạn phải sử dụng 2 sự kiện: Validating và
Validated.
• Sự kiện Validating xuất hiện khi focus ra
khỏi 1 điều khiển và cố nhảy qua 1 điều
khiển có thuộc tính CauseValidation là
true. Dùng sự kiện này để kiểm tra giá trị
của 1 điều khiển đang mất focus.
• Sự kiện Validated xuất hiện sau sự kiện
Validating(nếu nó không bị hủy bỏ) nhưng
trước khi điều khiển đó mất focus. Bạn
không thể hủy bỏ sự kiện này.
4Thực hành
Tước vị: Mr, Mrs,
Miss, Ms
5Các bước
• Mở dự án CustomerDetails trong
chương 20.
• Nhấp đúp vào CustomerForm.cs để
hiển thị form trong vùng thiết kế.
• Nhập các giá trị tước vị vào mục
ITems của hộp comboBox Title.
• Quy tắc: Tước vị là Mr thì giới tính là
Male, ngược lại là Female.
6Phương thức titleValidating và
Các file đính kèm theo tài liệu này:
- dhbkhn_c__5173.pdf