Cc thuộc tính
Text: Nội dung hiển thị trn ComboBox
Items: Mảng cc mục cĩ thể chọn trong danh sch thả xuống
SelectedIndex: Số thứ tự của mục đang được chọn trong danh sách các mục
DropDownStyle: Dạng của ComboBox. Cĩ những kiểu sau:
o ComboBoxStyle.DropDown: Dạng thông dụng nhất (dạng mặc định khi bạn tạo ComboBox), người dùng có thể nhập dữ liệu như TextBox, hoặc có thể nhấn vào mũi tên bên phải để chọn các mục thường gặp trong danh sách
o ComboBoxStyle.DropDownList: Người dùng không thể nhập vào các giá trị giống như TextBox mà phải chọn chúng từ danh sách thả xuống bằng cách g cc ký tự đầu của mục cần chọn hoặc click chuột vào nút mũi tên bên phải để chọn.
o ComboBoxStyle.Simple: Dạng ít sử dụng, người dùng có thể nhập dữ liệu như TextBox, danh sách các mục để chọn luôn được hiển thị mà không cần phải sử dụng phím mũi tên bên phải
Cc sự kiện
SelectedIndexChanged: Pht sinh khi thuộc tính SelectedIndex thay đổi. Sự kiện này hay sử dụng với dạng DropDownList.
TextChanged: Phát sinh khi thuộc tính Text của ComboBox thay đổi, hay sử dụng khi dạng của ComboBox là DropDown.
53 trang |
Chia sẻ: aloso | Lượt xem: 1768 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Đề tài Chương trình Quản lý kế toán doanh nghiệp, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
(Phiếu nhập kho) thì sẽ làm công nợ nhà cung cấp tăng lên.
Khi doanh nghiệp trả tiền mặt cho nhà cung cấp (Phiếu chi tiền mặt) thì làm công nợ nhà cung cấp giảm.
Đối với khách hàng :
Khi xuất hàng cho khách hàng (Hóa đơn bán hàng) thì sẽ làm công nợ khách hàng tăng lên.
Khi doanh nghiệp thu tiền mặt của khách hàng trả nợ (Phiếu thu tiền mặt) thì làm công nợ khách hàng giảm.
Lập báo cáo tổng hợp công nợ khách hàng và nhà cung cấp.
Lập báo cáo công nợ chi tiết cho từng khách hàng và nhà cung cấp.
Cung cấp dữ liệu cho các phân hệ kế toán khác như : tổng hợp, tiền mặt, hàng hóa,…
Dữ liệu đầu vào và đầu ra của chương trình
Thông tin nhập
Danh mục chứng từ
Danh mục tài khoản
Danh mục hàng hóa
Danh mục nhóm hàng
Danh mục kho hàng
Danh mục khách hàng
Danh mục nhà cung cấp
Danh mục nhân viên
Danh mục thuế
Danh mục hình thức nhập xuất
Danh mục hình thức thanh toán
Các loại phiếu : Phiếu nhập và phiếu xuất
Thông tin xuất
Báo cáo tình hình thu, chi tồn quỹ tiền mặt
Báo cáo tình hình việc nhập xuất và tồn kho hàng hóa
Báo cáo công nợ khách hàng và nhà cung cấp
Cấu trúc chương trình
Danh mục ti khoản
Danh mục kho
Danh mục hng hĩa
Danh mục nhĩm hng
Danh mục khch hng
Danh mục nh cung cấp
Danh mục chứng từ
Danh mục nhn vin
Danh mục thuế
Danh mục tình hình nhập xuất
Danh mục hình thức thanh tốn
Hệ thống danh mục
Phn hệ quản lý tiền mặt
Cập nhật phiếu thu-chi
Bo co tiền mặt
Tổng hợp
Chi Tiết
Phn hệ quản lý hng hĩa
Cập nhật chứng từ nhập –xuất
Bo co hang hĩa
Tổng hợp
Chi tiết
Phn hệ kế tốn cơng nợ
Cập nhật phiếu thu-chi cơng nợ
Bo co cơng nợ
Tổng hợp
Chi tiết
Cơ sở dữ liệu của chương trình
Cấu trc table dữ liệu của chưng trình
tblKyketoan
tblKyketoan
FieldName
DataType
Description
Indexed
MaKy
Nvarchar(6)
M kỳ
Primery key
DienGiai
Nvarchar(50)
Diễn Giải
tblDMTK
tblDMTK
FieldName
DataType
Description
Indexed
MaTK
Nvarchar(20)
Số hiệu ti khoản
Primery
LoaiTK
Nvarcharr(1)
Loại TK
TenTK
Nvarchar(50)
Tn ti khoản
DVT
Nvarchar(20)
Đơn Vị tính
TKme
Nvarchar(3)
Ti khoản mẹ
BacTK
int
Bc ti khoản
tblKhachHang
tblKhachHang
Field
DataType
Description
Indexed
MaKh
Varchar(20)
M khch hang
Primery
TenKh
Text(255)
Tn khch hang
Diachi
Text(255)
Địa chỉ
SoDienThoai
Text(11)
Số điện thoại
tblNhaCungCap
tblNhaCungCap
Field
DataType
Description
Indexed
MaNCC
Varchar(20)
M nh cung cấp
TenNCC
Varchar(255)
Tn nh cung cấp
Diachi
Text(255)
Địa chỉ
SoDienThoai
Varchar(11)
Số điện thoại
tblChungTu
tblChungTu
FieldName
DataType
Description
Indexed
MaCT
Text(20)
M chứng từ
Primery
TenCT
Text(255)
Tn chứng từ
tblNhanVien
tblNhanVien
FieldName
DataType
Description
Indexed
MaNV
Text(10)
M nhn vin
Primery
TenNV
Text(25)
Tn nhn vin
ChuVu
Text(20)
Chức vụ
Diachi
Text(255)
Địa chỉ
SoDienThoai
Text(11)
Số điện thoại
tblDMThue
FieldName
DataType
Description
Indexed
MaSoThue
Text(30)
M số thuế
Primery
DienGiai
Text(255)
Diễn giải
Muc_Thue
Text
Mức thuế
tblTonDauky
tblTonDauky
FieldName
DataType
Description
Indexed
MaTK
Text(20)
Số hiệu ti khoản
Primery
MaKy
Text(6)
M kỳ kế tốn
Primery
SoLuongTonDK
Number
Số lượng tồn đầu kỳ
SoDuDK
Currency
Số dư đầu kỳ
tblPhieuthu
TblPhieuthu
FieldName
DataType
Description
Indexed
MaNV
Nvarchar(50)
M nghiệp vụ
Primary
Maky
Nvarchar(6)
M kỳ
MaCT
Nvarchar(20)
M chứng từ
NgayCT
datetime
Ngy chứng từ
MaKH
Nvarchar(20)
M khch hang
MaSoThue
Nvarchar(50)
M số thuế
Sotien
money
Số tiền
TK_No
Nvarchar(20)
Ti khoản nợ
TK_Co
Nvarchar(20)
Ti khoản cĩ
DienGiai
Nvarchar(50)
Diễn giải
tblPhieuchi
TblPhieuchi
FieldName
DataType
Description
Indexed
MaNV
Nvarchar(50)
M nghiệp vụ
Primary
Maky
Nvarchar(6)
M kỳ
MaCT
Nvarchar(20)
M chứng từ
NgayCT
datetime
Ngy chứng từ
MaNCC
Nvarchar(20)
M khch hang
MaSoThue
Nvarchar(50)
M số thuế
Sotien
money
Số tiền
TK_No
Nvarchar(20)
Ti khoản nợ
TK_Co
Nvarchar(20)
Ti khoản cĩ
DienGiai
Nvarchar(50)
Diễn giải
tblHDNhap
TblHDNhap
FieldName
DataType
Description
Indexed
SoCT
Nvarchar(20)
Số chứng từ
Primary
SoCTG
Nvarchar(20)
Số chứng từ gốc
DienGiai
Nvarchar(20)
Diễn giải
NgayCT
datetime
Ngy chứng từ
MaNVien
Nvarchar(20)
M nhn vin
MaNCC
Nvarchar(50)
M nh cung cấp
TyGia
int
Tỷ gi nhập
Makho
Nvarchar(50)
M kho
MaCT
Nvarchar(50)
M chứng từ
TK_No
Nvarchar(20)
Ti khoản nợ
TK_Co
Nvarchar(20)
Ti khoản cĩ
DienGiai
Nvarchar(50)
Diễn giải
Ma_HTTT
Nvarchar(5)
M hình thức thanh tốn
tblHDNhapchitiet
TblHDNhapchitiet
FieldName
DataType
Description
Indexed
SoCT
Nvarchar(20)
Số chứng từ
Primary
MaHH
Nvarchar(20)
M hng hĩa
MaThue
Nvarchar(20)
M thuế
DVT
Nvarchar(20)
Đơn vị tính
SLNhap
int
Số lượng nhập
Sotien
money
Số tiền
Tong
money
Tổng
tblHDXuat
TblHDXuat
FieldName
DataType
Description
Indexed
SoCT
Nvarchar(20)
Số chứng từ
Primary
SoCTG
Nvarchar(20)
Số chứng từ gốc
DienGiai
Nvarchar(20)
Diễn giải
NgayCT
datetime
Ngy chứng từ
MaNVien
Nvarchar(20)
M nhn vin
MaNCC
Nvarchar(50)
M nh cung cấp
TyGia
int
Tỷ gi Xuat
Makho
Nvarchar(50)
M kho
MaCT
Nvarchar(50)
M chứng từ
TK_No
Nvarchar(20)
Ti khoản nợ
TK_Co
Nvarchar(20)
Ti khoản cĩ
DienGiai
Nvarchar(50)
Diễn giải
Ma_HTTT
Nvarchar(5)
M hình thức thanh tốn
tblHDXuatchitiet
TblHDXuatchitiet
FieldName
DataType
Description
Indexed
SoCT
Nvarchar(20)
Số chứng từ
Primary
MaHH
Nvarchar(20)
M hng hĩa
MaThue
Nvarchar(20)
M thuế
DVT
Nvarchar(20)
Đơn vị tính
SLXuat
int
Số lượng nhập
Sotien
money
Số tiền
Tong
money
Tổng
tblNhomHH
tblChungTu
FieldName
DataType
Description
Indexed
MaNhomHH
Nvarchar(20)
M nhĩm
Primery
TennhomHH
Nvarchar(50)
Tn nhĩm
tblDMHH
TblDMHH
FieldName
DataType
Description
Indexed
MaHH
Nvarchar(20)
M hng hĩa
Primary
MaNhomHH
Nvarchar(20)
M nhĩm hng hĩa
TenHH
Nvarchar(20)
Tn hng hĩa
DVT
Nvarchar(20)
Đơn vị tính
Quycach
Nvarchar(20)
Quy cch
DGNhap
money
Đơn giá nhập
DGXuat
money
Đơn giá xuất
Sơ đồ các Module kế toán
Hệ thống kế tốn
Danh mục
Hệ thống
Quản lý hng hĩa
Quản lý cơng nợ
Quản lý tiền mặt
Sơ đồ hệ thống kế toán
Sử dụng SQL Server 2005 để thiết kế bảng dữ liệu chương trình
Hệ thống bảng dữ liệu
Phn hệ quản lý tiền mặt
Mơ hình quan hệ thực thể
Mơ hình quan hệ
Xy dựng Module xử lý mẫu tin
CREATE proc [dbo].[sp_Phieuchi]
@mode int,
@MaCT nvarchar(20),
@NgayCT datetime,
@MaNCC nvarchar(20),
@TKNo nvarchar(20),
@TKCo nvarchar(20),
@SoTien int,
@DienGiai nvarchar(50),
@MaThue nvarchar(20)
as
if(@mode = 1) --Them
begin
if not exists(select * from tblPhieuchi where MaCT = @MaCT and MaNCC=@MaNCC )
begin
INSERT INTO tblPhieuchi (MaCT, NgayCT,MaNCC, TKNo, TKCo, SoTien,DienGiai,MaThue)
VALUES(@MaCT, @NgayCT, @MaNCC, @TKNo, @TKCo, @SoTien,@DienGiai,@MaThue)
end
end
if(@mode =-1) --Xoa
begin
delete from tblPhieuchi where MaCT = @MaCT
end
if(@mode = 0) --Sua
begin
if exists(select * from tblPhieuchi where MaCT = @MaCT)
begin
update tblPhieuchi set MaCT=@MaCT,
NgayCT=@NgayCT,
MaNCC=@MaNCC,
TKNo=@TKNo,
TKCo=@TKCo,
SoTien=@SoTien,
DienGiai=@DienGiai,
MaThue=@MaThue
where MaCT = @MaCT
end
end
Phn hệ quản lý hng hĩa
Mơ hình quan hệ thực thể
//chưa hoàn thành
Phn hệ quản lý cơng nợ
Mơ hình quan hệ thực thể
//chưa hoàn thành
Thiết kế chương trình
Biểu đồ use case
biểu đồ use case Danh mục
biểu đồ use case kế toán tiền mặt
Use case Phn hệ kế tốn hang hĩa
Use case Phn hệ quản lý cơng nợ
Use case Bo co
Biểu đồ tuần tự
//chưa hoàn thành
3. Biểu đồ tương tác
//chưa hoàn thành
4. Biểu đồ lớp
//chưa hoàn thành
Chương III. Ngôn ngữ lập trình
Giới thiệu về ngơn ngữ C#
Một số đặc điểm của C#
Thực ra, môi trường .NET cho phép bạn viết bằng nhiều ngôn ngữ khác nhau. Các chương trình được viết bằng các ngôn ngữ khác nhau cuối cùng đều dịch ra được cùng một dạng là m CLR. Bạn có thể lập trình trên .NET bằng nhiều ngôn ngữ như VB .NET, VC++ .NET hoặc cả Delphi. Tuy nhiên, trong phạm vi giáo trình này, chúng tôi xin giới thiệu ngôn ngữ .NET do ngôn ngữ này có các đặc điểm như đơn giản, trong sáng và gọn gàng. Sau đây là một số đặc điểm cụ thể của C#:
a. c# là ngôn ngữ đơn giản
Loại bỏ các thành phần ngôn ngữ phức tạp (như MACRO của C++), template, đa kế thừa của Java và C++.
C# dựa trên nền tảng của ngôn ngữ C và C++ (các cú pháp và từ khóa hầu hết được kế thừa từ C, C++). Nhưng loại bỏ đi các tốn tử v từ khĩa phức tạp.
c# là ngôn ngữ hiện đại
c# bao gồm đầy đủ các đặc tính của một ngôn ngữ lập trình hiện đại: Hướng đối tượng, xử lý ngoại lệ, thu gom bộ nhớ tự động, kiểu dữ liệu mở rộng, bảo mật m nguồn.
c# là ngôn hướng đối tượng
c# gồm đầy đủ các đặc điểm của một ngôn ngữ hướng đối tượng, bao gồm: sự đóng gói, sự kế thừa, tính đa hình. Các đặc điểm này giúp cho việc phát triển các ứng dụng bằng ngôn ngữ C# trở nên bền vững hơn. Người phát triển có thể xây dựng ứng dụng theo nhiều lớp, tạo nên một hệ thống hoàn chỉnh và khó đổ vỡ trong khoảng thời gian ít hơn.
d. c#là ngôn ngữ ít từ khĩa
Sự phức tạp của C++ được tạo nên bởi số lượng đồ sộ các từ khóa và toán tử. Chính điều này đa gây ra nhiều khó khăn không cần thiết cho người lập trình. C# tránh được nhược điểm này bằng tiêu chí: Càng ít từ khóa càng tốt. Theo thống kê, C# chỉ gồm hơn 100 từ khóa nhưng thực hiện được mọi yêu cầu từ đơn giản đến phức tạp
Các khi niệm trong C#
Lớp (class), đối tượng (object)
Trong sinh học cĩ khi niệm lồi (lồi người, loài mèo...) và mỗi cá thể cụ thể trong loài (ông Nguyễn Văn A, con mèo A, con mèo B...). Trong lập trình hướng đối tượng:
Lớp (class) tương ứng với loài
Đối tượng (object) tương ứng với từng cá thể trong loài
Như vậy, mỗi loài có thể có nhiều cá thể khác nhau thuộc loài đó
Trong lập trình truyền thống, bạn cĩ thể khai bo cc biến với kiểu của chng. Một cch đơn giản, có thể hiểu:
Lớp (class) l kiểu biến
Đối tượng (object) là một giá trị tương ứng với kiểu
Tĩm lại, trong lập trình hướng đối tượng, cc cơng việc của bạn gồm :
Khai báo các lớp (gồm các thuộc tính, các phương thức của lớp đó)
Khai báo các đối tượng thuộc các lớp
Hoạt động của chương trình l sự tc động qua lại giữa các đối tượng
Stack v Heap
C# phân chia bộ nhớ thành 2 dạng: Stack & Heap:
Stack là dạng vùng nhớ dạng vào sau ra trước (các giá trị được đưa vào sau thì được lấy ra trước). Stack thường sử dụng để lưu các biến tạm (không có chu kỳ sống dài)
Heap là dạng vùng nhớ được cấp phát cho các biến có chu kỳ sống lâu dài.
Trong ngơn ngữ C v C++:
Stack được sử dụng để lưu các biến được khai báo trong hàm và chương trình con. Mỗi khi một biến được khai báo trong chương trình con, gi trị của nĩ được lưu vào trong stack. Khi thoát khỏi chương trình con, cc gi trị ny sẽ được lấy ra khỏi stack theo thứ tự ngược với thứ tự khai báo
Heap được sử dụng để lưu các biến được tạo bằng từ khóa new, các lệnh malloc... Các biến này phải được giải phóng bằng các lệnh delete hoặc free khi không sử dụng đến. Nguyên tắc này thường gây nhiều lỗi do:
Lập trình vin qun giải phĩng biến đ xin cấp pht
Biến bị giải phĩng 2 lần
Biến đ bị giải phĩng nhưng các đoạn chương trình sử dụng chng khơng biết v vẫn tiếp tục sử dụng
Cc lỗi kể trn rất dễ xảy ra kể cả với lập trình vin giu kinh nghiệm. Những lỗi ny lại rất khĩ tìm v l những lỗi nghim trọng cĩ thể gy đổ vỡ hoàn toàn hệ thống.
Kiểu gi trị(value type),kiểu tham chiếu(reference type)
Việc sử dụng vùng nhớ stack và heap của C++ rắc rối, phức tạp và dễ gây lỗi cho chương trình. C# đưa ra những cải tiến sau:
Chia cc kiểu biến thnh 2 kiểu: Kiểu gi trị (value type) v kiểu tham chiếu (reference type)
Kiểu gi trị (value type) gồm
Kiểu cấu trc
Cc kiểu số nguyn (byte, int, long)
Các kiểu số thực dấu phẩy động (float, double)
Cc kiểu số thực thập phn (decimal)
Kiểu bool
Các struct do người dùng định nghĩa (nên hạn chế dùng kiểu này)
Kiểu liệt k (enum)
Kiểu tham chiếu (reference type) gồm
Lớp (class)
Giao diện (interface)
Ủy thc (delegate)
Kiểu gi trị l kiểu m khi thực hiện php gn, toàn bộ giá trị của vế phải được sao chép và gán vào biến bên vế trái. Do đặc tính này, giá trị của biến value type thường nằm trong stack (khi các biến này được khai báo trong hàm).
Kiểu tham chiếu là kiểu mà các biến lưu dữ liệu trên heap. Các biến là tham chiếu (reference – gần giống khái niệm con trỏ trong C & C++) đến dữ liệu trên heap. Một dữ liệu có thể có nhiều biến tham chiếu đến. Khi thực hiện lệnh gán, phần dữ liệu trên heap không được sao chép mà chỉ có tham chiếu đến dữ liệu này được chép sang vế trái. Khi đó, sẽ có thêm 1 biến nữa tham chiếu đến dữ liệu trên heap.
Để hiểu r hơn về kiểu giá trị và kiểu tham chiếu, hy quan st ví dụ sau:
Biến & Kiểu
C php khai bo biến của C# giống với c php khai bo của C++. Ch ý:
Biến có thể được khai báo tại:
Trong một lớp, khi đó các biến được gọi là biến thành viên của lớp
Trong một hàm, khi đó biến có thể khai báo ở bất cứ nơi nào trong hàm, không nhất thiểt phải nằm ở đầu hàm.
Biến được khai báo ở khối chương trình no thì cĩ hiệu lực trong phạm vi của khối đó. Khi chương trình chạy ra ngồi khối thì biến khơng cịn tồn tại.
C# giống với C và C++, phân biệt chữ hoa và chữ thường. Tên biến cũng phân biệt chữ hoa và chữ thường, do đó bạn phải nhập vào đúng tên biến. Rất may, chế độ tự động (auto-complete) của VS2005 rất tốt, bạn hầu như không phải nhập đầy đủ 1 tên biến nào. Do đó, khả năng nhầm tên biến chữ hoa chữ thường rất hiếm khi xảy ra.
;
= ;
, ;
Ví dụ
int i; // Biến kiểu số nguyn
string s; // Biến kiểu xu ký tự
double a = 10; // Biến kiểu số thực kp
double a, b, c = 20, d;
Quy ước đặt tên biến
Bắt đầu bằng chữ cái, không bắt đầu bằng chữ số.
Tn biến cĩ thể chứa chữ ci, chữ số, ký tự “_”, nhưng không chứa các ký tự đặc biệt.
Độ dài tối đa của tên biến là 255 ký tự.
Kiểu biến
Biến được sử dụng để lưu các giá trị, giá trị có thể là số (số thứ tự, số người...), có thể là dạng văn bản (xâu ký tự). Ngồi ra biến cĩ thể ở dạng phức tạp, ví dụ mảng: chuỗi các giá trị cùng kiểu sắp xếp liên tiếp, hoặc kiểu dữ liệu do người dùng định nghĩa.
Khi bạn đ biết lập trình trn một ngơn ngữ, việc hiểu kiểu biến của một ngơn ngữ khc l tương đối đơn giản.
Biến kiểu số
Kiểu
Mơ tả
Kích thước
Khoảng gi trị
Ví dụ
byte
Số nguyn
8 bit
0..255
short
Số nguyn ngắn
16 bit
-32768.. 32767
int
Số nguyn
32 bit
-2147483648.. 2147483647
long
Số nguyn di
64 bit
float
Số thực độ chính xác đơn
32 bit
double
Số thực độ chính xác kép
64 bit
ushort
Số nguyn ngắn khơng dấu
16 bit
uint
Số nguyn khơng dấu
32 bit
ulong
Số nguyn di khơng dấu
64 bit
Biến kiểu xu ký tự
Mỗi ký tự trong my tính tương ứng với một số hiệu. Một chuỗi các ký tự ghép với nhau tạo ra một xâu ký tự (String). Nếu bạn đ quen thuộc với m ASCII của, đặt tương ứng 256 giá trị với 256 ký tự thì xu ký tự của C# cĩ một cht khc biệt: Xu ký tự trong C# l xu ký tự Unicode, mỗi ký tự trong xu ny cĩ thể l 1 trong hơn 60000 ký tự của tất cả các ngôn ngữ. Do đó, vấn đề bảng m, ngơn ngữ trong C# được giải quyết triệt để từ gốc.u
String trong C# được ký hiệu trong cặp ngoặc kp, ví dụ:
string FirstWord;
string SecondWord;
FirstWord = "Hello";
SecondWord = "World";
string Greeting = FirstWord + SecondWord; // Greeting by giờ l "HelloWorld"
Greeting = FirstWord + " " + SecondWord;
Biến kiểu bool
Kiểu bool là kiểu biến cơ bản, có mặt trong hầu hết các ngôn ngữ. Biến logic (bool) chỉ mang hai giá trị là true (đúng) và false (sai).
Biến kiểu bool thường được sử dụng với các toán tử logic (&&, ||, ^, !). Cc biểu thức so snh trả về gi trị kiểu bool.
Biến kiểu mảng
Mảng l kiểu dữ liệu phức gồm nhiều gi trị cng kiểu sắp xếp lin tiếp nhau. Các phần tử này được truy xuất qua chỉ số. Chú ý, chỉ số của mảng C# giống như mảng trong C và C++, được bắt đầu từ 0;
Mảng trong C# rất linh hoạt và được hỗ trợ một số lượng lớn các hàm sắp xếp, tìm kiếm, thm, xĩa...
Cú pháp khai báo mảng trong C# như sau
[] ; // Mảng chưa được khởi tạo, không sử dụng được
[] = new [];
long[] N;
long[] M = new long[3];
N[0] = 1;
M[0] = 1;
M[1] = 2;
M[2] = 3;
M[3] = 4;
M = new long[100];
for (int i=0; i<100; i++) {
M[i] = i;
}
C php khai bo mảng của C# trơng cĩ vẻ kỳ cục (nếu như bạn đ quen với C++). Tuy nhin, nếu xt về mặt logic thì khai bo kiểu ny hợp lý hơn nhiều. Nếu theo đúng quy ước khai báo biến:
int i; // Biến i kiểu int
string a; // Biến a kiểu string
int[] M; // Biến M kiểu int[] (tức l kiểu biến chứa nhiều số int, kiểu mảng)
Đoạn m dưới đây minh họa sự mềm dẻo của mảng trong C#. Trong đó có sử dụng hàm sắp xếp để sắp mảng A theo chiều tăng dần. Bạn chú ý rằng khác với mảng trong C++, mảng trong C# đều phải được khởi tạo bằng toán tử new. Ngoài ra, bạn có thể dễ dàng lấy kích thước của mảng bằng thuộc tính Length (xem ví dụ). Đây là điều rất thuận lợi so với mảng trong C++ (mỗi mảng phải kèm theo một biến lưu chiều dài của mảng, dễ gây nhầm lẫn khi sử dụng quá nhiều mảng)
int i;
// Xin 100 phần tử cho mảng A
int[] A = new int[100];
// ran: Đối tượng sinh ngẫu nhin
Random ran = new Random();
// gn gi trị ngẫu nhin cho cc phần tử của mảng A
for (i = 0; i < A.Length; i++) A[i] = ran.Next(500);
for (i = 0; i < A.Length; i++) Console.Write("{0} ", A[i]);
Console.ReadLine();
Array.Sort(A);
for (i = 0; i < A.Length; i++) Console.Write("{0} ", A[i]);
Console.ReadLine();
Để khai báo mảng nhiều chiều, ta sử dụng cú pháp tương tự. Bạn có thể quan sát ví dụ sử dụng mảng 2 chiều dưới đây.
using System;
using System.Collections.Generic;
using System.Text;
namespace testHello {
class Program {
static void Main(string[] args) {
// M được khởi tạo l mảng 2 chiều, mỗi chiều 10 phần tử
int[,] M = new int[10, 10];
// Dng 2 vịng lặp để gn cc phần tử hng i, cột j
// Gi trị được gn l tích của i, j (gần giống bảng cửu chương)
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++) M[i, j] = i * j;
// Ghi gi trị của mảng 2 chiều ra mn hình
// Trong 2 vịng lặp lồng nhau ny, ta sử dụng cc hm
// - GetLowerBound(level) để xác định cận dưới của mảng
// - GetUpperBound(level) để xác định cận trn của mảng
// - level l lớp chỉ số, ví dụ M[i, j]
// - Chỉ số i tương ứng với level 0 (đầu tin)
// - Chỉ số j tương ứng với level 1
for (int i = M.GetLowerBound(0); i <= M.GetUpperBound(0); i++) {
for (int j = M.GetLowerBound(1); j <= M.GetUpperBound(1); j++)
Console.Write("{0, 3}", M[i, j]);
// Ghi M[i, j] theo quy cch (chiếm 3 ký tự)
Console.WriteLine();
}
Console.ReadLine();
}
}
}
Cc kiểu biến khc
Bạn có thể sử dụng các kiểu biến cơ sở của C#, có thể sử dụng mảng để lưu trữ nhiều giá trị. Tuy nhiên, chúng ta đ biết .NET framework được xây dựng lên từ một thư viện đồ sộ các đối tượng hỗ trợ cho công việc lập trình của bạn. Trong phần này, chúng tôi xin giới thiệu một số kiểu dữ liệu (các lớp) được cung cấp từ các thư viện này. Đây là các kiểu dữ liệu có thể hỗ trợ rất nhiều cho bạn trong quá trình pht triển cc ứng dụng, nhất l ứng dụng trong lĩnh vực Tin học hỗ trợ thiết kế Xy dựng.
Kiểu List
Mảng là một trong những kiểu dữ liệu được sử dụng phổ biến nhất, mảng dùng để lưu một danh sách các phần tử cùng kiểu. Tuy vậy, hạn chế của mảng là số lượng phần tử cố định (thực tế có thể thay đổi được nhưng phức tạp), việc thêm, xóa phần tử vào mảng tương đối khó khăn.
C# cung cấp kiểu dữ liệu List (trong đó hai dấu thể hiện đây là kiểu dữ liệu có tham số, trong đó tham số là kiểu phần tử của danh sách (giống với khái niệm lớp mẫu – template – của C++).
Add(pt): Thm một phần tử vào cuối danh sách. Kiểu của tham số pt phải là kiểu của phần tử của danh sách đ khai bo.
Remove(pt): Xóa khỏi danh sách tất phần tử đầu tiên có giá trị bằng pt. Chú ý, phương thức này không nên sử dụng khi ta đ biết số thứ tự của pt trong danh sách (khi đó nên dùng RemoveAt).
RemoveAt(i): Xóa khỏi danh sách phần tử có chỉ số i (danh sách cũng giống mảng, chỉ số bắt đầu từ 0). Phương thức này sẽ nhanh hơn Remove() vì đ biết vị trí của phần tử trong danh sch (khơng phải duyệt cả danh sch).
Clear(): Xóa toàn bộ các phần tử để trở thành danh sách trống (giống khi mới khởi tạo)
Insert(i, pt): Chèn phần tử pt vào trong danh sách tại vị trí i (các phần tử từ vị trí i trở đi sẽ được đẩy ra lấy chỗ cho phần tử mới)
ToArray(): Chuyển danh sch thnh dạng mảng. Nếu bạn muốn chương trình chạy thật nhanh thì nn chuyển danh sch ra mảng (vì mảng hoạt động nhanh hơn). Danh sách tuy chậm hơn nhưng lại có ưu điểm là dễ sử dụng, nhiều tiện ích. Do đó bạn nên có sự lựa chọn thích hợp giữa các lựa chọn sau:
Sử dụng mảng để có tốc độ cao (khi xử lý tính toán)
Sử dụng List để có sự mềm dẻo
Kiểu Dictionary
Tốn tử
Cc tốn tử của C# giống với cc tốn tử của C v C++, bao gồm cc tốn tử một ngơi v tốn tử 2 ngơi. Trong khuơn khổ của gio trình ny, chng tơi chỉ trình by cc tốn tử đơn giản và phổ biến nhất.
Cc tốn tử 2 ngơi
Tốn tử
Giải thích
Ví dụ
Kết quả
*
Nhn
2 * 3
6
/
Chia
6 / 2
3
+
Cộng
2 + 3
5
-
Trừ
6 – 3
3
%
phần dư
11 % 3
2
Cc tốn tử 1 ngơi
Tốn tử
Giải thích
Ví dụ
Kết quả
++
Tăng 1 đơn vị
a++
--
Giảm 1 đơn vị
a--
+=
Tăng
a += 10
-=
Giảm
a -= 10
*=
a *= 10
/=
a /= 10
!
!a
Biểu thức
Biểu thức l sự kết hợp của cc gi trị, biến, tốn tử với nhau. Biểu thức biểu diễn trn my tính cĩ dạng gần giống với biểu thức tốn học m chúng ta thường sử dụng: Các toán tử không được thực hiện theo thứ tự từ trái sang phải mà có sự ưu tiên giữa các toán tử, bảng sau đây liệt kê thứ tự ưu tiên (từ cao đến thấp) của các toán tử trong cùng một biểu thức.
Thứ tự
Tốn tử
Ví dụ
Kết quả
1
Ngoặc ()
(2 + 3) * 7
35
|, &, ^
2
*, /, %
2 + 3 * 7
23
3
+, -
10 – 4 * 2 + 1
3
Php gn
Phép gán làm nhiệm vụ đưa một giá trị mới vào trong biến, giá trị này được tính từ các giá trị đ cĩ bằng cc biểu thức. C php của php gn như sau
= ;
Tốn tử so snh
Các toán tử so sánh dùng để so sánh các giá trị (biểu thức) với nhau, giá trị trả về là kiểu Boolean (True – đúng hoặc False – sai)
Tốn tử
Mơ tả
Ví dụ
Kết quả
==
Bằng
7 == 2
false
>
Lớn hơn
6 > 3
true
<
Nhỏ hơn
5 < 11
true
>=
Lớn hơn hay bằng
23 >= 23
true
<=
Nhỏ hơn hay bằng
4 <= 21
true
!=
Khc
3 != 3
false
Tốn tử logic
Các điều kiện logic có thể được kết hợp với nhau bằng các toán tử logic
Tốn tử
Mơ tả
Ví dụ
Kết quả
&&
Cả hai toán hạng cùng đúng
2 < 3 && 4 < 5
true
||
Ít nhất một trong hai tốn hạng đúng
2 > 3 || 6 < 7
True
^
Một toán hạng đúng, 1 toán hạng sai
2 4
False
!
Đảo
!(3 == 3)
False
Các cấu trúc điều khiển
Chương trình muốn hoạt động theo sự điều khiển không chỉ có các lệnh gán mà cịn phải gồm các lệnh điều khiển (rẽ nhánh, lặp...). Các lệnh này cho phép chương trình hoạt động theo một kịch bản xác định.
Cấu trc if rt gọn
if () ;
Kiểm tra điều kiện (biểu thức logic)
Điều kiện phải được đặt trong cặp ngoặc
Điều kiện là 1 biểu thức logic
Nếu điều kiện là đúng (true) thì thực hiện
Nếu điều kiện sai (false) thì bỏ qua, khơng thực hiện cc lệnh
Nếu muốn thực hiện nhiều lệnh, đưa các lệnh này vào trong cùng 1 khối lệnh bắt đầu bằng { và kết thúc bằng }
Cấu trúc if đầy đủ
if ()
;
else
;
Kiểm tra điều kiện
Nếu điều kiện đúng, thực hiện nhánh đúng.
Nếu điều kiện sai, thực hiện nhánh sai.
Ch ý:
Nếu là lệnh đơn, kết thúc nhánh đúng phải bằng dấu chấm phẩy
Nếu nhánh đúng hoặc nhánh sai là nhiều lệnh, đưa chúng vào trong 1 khối chương trình bằng cặp ngoặc { }
Cấu trc rẽ nhiều nhnh switch
switch () {
case :
;
break;
case :
;
break;
case :
case :
;
break;
default:
break;
}
Kiểm tra gi trị của một , ty theo gi trị của biểu thức l gì thì thực hiện cc lện tương ứng. Khác với lệnh if chỉ có tối đa 2 nhánh, lệnh switch có thể chia nhiều nhánh, rất thích hợp cho các lệnh điều kiện phức tạp.
Vịng lặp while
while ()
;
Trong khi điều kiện cịn đúng thì thực hiện . Vịng lặp kiểm tra điều kiện trước khi thực hiện. Có nghĩa là có thể không được thực hiện một lần nào khi sai ngay từ đầu.
Để thực hiện nhiều lệnh trong vịng lặp, ta nhĩm cc lệnh vo trong một khối chương trình bằng cặp ngoặc {}
Vịng lặp do ... while
do
;
while ();
Khc với vịng lặp while, vịng lặp do ... while thực hiện trước rồi mới kiểm tra điều kiện. Từ đặc điểm này, có thể khẳng định sẽ được thực hiện tối thiểu 1 lần (kể cả trong trường hợp là sai).
Ch ý với những người quen sử dụng Pascal, vịng lặp do ... while sẽ lặp lại trong trường hợp là đúng (phân biệt với repeat ... until của Pascal, lặp lại nếu điều kiện sai)
Vịng lặp for
for ([Lệnh khởi tạo] ; [Điều kiện kiểm tra] ; [Lệnh thay đổi])
;
Vịng lặp for sẽ thực hiện cc cơng việc sau đây:
Khởi đầu vịng lặp bằng cch gọi [Lệnh khởi tạo] (thường là lệnh khởi tạo biến đếm)
Lặp đi lặp lại các bước sau
Kiểm tra [Điều kiện kiểm tra], nếu sai thì thốt khỏi vịng lặp, nếu đúng thì thực hiện tiếp cc bước tiếp sau
Thực hiện
Thực hiện [Lệnh thay đổi] (thường là các lệnh tăng hoặc giảm biến đếm)
Cấu trc vịng lặp for của C# giống với cấu trc for của C, khi qut hơn nhiều so với cấu trúc for của Pascal.
Ba thnh phần trong vịng lặp for đều được để trong ngoặc móc, có nghĩa là các thành phần này có thể không cần thiết. Ở trường hợp đơn giản nhất, vịng lặp for sẽ khơng cĩ cả 3 thnh phần ny. Khi đó, nếu không có lệnh thoát khỏi vịng lặp ở bn trong , vịng lặp l vịng lặp vơ hạn.
Vịng lặp foreach
foreach( in )
;
thường là kiểu mảng hoặc List, Dictionary, Stack, Queue.
Biến được lần lượt gán với từng phần tử của , mỗi lần lặp chương trình thực hiện .
Biến phải được khai báo kiểu bên trong vịng lặp, chỉ cĩ gi trị trong phạm vi vịng lặp.
Vịng lặp foreach gip việc lập trình trở nn đơn giản, dễ hiểu hơn. Hy xem ví dụ sau:
R rng, đoạn chương trình trn cùng chức năng với đoạn chương trình in số v tính tổng (ví dụ của vịng lặp for). Tuy nhin, đoạn chương trình viết bằng foreach đơn giản và dễ hiểu hơn nhiều.
Theo khuyến co của Mircosoft, bạn khơng nn dng vịng lặp foreach ở những nơi cần tốc độ thực thi cao (do vịng lặp ny chạy chậm hơn vịng lặp for).
Hàm – Phương thức
Cũng như tất cả các ngôn ngữ lập trình khc, khi cĩ nhiều cơng việc được thực hiện lặp đi lặp lại bởi cùng một đoạn code, cách tốt nhất là đưa đoạn code này vào một chương trình con để có thể sử dụng lại nhiều lần. Trong Pascal, chương trình con cĩ thể l thủ tục (procedure) hoặc hm (function). Đối với C#, các hàm bao giờ cũng là phương thức của một lớp xác định nào đó:
Gọi hàm phải thông qua đối tượng nếu hàm khai báo thường (không có từ khĩa static)
Gọi hm phải thơng qua lớp nếu hm khai bo static (hm tĩnh)
[public | private | protected] [static] (danh sch tham số) {
return ;
}
Giống như C, nếu hàm không trả về gi trị thì l void.
Cc từ khĩa public hoặc private chỉ ra phạm vi của hm.
Hm public là hàm có thể được gọi từ bất cứ đâu trong chương trình.
Hm private là hàm chỉ có thể gọi được trong lớp khai báo hàm đó
Hm protected l hm chỉ cĩ thể gọi được trong lớp khai báo hàm hoặc các lớp kế thừa lớp này
Từ khĩa static
Hm bình thường không khai báo từ khóa static. Khi đó hàm là phương thức của đối tượng, có thể sử dụng các biến thành viên khai báo bên trong đối tượng. Hàm bình thường được gọi thơng qua đối tượng.
Hm khai bo static l hm tĩnh. Hm l phương thức của lớp, chỉ có thể sử dụng các biến thành viên của lớp (cũng khai báo static) mà không thể sử dụng các biến thành viên của bất cứ đối tượng nào trong lớp (vì hm khơng thuộc đối tượng). Hàm tĩnh được gọi thơng qua lớp.
Cc dạng tham số
Cải tiến từ các ngôn ngữ như C, C++ và Pascal, C# đưa ra 3 dạng tham số:
Đầu vào
Đầu ra (out)
Tham chiếu (ref)
Chức năng
Đầu vào
Đẩu ra (out)
Tham chiếu (ref)
Khai bo
int Tinh(int a);
int Tinh(out int a);
int Tinh(ref int a);
Gọi hm
Tham số l một biểu thức
Tinh(10);
Tinh(b+10);
Tham số l một biến
int b;
Tinh(out b);
Tham số là 1 biến, vừa là đầu vào, vừa là đầu ra nên phải khởi tạo giá trị ban đầu:
int b = 10;
Tinh(ref b);
Thay đổi giá trị tham số
Gi trị đưa vào là biểu thức, mọi thay đổi của tham số không ảnh hưởng đến chương trình gọi
Tham số đưa vào là một biến, mọi thay đổi giá trị của tham số bên trong hàm sẽ thay đổi biến này
Tham số đưa vào là một biến, mọi thay đổi giá trị của tham số bên trong hàm sẽ thay đổi biến này
Sử dụng
Truyền gi trị từ bn ngồi vo hm
Truyền kết quả từ bn trong hm ra ngồi
Truyền gi trị từ bn ngồi vo bn trong hm. Hm truyền lại kết quả từ bn trong ra ngồi
Ngoại lệ (Exception)
Khi bạn viết một chương trình, mục tiêu cao nhất là chương trình hoạt động chính xác và không bị lỗi. Tuy nhiên, lỗi chương trình l khơng thể trnh khỏi vì người lập trình khơng bao giờ lường trước được mọi khả năng của hệ thống. Sau đây là một số ví dụ về những trường hợp người lập trình ít khi lường trước hoặc không thể lường trước được:
Lỗi không xuất phát từ chương trình do chng ta pht triển m lại xuất pht từ cc thư viện được sử dụng bởi chương trình.
Tài nguyên hệ thống không đáp ứng được yêu cầu (bộ nhớ không đủ, ổ cứng bị đầy, thiết bị đang sử dụng bị rút ra...)
Đối với các ngôn ngữ thế hệ cũ, mỗi khi gặp lỗi chương trình cĩ thể dừng ngay v tồn bộ dữ liệu của người dùng bị mất. Để tránh trường hợp xấu này, các ngôn ngữ thế hệ mới cung cấp cơ chế quản lý ngoại lệ (Exception).
C php của việc bắt v xử lý lỗi được mô tả như sau:
try {
// Đoạn chương trình thực hiện bình thường
}
catch {
// Đoạn chương trình được thực hiện khi cĩ lỗi
// Xử lý lỗi
}
finally {
// Đoạn chương trình dọn dẹp
// Đoạn này luôn được gọi kể cả cĩ lỗi hay khơng
}
Lập trình winform
Trước .NET, để tạo các giao diện trên Windows, người dùng có thể sử dụng các phương pháp sau:
Lập trình với cc hm API, cch ny tạo giao diện rất phức tạp, địi hỏi người lập trình cĩ kiến thức su về các hàm API của Windows. Thời gian phát triển các ứng dụng bằng phương pháp này rất chậm.
Lập trình với MFC: Visual C được cung cấp một loạt các lớp nền tảng, người lập trình C++ cĩ thể sử dụng cc lớp ny để tạo giao diện dễ dàng hơn nhiều so với sử dụng API. MFC được sử dụng kết hợp với ClassWizard tạo cơ chế visual cho phép người lập trình "vẽ" giao diện thay vì dng dịng lệnh.
Lập trình với Visual Basic: VB cung cấp cch thức dễ dng nhất để tạo giao diện (so với 2 phương pháp trước). Người dùng dễ dàng tạo các form, đưa vào đó các control và viết m lệnh cho cc control ny. Nhược điểm của phương pháp này lại nằm trong ngôn ngữ, VB không phải là ngôn ngữ hướng đối tượng nên việc tạo các control do người dùng định nghĩa là rất khó khăn. Đặc biệt không thể tạo được các control trong quá trình chạy chương trình (runtime).
.NET kết hợp toàn bộ các ưu điểm của các phương pháp trên. Việc tạo giao diện với .NET có những đặc điểm sau:
Dễ dàng: Giống như VB, người dùng có thể dễ dàng dùng chuột để vẽ các control trn form
Đa dạng: Số lượng control do .NET cung cấp đang dạng hơn nhiều so với các control của VB (Ví dụ: các Panel, Split Panel,...). Giúp người dùng có nhiều lựa chọn tạo các giao diện chuẩn mà không phải sử dụng thêm các giải pháp của các hng thứ 3.
Ty biến: Song song với việc vẽ các control trên form, VS2005 phát sinh các đoạn m lệnh tạo ra cc control ny. Bản chất cc control được tạo ra từ m lệnh, do đó người lập trình cĩ thể tạo cc control trong qu trình chạy chương trình (runtime)
Tồn bộ cc thành phần giao diện Winform của .NET được đặt trong nhóm thư viện System.Windows.Forms.
Control
Các ứng dụng có giao diện gồm nhiều control khác nhau. .NET cung cấp hệ thống hàng trăm control chuẩn cho phép bạn sử dụng trên giao diện của mình. Cơ chế lập trình hướng đối tượng cho phép người dùng chỉnh sửa lại các control theo ý muốn. Thậm chí, họ cĩ thể tạo ra cc control mới của ring mình. Trong phần ny chng ta sẽ tìm hiểu về cc thuộc tính, sự kiện chung của tất cả cc control.
Tất cả các control đều được kế thừa từ lớp cơ bản System.Windows.Forms.Control. Lớp này được xây dựng với các chức năng cơ bản như làm việc với bàn phím, chuột, thay đổi vị trí và kích thước...
Trong môi trường VS2005, khi bạn đưa một control vào form, Visual Studio thực hiện cc cơng việc sau:
Khai báo một biến với kiểu là kiểu của control được đưa vào. Tên biến chính là thuộc tính Name của control.
Trong phương thức InitializeComponent của form, tạo mới đối tượng control
Đặt các thuộc tính của control. Mỗi khi bạn thay đổi các thuộc tính của control trên cửa sổ design, Visual Studio sẽ tạo ra các lệnh gán thuộc tính tương ứng. Ví dụ: Khi bạn dịch chuyển, thay đổi kích thước của control, các lệnh gán thuộc tính Location, Size sẽ thay đổi theo.
Sử dụng phương thức Add của danh sách control của form để thêm control này vào form.
Nếu người dùng thêm các sự kiện của control, Visual Studio cũng thêm các lệnh gắn sự kiện với các hàm tương ứng trong phương thức InitializeComponent.
Bạn có thể sửa đổi các đoạn lệnh khởi tạo trong phương thức InitializeComponent. Tuy nhiên, việc này chỉ nên thực hiện khi bạn đ am hiểu cơ chế sinh code của VS2005. Để tránh người dùng vô ý can thiệp vo cc đoạn code này, Visual Studio tách đoạn lệnh của InitializeComponent ra một file riêng. Nếu form có tn l Form1:
File Form1.cs chứa các đoạn m do người dùng tạo ra
File Form1.Designer.cs chứa các đoạn m do Visual Studio tự động tạo ra (Khai báo biến control, phương thức InitializeComponent)
Việc sửa đổi khai báo và lệnh trong file Form1.Designer.cs sẽ được trình by trong cc phần sau.
Khi đ nắm r cơ chế tự động tạo control của VS, bạn có thể lập trình để tạo ra các control khi chương trình chạy (runtime).
Do tất cả các control đều được kế thừa từ System.Windows.Forms.Control. Các phương thức, thuộc tính, sự kiện của lớp control sẽ được sử dụng trong tất cả các control khác.
Cc thuộc tính
Tn thuộc tính
Kiểu
Mơ tả
Name
String
Tên của control. Name được sử dụng để làm tên biến nên phải đặt tên theo quy ước tên biến
Location
System.Drawing.Point
Vị trí của góc trái trên của control, là gồm 2 tọa độ (x, y)
Left
Double
Tọa độ của cạnh trái của control
Top
Double
Tọa độ của cạnh trên của control
Size
System.Drawing.Size
Kích thước của control, đối tượng kiểu
Width
Double
Chiều rộng của control
Height
Double
Chiều cao của control
Text
String
Đoạn văn bản của control (tùy theo loại control mà đoạn văn bản này được hiển thị ở các vị trí khác nhau)
Visible
Boolean
= True nếu control được nhìn thấy, = False nếu control bị ẩn
Enabled
Boolean
= True nếu control sử dụng được (ví dụ nút bấm có thể bấm được, ô nhập textbox có thể nhập giá trị), = False nếu control không sử dụng được
Font
Font chữ của control
Focused
Boolean
Nếu người dùng g phím, trong một thời điểm, chỉ có một control nhận được phím ny. Control đó là control chiếm focus của hệ thống. Focused = True khi control đang chiếm focus.
Các phương thức
Tên phương thức
Mơ tả
FindForm
Trả về form chứa control
Focus
Đặt control là focus của hệ thống
Show
Hiện control
Hide
Ẩn control
Invalidate
Cập nhật control
Cc sự kiện
Tn sự kiện
Mơ tả
Click
Pht sinh khi control bị click (bằng chuột hoặc bn phím)
GotFocus
Phát sinh khi control nhận được Focus
LostFocus
Pht sinh khi control mất Focus
KeyDown
Phát sinh khi một phím được nhấn xuống (trong khi control nhận Focus)
KeyPress
Phát sinh khi hệ thống thông báo có một ký tự được nhấn và thả ra (hoặc giữ trong 1 khoảng thời gian) trong khi control nhận Focus
KeyUp
Phát sinh khi một phím đang nhấn được thả ra (trong khi control nhận Focus
MouseDown
Phát sinh khi người dùng nhấn phím chuột trong lúc con trỏ chuột ở trong phạm vi của control
MouseEnter
Phát sinh khi con trỏ chuột bắt đầu vào trong phạm vi của control
MouseHover
MouseLeave
Pht sinh khi con trỏ chuột rời khỏi phạm vi của control
MouseMove
Pht sinh khi con trỏ chuột di chuyển trn phạm vi của control
MouseUp
Phát sinh khi người dùng thả phím chuột trong lúc con trỏ chuột ở trong phạm vi của control
MouseWheel
Phát sinh khi người dùng lăn phím lăn của chuột khi control nhận Focus
Move
Phát sinh khi Control thay đổi vị trí
Paint
Phát sinh khi Control được vẽ lại
Resize
Phát sinh khi Control thay đổi kích thước
Validating
Phát sinh khi Control đang được kiểm tra
Validated
Phát sinh khi Control đ được kiểm tra
TextChanged
Phát sinh khi thuộc tính Text của control thay đổi
Các control cơ bản
Phần ny xin trình by cc control cơ bản của .NET. Mỗi control được trình by gồm mơ tả,
danh sch cc thuộc tính, cc sự kiện thơng dụng v cc ví dụ p dụng.
Button
Control Button kế thừa các tính chất của System.Windows.Form.Control. Sử dụng để người dùng thực hiện các lệnh trên hộp thoại.
Thuộc tính Text: Nội dung hiển thị trn Button
Sự kiện Click: Khi người dùng click chuột lên nút hoặc dùng bàn phím nhấn Enter, space khi nút đang focus hoặc kích hoạt nút bằng phím nóng
TextBox
Sử dụng để người dùng nhập dữ liệu dạng văn bản và số trên hộp thoại
Thuộc tính Text: Nội dung của TextBox
Sự kiện TextChanged: Phát sinh khi người dùng nhập, sửa văn bản trên TextBox
Sự kiện Validating: Phát sinh khi người dùng dời khỏi ô nhập dữ liệu (ô TextBox mất focus). Sự kiện này dùng để kiểm tra tính hợp lệ của các giá trị nhập vào trên ô TextBox.
Label
Sử dụng để cung cấp thêm thông tin cho các control khác (TextBox, ListBox, ComboBox)
Thuộc tính Text: Nội dung hiển thị trn Label
Sự kiện Click: Người dùng click chuột hoặc sử dụng phím tắt để tác động lên Label.
CheckBox
Sử dụng để người dùng đưa ra lựa chọn có hoặc không
Thuộc tính Text: Nội dung ch thích hiển thị trn CheckBox
Thuộc tính Checked: True nếu CheckBox đang được đánh dấu. Ngược lại là False
Thuộc tính CheckState: Trạng thi cụ thể của CheckBox
CheckState.Checked: CheckBox được đánh dấu
CheckState.Unchecked: CheckBox được bỏ đánh dấu
CheckState.Indeterminate: CheckBox chưa được chọn (người dùng chưa tác động vào CheckBox)
Sự kiện CheckedChanged: Phát sinh khi người dùng chuyển trạng thái lựa chọn của CheckBox
RadioButton
Sử dụng để lựa chọn một mục trong nhóm nhiều mục.
Thuộc tính Text: Nội dung ch thích hiển thị trn RadioButton
Thuộc tính Checked: True nếu RadioButton đang được đánh dấu. Ngược lại là False
Sự kiện CheckedChanged: Phát sinh khi người dùng chuyển trạng thái lựa chọn của RadioButton
ComboBox
Các chức năng
Sử dụng để nhập giá trị (như TextBox) nhưng có hỗ trợ người dùng lựa chọn nhanh các giá trị thường gặp trong danh sách.
Sử dụng để người dùng lựa chọn một giá trị trong nhiều giá trị khác nhau
Cc thuộc tính
Text: Nội dung hiển thị trn ComboBox
Items: Mảng cc mục cĩ thể chọn trong danh sch thả xuống
SelectedIndex: Số thứ tự của mục đang được chọn trong danh sách các mục
DropDownStyle: Dạng của ComboBox. Cĩ những kiểu sau:
ComboBoxStyle.DropDown: Dạng thông dụng nhất (dạng mặc định khi bạn tạo ComboBox), người dùng có thể nhập dữ liệu như TextBox, hoặc có thể nhấn vào mũi tên bên phải để chọn các mục thường gặp trong danh sách
ComboBoxStyle.DropDownList: Người dùng không thể nhập vào các giá trị giống như TextBox mà phải chọn chúng từ danh sách thả xuống bằng cách g cc ký tự đầu của mục cần chọn hoặc click chuột vào nút mũi tên bên phải để chọn.
ComboBoxStyle.Simple: Dạng ít sử dụng, người dùng có thể nhập dữ liệu như TextBox, danh sách các mục để chọn luôn được hiển thị mà không cần phải sử dụng phím mũi tên bên phải
Cc sự kiện
SelectedIndexChanged: Pht sinh khi thuộc tính SelectedIndex thay đổi. Sự kiện này hay sử dụng với dạng DropDownList.
TextChanged: Phát sinh khi thuộc tính Text của ComboBox thay đổi, hay sử dụng khi dạng của ComboBox là DropDown.
Các phương thức
int FindStringExact(string s): Tìm số thứ tự của mục cĩ nội dung s
2. Binding thuộc tính của đối tượng với Control
Trong qu trình pht triển cc ứng dụng cĩ giao diện nĩi chung v cc ứng dụng Winform nĩi ring. Những người mới bắt đầu thường gặp phải khó khăn trong việc phân biệt phần giao diện và phần dữ liệu.
Các control chỉ sử dụng để thể hiện hoặc nhập dữ liệu (giao tiếp với người dùng). Cịn dữ liệu thực sự được lưu tại các biến thành viên và thuộc tính trên các đối tượng.
Trong cc ngơn ngữ lập trình khc, để trao đổi về dữ liệu giữa control và cc biến thnh vin, lập trình vin phải thực hiện nhiều thao tc phức tạp:
Hiển thị dữ liệu từ đối tượng lên control
Kiểm tra dữ liệu người dùng nhập trên control
Đưa các dữ liệu người dùng nhập từ control và đối tượng
Chương IV. Xây Dựng Chương Trình
Giao diện chính của chương trình
Một số lớp dùng để mở kết nối dữ liệu
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
namespace ChuongtrinhQLKT
{
class connet
{
private string str_Connection = "Data Source=" + Environment.MachineName + "\\SQLEXPRESS; Database = Quanlyketoan; Integrated Security = True";
public SqlConnection con;
public DataTable dt = new DataTable();
public connet()
{
if(TestConnection()==false)
{
MessageBox.Show("Chương trình cần SQL Server mới cĩ thể chạy được!!!","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
Application.Exit();
}
else
{
OpenConnection();
}
}
public void OpenConnection()
{
con = new SqlConnection(str_Connection);
if(con.State == ConnectionState.Closed)
con.Open();
}
public bool TestConnection()
{
SqlConnection test_Con = new SqlConnection(str_Connection);
try
{
test_Con.Open();
test_Con.Close();
return true;
}
catch
{
Application.Exit();
return false;
}
}
public SqlConnection getConnection
{
get{return con;}
}
public DataSet getDataset(string str)
{
SqlDataAdapter da=new SqlDataAdapter(str,con);
DataSet ds=new DataSet();
da.Fill(ds);
return ds;
}
public DataTable getDataTable(string sql)
{
SqlDataAdapter da = new SqlDataAdapter(sql, getConnection);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
}
Form cập nhập phiếu thu
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ChuongtrinhQLKT
{
public partial class FrmPhieuthu : Form
{
connet ket_noi = new connet();
DataTable dtKH = new DataTable();
DataTable dtTK = new DataTable();
DataTable dtTK1 = new DataTable();
DataTable dtThue = new DataTable();
DataTable dtCT = new DataTable();
DataTable dtPhieuthu = new DataTable();
public int n = 0;
public FrmPhieuthu()
{
InitializeComponent();
}
public void setcontrol(bool f)
{
btnLuu.Enabled = f;
btnHuy.Enabled = f;
btnThem.Enabled = f;
btnXoa.Enabled = f;
btnSua.Enabled = f;
}
public void setcontrol1(bool f)
{
cmbMaKh.Enabled = f;
txtTenKH.Enabled = f;
txtDiachi.Enabled = f;
cmbTKNo.Enabled = f;
txtTenTKNo.Enabled = f;
cmbTKCo.Enabled = f;
txtTenTKCo.Enabled = f;
cmbThue.Enabled = f;
txtDienGiai.Enabled = f;
txtSotienPs.Enabled = f;
txtNgayCT.Enabled = f;
txtTenCT.Enabled = f;
cmbMaCT.Enabled = f;
txtdiengiai1.Enabled = f;
}
public void ClearForm()
{
cmbMaCT.Text="";
txtNgayCT.Clear();
cmbMaKh.Text="";
txtTenKH.Clear();
txtTenCT.Clear();
txtDiachi.Clear();
cmbTKNo.Text="";
txtTenTKNo.Clear();
cmbTKCo.Text="";
txtTenTKCo.Clear();
txtSotienPs.Clear();
cmbThue.Text="";
txtDienGiai.Clear();
txtdiengiai1.Clear();
}
private void dislay()
{
//--======================================
string SqlKH = "select * from tblKH";
dtKH = ket_noi.getDataTable(SqlKH);
cmbMaKh.DataSource = dtKH;
cmbMaKh.DisplayMember = "MaKH";
cmbMaKh.ValueMember = "MaKH";
txtTenKH.DataBindings.Clear();
txtTenKH.DataBindings.Add("Text", dtKH, "TenKH");
txtDiachi.DataBindings.Clear();
txtDiachi.DataBindings.Add("Text",dtKH,"Diachi");
//--========================================
string Sqlthue = "select * from tblDMthue";
dtThue = ket_noi.getDataTable(Sqlthue);
cmbThue.DataSource = dtThue;
cmbThue.DisplayMember = "MaThue";
cmbThue.ValueMember = "MaThue";
txtDienGiai.DataBindings.Clear();
txtDienGiai.DataBindings.Add("Text", dtThue, "DienGiaiThue");
//--========================================
string SqlCT = "select * from tblDMCT";
dtCT = ket_noi.getDataTable(SqlCT);
cmbMaCT.DataSource = dtCT;
cmbMaCT.DisplayMember = "MaCT";
cmbMaCT.ValueMember = "MaCT";
txtTenCT.DataBindings.Clear();
txtTenCT.DataBindings.Add("Text",dtCT,"TenCT");
//--========================================
string SqlTK = "select * from tblDMTK";
dtTK = ket_noi.getDataTable(SqlTK);
cmbTKNo.DataSource = dtTK;
cmbTKNo.DisplayMember = "MaTK";
cmbTKNo.ValueMember = "MaTK";
txtTenTKNo.DataBindings.Clear();
txtTenTKNo.DataBindings.Add("Text", dtTK, "DienGiai");
//--========================================
string SqlTK1 = "select * from tblDMTK ";
dtTK1 = ket_noi.getDataTable(SqlTK1);
cmbTKCo.DataSource = dtTK1;
cmbTKCo.DisplayMember = "MaTK";
cmbTKCo.ValueMember = "MaTK";
txtTenTKCo.DataBindings.Clear();
txtTenTKCo.DataBindings.Add("Text", dtTK1, "DienGiai");
//--========================================
string sqlpt = "select * from tblPhieuthu";
dtPhieuthu = ket_noi.getDataTable(sqlpt);
dataGridView1.DataSource = dtPhieuthu;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AutoGenerateColumns = false;
cmbMaCT.DataBindings.Clear();
cmbMaCT.DataBindings.Add("Text",dtPhieuthu,"MaCT");
txtNgayCT.DataBindings.Clear();
txtNgayCT.DataBindings.Add("Text",dtPhieuthu,"NgayCT");
cmbMaKh.DataBindings.Clear();
cmbMaKh.DataBindings.Add("Text", dtPhieuthu, "MaKH");
txtSotienPs.DataBindings.Clear();
txtSotienPs.DataBindings.Add("Text", dtPhieuthu, "SoTienPs");
cmbTKNo.DataBindings.Clear();
cmbTKNo.DataBindings.Add("Text",dtPhieuthu,"TKNo");
cmbTKCo.DataBindings.Clear();
cmbTKCo.DataBindings.Add("Text", dtPhieuthu, "TKCo");
txtdiengiai1.DataBindings.Clear();
txtdiengiai1.DataBindings.Add("Text",dtPhieuthu,"DienGiai");
cmbThue.DataBindings.Clear();
cmbThue.DataBindings.Add("Text", dtPhieuthu, "MaThue");
}
private int Sqlcommand(int mode, string MaCT, DateTime NgayCT, string MaKH, string TKNo, string TKCo,int SoTienPs,string DienGiai,string Mathue)
{
int i = 0;
try
{
SqlCommand sqlcmd = new SqlCommand("sp_Phieuthu", ket_noi.getConnection);
sqlcmd.CommandType = CommandType.StoredProcedure;
sqlcmd.Parameters.Add("@mode", SqlDbType.NVarChar).Value = mode;
sqlcmd.Parameters.Add("@MaCT", SqlDbType.NVarChar).Value = MaCT;
sqlcmd.Parameters.Add("@NgayCT", SqlDbType.NVarChar).Value = NgayCT;
sqlcmd.Parameters.Add("@MaKH", SqlDbType.NVarChar).Value = MaKH;
sqlcmd.Parameters.Add("@TKNo", SqlDbType.NVarChar).Value = TKNo;
sqlcmd.Parameters.Add("@TKCo", SqlDbType.NVarChar).Value = TKCo;
sqlcmd.Parameters.Add("@SoTienPs", SqlDbType.Int).Value = SoTienPs;
sqlcmd.Parameters.Add("@DienGiai", SqlDbType.NVarChar).Value = DienGiai;
sqlcmd.Parameters.Add("@MaThue", SqlDbType.NVarChar).Value = Mathue;
i = sqlcmd.ExecuteNonQuery();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
return i;
}
private void FrmPhieuthu_Load(object sender, EventArgs e)
{
dislay();
setcontrol(false);
setcontrol1(false);
if (dataGridView1.Rows.Count > 0)
{
setcontrol(true);
btnHuy.Enabled = false;
btnLuu.Enabled = false;
}
else
{
setcontrol(false);
btnThem.Enabled = true;
ClearForm();
}
}
private void btnLuu_Click(object sender, EventArgs e)
{
if (n == 1)
{
if (Sqlcommand(1, cmbMaCT.Text,Convert.ToDateTime(txtNgayCT.Text), cmbMaKh.Text, cmbTKNo.Text,cmbTKCo.Text,Convert.ToInt32(txtSotienPs.Text),txtDienGiai.Text,cmbThue.Text) != 0)
{
MessageBox.Show("Da them xong roi !!!! ", "Good", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
setcontrol(true);
btnLuu.Enabled = false;
setcontrol1(false);
FrmPhieuthu_Load(null,null);
}
else
if (n == 2)
{
try
{
{
if (Sqlcommand(0, cmbMaCT.Text, Convert.ToDateTime(txtNgayCT.Text), cmbMaKh.Text, cmbTKNo.Text, cmbTKCo.Text, Convert.ToInt32(txtSotienPs.Text), txtDienGiai.Text, cmbThue.Text) != 0)
{
MessageBox.Show("Da cap nhat xong roi !!!! ", "Good", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
setcontrol(true);
btnLuu.Enabled = true;
setcontrol1(false);
cmbMaCT.Enabled = true;
cmbMaKh.Enabled = true;
cmbThue.Enabled = true;
cmbTKCo.Enabled = true;
cmbTKNo.Enabled = true;
txtSotienPs.Enabled = true;
txtNgayCT.Enabled = true;
setcontrol1(false);
}
}
catch (Exception ex)
{
MessageBox.Show("Loi: " + ex.Message);
}
}
}
private void btnXoa_Click(object sender, EventArgs e)
{
DialogResult dlr = new DialogResult();
dlr = MessageBox.Show("Bạn cĩ chắn l xĩa mẫu tin ny khơng?", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (dlr == DialogResult.OK)
{
if (Sqlcommand(-1, cmbMaCT.Text,Convert.ToDateTime(txtNgayCT.Text), cmbMaKh.Text, cmbTKNo.Text, cmbTKCo.Text, Convert.ToInt32(txtSotienPs.Text), txtDienGiai.Text, cmbThue.Text) != 0)
{
MessageBox.Show("Da xoa xong roi !!!! ", "Good", MessageBoxButtons.OK, MessageBoxIcon.Information);
ClearForm();
setcontrol(false);
btnThem.Enabled = true;
btnHuy.Enabled = true;
FrmPhieuthu_Load(null,null);
}
}
}
private void btnThem_Click(object sender, EventArgs e)
{
n = 1;
setcontrol(false);
btnLuu.Enabled = true;
btnHuy.Enabled = true;
ClearForm();
cmbMaCT.SendToBack();
setcontrol1(true);
}
private void btnSua_Click(object sender, EventArgs e)
{
n = 2;
setcontrol(false);
btnLuu.Enabled = true;
btnHuy.Enabled = true;
setcontrol1(true);
setcontrol1(false);
cmbMaCT.Enabled = true;
cmbMaKh.Enabled = true;
cmbThue.Enabled = true;
cmbTKCo.Enabled = true;
cmbTKNo.Enabled = true;
txtSotienPs.Enabled = true;
txtNgayCT.Enabled = true;
txtdiengiai1.Enabled = true;
}
private void btnHuy_Click(object sender, EventArgs e)
{
FrmPhieuthu_Load(null,null);
}
private void btnThoat_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
Các file đính kèm theo tài liệu này:
- 26551.doc