1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Lập trình Windows 1 (Nghề Ứng dụng phần mềm Trình độ Cao đẳng)

89 6 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giáo trình Lập trình Windows 1
Tác giả Nguyễn Phát Minh
Trường học Cao đẳng nghề Công nghệ thông tin
Chuyên ngành Ứng dụng phần mềm
Thể loại Giáo trình
Năm xuất bản 2018
Thành phố Cần Thơ
Định dạng
Số trang 89
Dung lượng 2,1 MB

Cấu trúc

  • BÀI 1: T Ổ NG QUAN VISUAL STUDIO. NET, .NET FRAMEWORK (8)
    • 1. Cài đặ t và s ử d ụ ng Visual Studio .Net (8)
      • 1.1. Cài đặ t VisualStudio. Net (8)
    • 2. Tổng quan về .Net Framwork (20)
    • 3. C ấ u trúc .Net Framework (22)
    • 4. T ạ o ứ ng d ụng đầ u tiên (24)
  • BÀI 2: N Ề N T Ả NG C Ủ A NGÔN NG Ữ VB. NET (27)
    • 1. Các ki ể u d ữ li ệu và đặc điể m (27)
    • 2. Bi ế n (28)
    • 3. Mảng – Structure (29)
      • 3.1 Khái ni ệ m (29)
      • 3.2 Khai báo (29)
        • 3.2.1 M ả ng có chi ề u dài c ố đị nh (29)
        • 3.2.2 M ảng độ ng (30)
      • 3.2 M ộ t s ố thao tác trên m ả ng (30)
    • 4. Các toán t ử (31)
      • 4.1 Khái ni ệ m (31)
      • 4.2 Các lo ạ i phép toán (31)
    • 5. Cấu trúc điều khiển (31)
      • 5.2 Câu l ệ nh l ự a ch ọ n Select Case (33)
      • 5.3 Toán t ử Is & To (33)
        • 5.4.1 L ặ p không bi ết trướ c s ố l ầ n l ặ p (34)
          • 5.4.1.1 Câu l ệ nh Do ... Loop (34)
          • 5.4.1.2 Câu l ệ nh While ... End While (35)
        • 5.4.2 L ặ p bi ết trướ c s ố l ầ n l ặ p v ớ i câu l ệnh For…Next (35)
    • 6. X ử lý l ỗ i (35)
      • 6.1 Cú pháp Try…Catch (36)
      • 6.2 S ử d ụ ng m ệnh đề Finally (37)
      • 6.3 Cài đặt Try…Catch phứ c t ạp hơn (38)
      • 6.4 Tự mình phát sinh lỗi (39)
      • 6.5 S ử d ụ ng các kh ối Try…Catch lồ ng nhau (40)
      • 6.6 So sánh cơ chế xử lý lỗi với các kỹ thuật phòng vệ lỗi (41)
      • 6.7 S ử d ụ ng phát bi ể u thoát Exit Try (41)
  • BÀI 3: L ẬP TRÌNH HƯỚNG ĐỐI TƯỢ NG TRONG VISUAL BASIC .NET 42 Mã bài: MĐ 18 - 03 (42)
    • 1. Khái ni ệm hướng đối tượ ng (42)
    • 2. L ập trình hướng đối tượ ng trong VB.NET (43)
    • 3. Xây dựng các lớp xử lý (58)
      • 3.1.1 Presentation Layer (58)
      • 3.1.2 Business Logic Layer (59)
      • 3.1.3 Data Access Layer (59)
    • 4. Ki ểm tra chương I, II (67)
  • BÀI 4: THI Ế T K Ế CÁC D Ạ NG MÀN HÌNH (68)
    • 1. Các điều khiển hiển thị dữ liệu (68)
    • 2. Datagrid (72)
      • 2.1. DataGridTableStyle và TableStyles (72)
      • 2.2. DataGridColumnStyle và GridColumnStyles (72)
    • 3. Hi ể n th ị d ữ li ệu ra điề u khi ể n (75)
    • 4. Màn hình đơn (78)
    • 5. Màn hình m ộ t nhi ề u (83)
    • 6. Màn hình lọc dữ liệu (87)
    • 7. Màn hình m ộ t-nhi ề u-nhi ề u (88)
    • 8. Kiểm tra (88)

Nội dung

T Ổ NG QUAN VISUAL STUDIO NET, NET FRAMEWORK

Cài đặ t và s ử d ụ ng Visual Studio Net

Visual 2015 có 3 bản cài đặt cho người dùng lựa chọn như sau :

 Visual Studio Community 2015 Bản này là bản miễn phí với các tính năng cơ bản như

A rich, integrated development environment for creating stunning applications for

Windows, Android, and iOS, as well as modern web applications and cloud services

Visual Studio Enterprise 2015 cho phép người dùng dùng thử miễn phí trong 90 ngày Sau khi hết thời gian dùng thử, người dùng sẽ cần phải trả phí để tiếp tục sử dụng phần mềm này.

Bản này có các tính năng được giới thiệu như sau :

Enterprise-grade solution with advanced capabilities for teams working on projects of any size or complexity, including advanced testing and DevOps

 Visual Studio Code đây tiếp tục là một bản miễn phí nữa của Microsoft.

Code editing redefined Build and debug modern web and cloud applications Code is free and available on your favorite platform — Windows, Mac OS X, or Linux

Với bản này chúng ta có thể cài đặt trên nền tảng Mac, Linux

Đối với người dùng, chủ yếu là học sinh và sinh viên, việc cài đặt và sử dụng Visual Studio Community 2015 được khuyến nghị là sự lựa chọn phù hợp.

Vì nó miễn phí và đầy đủ tính năng phục vụ cho việc học tập

 Bộ cài đặt Visual Studio Có thể tải tại trang chủ của Microsoft

 Một máy tính để cài đặt có kết nối mạng

Trước khi cài đặt Visual Studio 2015, hãy đảm bảo cập nhật Microsoft NET Framework lên phiên bản mới nhất để tránh gặp phải lỗi trong quá trình cài đặt.

Tiến hành download bộ cài đặt VS

Bộ cài đặt mình dùng trong bài viết là bộ Visual Studio Community 2015

Hệ điều hành sử dụng Windows 10

 Truy cập trang chính thức của Microsoft

 Tại giao diện của trang chủ VS, click vào Downloads, chọn mục Top Downloads

 Tại đây, các bạn có thể click và phần Visual Studio Community để tiến hành tải bản cài đặt

Hoặc xem thêm thông tin chi tiết bằng cách click vào phần All downloads

 Sau khi các bạn đã chọn tải bản cài đặt Một trang mới sẽ được load

Nếu trình duyệt của bạn chưa tải được bản cài đặt, hãy nhấn vào "click here to retry" để thử tải lại.

 Khi file cài đặt đã sẵn sàng tải xuống Các bạn chọn vị trí lưu file cài đặt và nhấn Save

 Việc tải xuống rất nhanh

 Nhấp vào file cài đặt vs_community_ENU.exe

 Sẽ hiện một phần thông báo download các items Nhưng quá trình load cũng diễn ra rất nhanh

 Các phần sẽ hiện sau khi load xong file cài đặt

* Tại đây tùy chỉnh vị trí vị trí cài đặt Visual Studio

* Tùy chọn *kiểu cài đặt**

Lưu ý : Nên Chọn kiểu Custom

 Nhấp Install để cài đặt

 Tích các ô tùy chọn muốn cài đặt

Lưu ý : Nếu chọn càng nhiều thời gian cài đặt càng lâu Chỉ chọn các cài đặt cần thiết

 Sau đó nhấp Next để quá trình cài đặt bắt đầu

 Quá trình cài đặt tiếp theo hoàn toàn tự động

Lưu ý : Vì quá trình cài đặt có thể diễn ra trong thời gian dài nên bạn có thể rời khỏi khỏi máy tính và làm những công việc khác

Duy trì ổn định nguồn điệncủa máy và kết nối mạngtrong quá trình cài đặt Để tránh phát sinh lỗi

 Thông báo như vậy là quá trình cài đặt đã thành công

 Nhấn LAUNCH để khởi chạy Visual Studio Community 2015.

1.2 Môi trường lập trình VS Net

VS.NET là một bộ công cụ mạnh mẽ hỗ trợ phát triển đa dạng ứng dụng, từ ứng dụng desktop đến ứng dụng mạng Nó cung cấp môi trường phát triển cho tất cả các ngôn ngữ lập trình như VB.NET và Visual C#.

C ++ , Visual C#.Net hết sức mạnh mẽ và thuận lợi

1.2 1 Khởi động visual studio.NET

Khởi động Visual Studio NET (vs.NET) tương tự như các phần mềm khác như Microsoft Word hay Excel Khi lần đầu tiên khởi động vs.NET, bạn sẽ được yêu cầu chọn ứng dụng và ngôn ngữ lập trình, trong đó bạn có thể chọn Visual Basic Sau khi lựa chọn xong, bạn chỉ cần nhấn "Start" để bắt đầu sử dụng vs.NET Màn hình khởi động sẽ hiển thị như sau:

Nếu trang start page không hiện, bạn có thể làm nó xuất hiện bằng cách chọn menu View | Other Windows | Start Page

1.2.2 Mở một dự án của visual basic

Tại trang start page, bạn có thể click vào project của phần Open và duyệt một dự án trong phần Baitap sẵn có của chương 1 xem sao

1.2 3 Mở một dự án cụ thể

- Click chuột vào project của phần Open tại trang Start Page

- Duyệt đến thư mục chứa dự án của chương 1

- Mở file MusicTrivia.sln Khi này trang Start Page sẽ tạm ẩn đi, một cửa sổ mới xuất hiện:

1.2.4 Dự án (Project) và giải pháp (Solutions)

Khi mở dự án ở trên chắc hẳn bạn đã nhìn thấy hai file là MusicTrivia.sln và

MusicTrivia.vbproj file sln là file giải pháp và file vbproj là file dự án

Vậy phân biệt chúng thế nào?

Trong Visual Studio, các chương trình được gọi là dự án (Projects) hoặc giải pháp (Solution) vì chúng bao gồm nhiều file và thành phần riêng lẻ Một chương trình NET bao gồm một file giải pháp và một file dự án File dự án chứa thông tin đặc biệt liên quan đến một tác vụ lập trình cụ thể, trong khi file giải pháp chứa thông tin về một hoặc nhiều dự án.

Như vậy về tương lai thì file sln sẽ được ưa chuộng hơn

1.2.5 Các công cụ của VS.NET

Công cụ trong vs.NET rất phong phú Bạn có thể khám phá từ từ Sau đây là mô phỏng màn hình làm việc của bộ vs.NET:

1.2.6 Bộ thiết kế Windows Forms Designer

VS.NET cung cấp một bộ thiết kế form trực quan, giúp người dùng dễ dàng làm quen với việc tạo và quản lý nhiều Form trong các dự án phát triển.

1.2.7 Hiển thị bộ thiết kế Form

Góc phải màn hình là cửa sổ Solution Explorer Hiển thị nó View | Solution Explorer

Cửa sổ này chứa toàn bộ các phần tử có sd trong dự án

Double Click vào MusicTrivia.vb trong cửa sổ Solution Explorer bạn sẽ thấy tất cả các file chứa form

Nhắp chuột vào biểu tượng View Designer trong solution để hiển thị form thiết kế ở dạng trực quan.

Tổng quan về Net Framwork

.NET Framework là nền tảng giúp đơn giản hóa quá trình phát triển ứng dụng trong môi trường Internet phân tán Được thiết kế hoàn chỉnh, NET Framework đáp ứng nhu cầu của người dùng một cách hiệu quả.

Để tạo ra một môi trường lập trình hướng đối tượng hiệu quả, mã nguồn đối tượng cần được lưu trữ và thực thi cục bộ, đồng thời cho phép thực thi phân tán qua Internet hoặc từ xa.

 Để cung cấp một môi trường thực thi mã nguồn mà tối thiểu được việc đóng gói phần mềm và sự tranh chấp về phiên bản

Để đảm bảo an toàn trong việc thực thi mã nguồn, cần thiết lập một môi trường thực thi mã nguồn đáng tin cậy, bao gồm cả mã nguồn từ các nhà phát triển bên thứ ba, miễn là chúng tuân thủ kiến trúc NET.

 Để cung cấp một môi trường thực thi mã nguồn mà loại bỏđược những lỗi thực hiện các script hay môi trường thông dịch

Để giúp các nhà phát triển có kinh nghiệm vững chắc, việc nắm vững nhiều loại ứng dụng khác nhau là rất quan trọng, từ các ứng dụng trên nền tảng Windows cho đến các ứng dụng web.

Để đảm bảo mã nguồn trên nền tảng NET có khả năng tích hợp linh hoạt với các mã nguồn khác, việc xây dựng thông tin dựa trên các tiêu chuẩn công nghiệp là rất quan trọng.

.NET Framework bao gồm hai thành phần chính: Common Language Runtime (CLR) và thư viện lớp NET Framework CLR đóng vai trò nền tảng, hoạt động như một agent quản lý mã nguồn trong quá trình thực thi, cung cấp các dịch vụ cốt lõi như quản lý bộ nhớ, tiểu trình và từ xa Nó cũng thúc đẩy việc sử dụng kiểu an toàn và đảm bảo mã nguồn được thực hiện một cách bảo mật và mạnh mẽ Khái niệm quản lý mã nguồn là nguyên lý cốt lõi của runtime, trong đó mã nguồn hướng tới runtime được gọi là mã nguồn được quản lý (managed code), trong khi mã nguồn không hướng tới runtime được gọi là mã nguồn không được quản lý (unmanaged code).

Thư viện lớp trong NET Framework là một bộ sưu tập các kiểu dữ liệu hướng đối tượng, cho phép phát triển ứng dụng đa dạng từ ứng dụng command-line truyền thống đến các ứng dụng GUI hiện đại, cũng như các ứng dụng web mới nhất như Web Form và dịch vụ XML Web trong ASP.NET.

Hình 1.1: Mô tả các thành phần trong NET Framework.

C ấ u trúc Net Framework

.NET Framework cung cấp các lớp đối tượng để quản lý việc xây dựng và thi hành ứng dụng, cho phép người dùng gọi thực hiện các chức năng mà đối tượng cung cấp Tuy nhiên, việc thực hiện các lời kêu gọi này còn phụ thuộc vào khả năng của hệ điều hành mà ứng dụng đang chạy.

.NET Framework sử dụng các hàm API của Windows để thực hiện các chức năng đơn giản như hiển thị hộp thông báo (Messagebox) Đối với các chức năng phức tạp hơn, như sử dụng COMponent, cần phải cài đặt Microsoft Transaction Server (MTS), trong khi các chức năng trên Web yêu cầu cài đặt Internet Information Server (IIS) Do đó, việc lựa chọn hệ điều hành để cài đặt và sử dụng NET Framework là rất quan trọng Cài đặt NET Framework trên các hệ điều hành như Windows 2000, 2000 Server, XP, 2003 Server và Vista sẽ mang lại sự đơn giản và tiện lợi hơn trong quá trình lập trình.

Bộ biên dịch CLR là thành phần trung tâm của NET Framework, có nhiệm vụ biên dịch các chương trình, ảnh hưởng lớn đến hiệu suất và tốc độ của ứng dụng Tương tự như JVM (Java Virtual Machine) trong Java, CLR cung cấp nhiều dịch vụ hữu ích cho lập trình viên, giúp tối ưu hóa quá trình phát triển phần mềm.

– Nạp và thực thi chương trình

– Phân chia vùng nhớ của ứng dụng

– Xác minh tính an toàn của kiểu dữ liệu

– Dịch mã IL thành mà máy thực thi được

– Quản lý bộ nhớ tự động (automatic garbage collection)

– Quản lý lỗi và ngoại lệ

– Hỗ trợ các công việc như debug hoặc profile ứng dụng

– Liên kết với các hệ thống khác

Bộ biên dịch trong Net chuyển đổi các chương trình và đoạn mã thành mã trung gian MSIL (Microsoft Intermediate Language) Khi chương trình được thực thi, CLR sẽ biên dịch mã trung gian MSIL thành mã máy để thực hiện.

CLR là gần giống như 1 assemply nhưng không phải là assemply *

3.3 Bộthư viện các lớp đối tượng (Base Class Library)

Thư viện các lớp cơ sở của NET Framework cung cấp một tập hợp các lớp API hướng đối tượng, có thứ bậc và có thể mở rộng, cho phép sử dụng bởi bất kỳ ngôn ngữ lập trình nào Điều này tạo ra sự bình đẳng giữa các ngôn ngữ như Jscript và C++, giúp các nhà phát triển tự do lựa chọn ngôn ngữ mà họ quen thuộc.

Trong NET Framework, các lớp, kiểu giá trị và giao diện được tổ chức thông qua hệ thống Namespace Bảng 1 dưới đây cung cấp mô tả chi tiết về các Namespace có sẵn Quan trọng là, bạn không chỉ bị giới hạn ở những Namespace này; bạn có thể tự tạo Namespace cho ứng dụng của mình hoặc sử dụng các Namespace từ bên thứ ba, chẳng hạn như Namespace System.Data.Oracle.

3.4 Phân nhóm các đối tượng theo loại

Namespace là một khái niệm quan trọng, mặc dù không được thể hiện trong hình vẽ, nó đại diện cho một nhóm các lớp đối tượng được tổ chức nhằm phục vụ một mục đích cụ thể.

Các lớp đối tượng xử lý dữ liệu sẽ được đặt trong namespace có tên là Data, trong khi các lớp đối tượng dùng để vẽ hoặc hiển thị chữ sẽ nằm trong namespace Drawing.

Một namespace có thể là con của một namespace lớn hơn Namespace lớn nhất trong NET Framework là System

Namespace giúp phân nhóm các lớp đối tượng, làm cho người dùng dễ dàng nhận biết và sử dụng chúng, đồng thời tránh xung đột tên giữa các lớp .NET Framework cho phép người dùng tạo lớp và namespace riêng, điều này đặc biệt hữu ích khi có hơn 5000 tên có sẵn, giảm thiểu khả năng trùng tên Người dùng có thể sử dụng tên tắt hoặc tên đầy đủ để tham chiếu đến lớp, ví dụ như WebControls có thể được gọi là System.Web.UI.WebControls Bộ thư viện của NET Framework hỗ trợ tất cả các ngôn ngữ lập trình NET, giúp người mới bắt đầu dễ dàng lựa chọn ngôn ngữ mà không lo lắng về sự khác biệt Hơn nữa, việc sử dụng các lớp đối tượng trong xây dựng ứng dụng yêu cầu lập trình viên áp dụng kỹ thuật lập trình hướng đối tượng.

T ạ o ứ ng d ụng đầ u tiên

Để bắt đầu làm quen với giao diện, chúng ta sẽ tạo ứng dụng đầu tiên sử dụng các điều khiển cơ bản như Label, TextBox và Button Ứng dụng này sẽ thiết kế một form cho phép nhập vào hai số nguyên, tính tổng và hiển thị kết quả Để tạo một Project mới, bạn có thể nhấn vào "New Project " trên màn hình chính, sử dụng tổ hợp phím Ctrl+Shift+O, hoặc truy cập vào File -> New -> Project

 Tại cửa số New Project, bạn chọn Templates => chọn Visual Basic (1) => chọn Windows Forms Application (2)

 Nhập tên Project (3), nơi lưu Project (4) và nhấn OK (5) để bắt đầu khởi động Project

4.3 Sử dụng lại thành phần có sẵn

Bước 1: Đặt tên cho các điều khiển

Sau khi tạo một đề án mới, bạn cần thay đổi thuộc tính của form Form1.vb và điều chỉnh các thuộc tính của các điều khiển trên form Các điều khiển và thuộc tính cụ thể cần được cập nhật để đảm bảo tính năng và giao diện của ứng dụng hoạt động hiệu quả.

Label1 Text Nhập số thứ nhất:

Label2 Text Nhập số thứ hai:

Nhắp đôi chuột vào nút lệnh btnTong và viết đoạn lệnh sau:

Private Sub btnTong_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles btnTong.Click

Dim tong As Integer = Convert.ToInt32(txtSo1.Text) +

Convert.ToInt32(txtSo2.Text) lblKQ.Text = tong.ToString()

End Sub Ở đoạn lệnh trên, dòng đầu tiên:

Private Sub btnTong_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles btnTong.Click

Sự kiện Click của nút lệnh btnTong được tự động sinh ra khi người lập trình nhấp đôi chuột vào nút này Đây là sự kiện mặc định của nút lệnh.

Dòng tiếp theo là khai báo biến tên "tong", và để hiểu rõ hơn về cú pháp khai báo biến, chúng ta sẽ xem xét kỹ ở bài 2 của giáo trình này.

Dim tong As Integer = Convert.ToInt32(txtSo1.Text) + Convert.ToInt32(txtSo2.Text)

Có thể thay thế bằng dòng lệnh:

Dim tong As Integer = Integer.Parse(txtSo1.Text) + Integer.Parse(txtSo2.Text)

Để chuyển đổi giá trị chuỗi từ hai điều khiển TextBox thành kiểu số nguyên, bạn cần thực hiện phép cộng hai số này và gán kết quả cho biến tổng.

Dòng lệnh: lblKQ.Text = tong.ToString()

Dùng để hiện tổng của hai số ra điều khiển Label

N Ề N T Ả NG C Ủ A NGÔN NG Ữ VB NET

Các ki ể u d ữ li ệu và đặc điể m

1.2 Đặc điểm các kiểu dữ liệu

Kiểu dữ liệu Kích thước Phạm vi Ví dụ

Short 16-bit -32,678 - 32,767 Dim S as Short

Single 32-bit (dấu phảy động) -3.402823E38 đến

Sg = 899.99 Double 64-bit (dấu phảy động) -1.797631348623E308 đến

Dim D as Double D=3.1.4159265 Decimal 128-bit Trong khoảng +/-

Dim Dc as Decimal Dcr34734.5

Byte 8-bit 0-255 Dim B as Byte

Char 16-bit 0-65,536 Dim Ch As Char

String Nhiều ký tự Chứa 0 đến 2 tỷ ký tự Dim St As String

Boolean 16-bit Hai giá trị True hay False Dim Bl As Boolean

Date 64-bit Từ 1/1/1 đến 31/12/9999 Dim Da As Date

Da=#16/07/1984 Object 32-bit Bất kỳ kiểu đối tượng nào Dim Obj As Object

Bi ế n

Mỗi ứng dụng xử lý một lượng lớn dữ liệu, và để lưu trữ dữ liệu trong bộ nhớ máy tính, chúng ta sử dụng khái niệm "biến" Mỗi biến sẽ lưu trữ một giá trị cụ thể của chương trình.

Mặc dù Visual Basic (VB) không bắt buộc, việc định nghĩa rõ ràng từng biến trước khi sử dụng là cần thiết để đảm bảo mã nguồn của chương trình trở nên rõ ràng, dễ hiểu, và thuận tiện cho việc bảo trì cũng như phát triển sau này.

Biến (Variable) là vùng lưu trữ được đặt tên để chứa dữ liệu tạm thời trong quá trình tính toán, so sánh và các công việc khác

Biến thường có hai đăc điểm:

+ Mỗi biến có một tên

+ Mỗi biến có thể chứa duy nhất một loại dữ liệu

2.2 khai báo và khởi tạo

Cú pháp đơn giản của lệnh định nghĩa biến:

[Static|Public|Private|Dim] As [= ]

Tên biến là một quy tắc đặt tên trong lập trình, giúp xác định các biến trong mã nguồn Khi cần khai báo nhiều biến trên cùng một dòng, các khai báo này sẽ được ngăn cách bằng dấu phẩy (,).

: là một trong các kiểu dữ liệu đã tìm hiểu ở trên

Nếu khai báo biến không xác định kiểu dữ liệu thì biến đó có kiểu Variant

Khai báo ngầm trong lập trình là phương pháp không yêu cầu khai báo biến trước khi sử dụng, mang lại sự tiện lợi nhưng cũng tiềm ẩn rủi ro Việc đánh nhầm tên biến có thể khiến VB.NET hiểu nhầm và tạo ra một biến mới, dẫn đến kết quả chương trình sai lệch và khó phát hiện.

Vì vậy trong VB.NET bạn cần khai báo biến trước khi sử dụng nó

Việc khai báo biến có thể đặt ở bất kỳ đâu nhưng thường được đặt ở đầu mỗi thủ tục, nơi cần dùng biến

Biến cục bộ: là biến được khai báo trong một khối lệnh (Dim)

Ví dụ: Tìm giá trị nghịch đảo của x

Dim rec As Integer rec = 1/x

Biến cấp module: là biến được khai báo trong phần khai báo toàn cục của một module (Public, Friend, Private)

Private: là biến chỉ có hiệu lực trong module đó (mặc định)

Friend: là biến chỉ có hiệu lực trong dự án đó.

Public: biến có hiệu lực không chỉ trong dự án nó được khai báo mà còn trong các dự án khác có tham chiếu đến dự án này.

Khai báo một biến có tên là LastName với kiểu dữ liệu String cho phép bạn lưu trữ thông tin Sau khi biến được khai báo, bạn có thể gán giá trị cho nó.

Và có thể gán nội dung biến cho thuộc tính của đối tượng, ví dụ:

2.3 Kiểu trị và tham chiếu

Ví dụ sau đây vừa khai báo vừa khởi tạo giá trị cho các biến:

Dim y As Integer = 6, z As Integer = 9

Mảng – Structure

Mảng là một tập hợp các phần tử đồng nhất, giúp đơn giản hóa và làm gọn chương trình nhờ vào khả năng sử dụng vòng lặp Mỗi mảng có biên trên và biên dưới, với các thành phần được sắp xếp liên tiếp trong khoảng giữa hai biên này.

Có hai loại biến mảng: mảng có chiều dài cố định và mảng có chiều dài thay đổi lúc thi hành

3.2.1 Mảng có chiều dài cố định:

Dim () [As ]

Lúc này phần tử đầu tiên có chỉ số là 0 & phần tử cuối cùngcó chỉ số là = So sánh lớn hơn hoặc bằng

Math.Sqrt(N) And N 1 Then

MsgBox(N & " là số nguyên tố")

MsgBox(N & " không phải là số nguyên tố")

Trong đó, hàm Math.Sqrt: hàm tính căn bậc hai của một số.

5.4.1.2 Câu lệnh While End While

Cách thức hoạt động của câu lệnh này hoàn toàn giống với Kiểu 1 của câu lệnh Do…Loop

Cấu trúc lặp biết trước số lần lặp với câu lệnh For…Next cho phép xác định số lần lặp bằng cách sử dụng biến đếm Biến này có thể được tăng dần hoặc giảm dần, giúp lập trình viên điều khiển quá trình lặp một cách hiệu quả.

For = To [Step ]

Biến đếm, điểm đầu, điểm cuối và bước nhảy là các giá trị số như Integer hay Single Bước nhảy có thể mang giá trị âm hoặc dương; nếu bước nhảy là số âm, điểm đầu phải lớn hơn điểm cuối, nếu không khối lệnh sẽ không được thực thi.

Khi Step không được chỉ ra, VB.NET sẽ dùng bước nhảy mặc định là một

Ví dụ: Đoạn lệnh sau đây sẽ tính tổng dãy các số nguyên từ 1 đến N.

Vòng lặp For Each Next tương tự như vòng lặp For Next, nhưng nó lặp lại khối lệnh dựa trên số lượng phần tử của một tập hợp hoặc mảng, thay vì theo số lần lặp cố định Loại vòng lặp này rất hữu ích khi chúng ta không biết chính xác số lượng phần tử trong tập hợp.

For Each In

- Phần tử trong tập hợp chỉ có thể là biến Variant, biến Object, hoặc một đối tượng trong Object Browser

- Phần tử trong mảng chỉ có thể là biến Variant

- Không dùng For Each Next với mảng chứa kiểu tự định nghĩa vì Variant không chứa kiểu tự định nghĩa.

X ử lý l ỗ i

Lỗi có thể xảy ra bất cứ lúc nào, chẳng hạn như khi nạp một file mà không có thực trong đĩa, dẫn đến việc chương trình gặp lỗi VB.NET có khả năng xử lý lỗi, nhưng bạn cần thông báo cho nó biết thông qua khối lệnh Try…Catch, bao bọc đoạn mã có khả năng gây ra lỗi Các lỗi thường gặp bao gồm lỗi nhập xuất dữ liệu, phép chia cho 0, và thiết bị ngoại vi không sẵn sàng.

Try Các phát biểu có thể gây lỗi

Các phát biểu xử lý nếu có lỗi phát sinh

Các phát biểu được gọi ngay cả khi có hay không có lỗi

Trong đó Finally là tùy chọn, các từ khóa còn lại là bắt buộc.

Trong ví dụ về lỗi DiskDriverError, chúng ta sẽ xem xét cách xử lý lỗi runtime phổ biến Đầu tiên, chúng ta tạo một form với một nút nhấn và một ô ảnh PictureBox Khi nhấn nút, ảnh từ đĩa mềm có tên 6_82MELINH.ico sẽ được tải vào ô ảnh Tuy nhiên, nếu đĩa mềm bị tháo ra khỏi ổ, chương trình sẽ ngay lập tức báo lỗi không tìm thấy đĩa trong ổ A:\ Để minh họa, chúng ta sẽ mở một dự án mới và thiết kế form theo hình mẫu đã cho.

Hình 16 Trong sự kiện Button1_Click, gõ mã như sau:

PictureBox1.Image = System.Drawing.Image.FromFile _

Lúc này trong ổ mềm không có đĩa nên khi chạy chương trình sẽ có thông báo lỗi xảy ra:

Hình 17 Để khắc phục ta đặt thêm khối try … catch vào sự kiện Button1_click như sau: Try

PictureBox1.Image = System.Drawing.Image.FromFile _

MsgBox("Không tìm thấy đĩa mềm ở ổ A:\")

Trong đoạn mã này, câu lệnh PictureBox1.Image = System.Drawing.Image.FromFile _ đã được đặt trong khối Try…Catch, giúp chương trình xử lý lỗi mà không bị dừng lại, thay vào đó là hiển thị thông báo khi có lỗi xảy ra.

6.2 Sử dụng mệnh đề Finally

Mệnh đề này sẽ cho phép dùng các phát biểu sau nó dù có hay không có lỗi xảy ra

Việc dọn dẹp lỗi, giá trị của biến và thuộc tính sau khi thực thi đoạn mã bảo vệ là rất tiện lợi Trong ví dụ trên, chúng ta sẽ bổ sung đoạn mã như sau:

PictureBox1.Image = System.Drawing.Image.FromFile _

MsgBox("Không tìm thấy đĩa mềm ở ổ A:\")

MsgBox("Đã bắt lỗi thành công.")

Khi chạy lại chương trình, thay vì gặp phải lỗi không mong muốn, chúng ta sẽ nhận được thông báo lỗi mà mình có thể kiểm soát.

6.3 Cài đặt Try…Catch phức tạp hơn

Khi chương trình phức tạp thì việc bắt lỗi cũng trở nên phức tạp hơn Với Try…Catch bạn có thể:

- Đặt một khối hay nhiều khối phát biểu giữa các từ khóa

- Cho phép sử dụng mệnh đề lọc lỗi Catch When

- Cho phép sử dụng khối Try…Catch lồng nhau

- Cùng với đối tượng Err cho phép xác định lỗi phát sinh

Err là một đối tượng quan trọng trong VB.NET, cung cấp thông tin chi tiết về các lỗi phát sinh Các thuộc tính như Err.Number và Err.Description chứa mã lỗi và mô tả lỗi cụ thể Phương thức Err.Clear giúp xóa bỏ lỗi hiện tại Dưới đây là bảng liệt kê các lỗi Runtime thường gặp trong VB.NET.

Mã lỗi (Err.Number) Mô tả

5 Gọi hàm hay truyền đối số không đúng

9 Truy xuất vượt chỉ số mảng

48 Lỗi nạp thư viện DLL

52 Tên File hay số không hợp lệ

57 Lỗi thiết bị xuất nhập

62 Con trỏ file vượt quá điểm cuối file

68 Thiết bị chưa sẵn sàng

70 Không cho phép truy xuất

75 Truy cập đường dẫn và file không đúng

91 Biến đối tượng thiếu từ khóa truy xuất With

321 Định dạng file không hợp lệ

322 Không thể tạo file tạm

380 Giá trị thuộc tính không hợp lệ

381 Chỉ số thuộc tính không hợp lệ

422 Thuộc tính không tìm thấy

423 Thuộc tính hay phương thức không có

424 Yêu cầu về đối tượng

429 Không thể tạo đối tượng ActiveX

430 Lớp đối tượng không hỗ trợ Automation

440 Không thể tạo đối tượng Automation

460 Định dạng trong Clipboard không hợp lệ

461 Phương thức hay biến thành viên không tìm thấy

463 Lớp không đăng ký trên máy cục bộ

Trong ví dụ trên, chúng ta sẽ bổ sung các thuộc tính Err.Number và Err.Description, đồng thời khám phá mệnh đề đọc lỗi Catch When.

Bạn sửa lại thủ tục Button1_Click như sau:

PictureBox1.Image = System.Drawing.Image.FromFile _

Catch When Err.Number = 53 'nếu không thấy file

MsgBox("Kiểm tra lại đường dẫn và tên file")

Catch When Err.Number = 7 'Hết bộ nhớ

MsgBox("File ảnh quá lớn - hết bộ nhớ", ,

MsgBox("Không tìm thấy đĩa mềm ở ổ A:\", ,

MsgBox("Đã bắt lỗi thành công.")

Trong đoạn mã này, chúng ta áp dụng mệnh đề Catch When hai lần, với mỗi lần sử dụng thêm thuộc tính Number của đối tượng Err để nhận diện lỗi một cách cụ thể hơn.

Bạn chạy lại chương trình xem nó hoạt động ra sao

6.4 Tự mình phát sinh lỗi

Trong một số trường hợp, bạn có thể tự kiểm tra lỗi trong mệnh đề Try và muốn chuyển ngay đến mệnh đề Catch để xử lý lỗi VB.NET cung cấp phương thức hỗ trợ cho việc này.

Để xử lý lỗi trong lập trình, chúng ta có thể sử dụng lệnh Err.Raise Chẳng hạn, khi gặp lỗi không tìm thấy file (lỗi 53), chúng ta có thể tự phát hiện và thực hiện các hành động cần thiết trong mệnh đề Catch để xử lý tình huống này.

PictureBox1.Image = System.Drawing.Image.FromFile _

If Err.Number = 53 Then Err.Raise(53)

Xác định số lần thử lại

Try…Catch cho phép thử lại các thao tác gây lỗi trước khi quyết định không thực hiện, giúp quản lý lỗi hiệu quả hơn Ví dụ, bạn có thể theo dõi số lần người dùng nhấn nút “Load File”; nếu vượt quá giới hạn cho phép, hệ thống sẽ ngăn không cho người dùng nhấn tiếp.

Khai báo thêm biến dem ở dưới dòng public class form1:

Sửa lại thủ tục Button1_Click như sau:

PictureBox1.Image = System.Drawing.Image.FromFile _

Catch ex As Exception dem += 1

MsgBox("Không tìm thấy đĩa mềm ở ổ A:\")

MsgBox("Không thể load File!")

Và bây giờ khi người dùng click vào nút “Load File” quá hai lần thì thông báo xuất hiện:

Và nút “Load File” sẽ bị mờ đi không cho người dùng click nữa như thế này:

6.5 Sử dụng các khối Try…Catch lồng nhau

Bạn có thể áp dụng các khối Try…Catch lồng nhau để thực hiện kiểm tra lỗi một cách hiệu quả Ví dụ, trong trường hợp người dùng cần đưa đĩa mềm vào ổ A:\ ngay từ lần thông báo lỗi đầu tiên, nếu không thực hiện, nút “Load File” sẽ ngay lập tức bị vô hiệu hóa.

PictureBox1.Image = System.Drawing.Image.FromFile _

MsgBox("Không tìm thấy đĩa mềm ở ổ A:\, cho đĩa mềm vào")

PictureBox1.Image = System.Drawing.Image.FromFile _

MsgBox("Không thể load file!")

Khi cần kiểm tra lỗi hai lần, bạn nên sử dụng cấu trúc lồng nhau của hai phát biểu Try…Catch Nếu cần kiểm tra nhiều lần, hãy kết hợp với các biến đếm và vòng lặp như For hoặc Do Loop để quản lý hiệu quả hơn.

6.6 So sánh cơ chế xử lý lỗi với các kỹ thuật phòng vệ lỗi

Để phòng ngừa lỗi thay vì chỉ xử lý bằng Try…Catch, bạn có thể dự đoán lỗi có thể xảy ra Ví dụ, trong trường hợp kiểm tra sự tồn tại của file, thay vì sử dụng Try, hãy áp dụng phương thức File.Exists để xác định xem file có tồn tại trước khi gọi phương thức nạp ảnh FromFile Để sử dụng phương thức này, bạn cần khai báo thư viện IO bằng từ khóa thích hợp.

Rồi sửa lại mã lệnh trong thủ tục Button1_Click như sau:

If File.Exists("A:\6_82MELINH.ico") Then

PictureBox1.Image = System.Drawing.Image.FromFile _

MsgBox("Không tồn tại file này!")

Việc sử dụng phương thức nào là do bạn quyết định và trong hoàn cảnh nào thì dùng phương thức nào cho hợp lý

6.7 Sử dụng phát biểu thoát Exit Try

Phát biểu này là tùy chọn trong khối Try…Catch Nó giúp bạn thoát khỏi khối Try…Catch khi muốn

Nếu trong khối Try…Catch có phần Finally, chương trình sẽ thực hiện các lệnh trong phần Finally trước khi thoát khỏi khối Try theo yêu cầu của Ext Ví dụ minh họa cho điều này như sau:

'Thoát Try với Exit Try

If PictureBox1.Enabled = False Then Exit Try

PictureBox1.Image = System.Drawing.Image.FromFile _

MsgBox("Không tìm thấy File này!")

L ẬP TRÌNH HƯỚNG ĐỐI TƯỢ NG TRONG VISUAL BASIC NET 42 Mã bài: MĐ 18 - 03

Khái ni ệm hướng đối tượ ng

Lớp đối tượng (Class) là một khuôn mẫu hoặc bản thiết kế xác định các thuộc tính và phương thức của đối tượng Đối tượng (Object) là bản sao có thể chạy của một lớp, sử dụng bộ nhớ và có thời gian giới hạn.

Khi chọn mua tủ lạnh, bạn thường chú ý đến kích thước, độ bền và các tính năng, mà không quan tâm đến cấu tạo bên trong của nó; điều này thể hiện khái niệm trừu tượng Tương tự, VB.Net cũng mang đến tính trừu tượng thông qua việc sử dụng class và objects.

Mỗi đối tượng trong lập trình sở hữu các thuộc tính đặc trưng, được gọi là thuộc tính (property), và có khả năng thực hiện các hành động thông qua các phương thức (method).

VB.Net cho phép bạn có khả năng tạo các thuộc tính và các phương thức cho các đối tượng khi tạo các class.

Lập trình viên sử dụng tính trừu tượng để đơn giản hóa các đối tượng, chỉ hiển thị những thuộc tính và phương thức cần thiết, từ đó giảm thiểu độ phức tạp.

Tính trừu tượng cho phép tổng quát hóa một đối tượng như một kiểu dữ liệu

1.2 Tính bao bọc Được hiểu như việc ẩn thông tin Nó ẩn những chi tiết không cần thiết của đối tượng.

Ví dụ: Khi bạn bật tủ lạnh, chức năng start bắt đầu nhưng bạn không thể nhìn thấy trong tủ hoạt động như thế nào.

Tính đóng gói là một cách thi hành tính trừu tượng

Tính đóng gói trong lập trình hướng đối tượng bảo vệ việc thi hành của lớp đối với người sử dụng, chỉ cho phép hiển thị các thuộc tính và phương thức của đối tượng Điều này giúp người dùng tương tác với đối tượng một cách an toàn và hiệu quả, trong khi ẩn đi các chi tiết thực hiện bên trong.

Một lớp trong lập trình có khả năng kế thừa từ một lớp khác đã tồn tại Lớp kế thừa được gọi là lớp con (subclass), trong khi lớp mà nó kế thừa được gọi là lớp cơ sở (base class).

Tất cả các lớp trong VB.Net đều kế thừa từ lớp Object, cho phép lớp con nhận các thuộc tính và phương thức từ lớp cơ sở Ngoài ra, chúng ta cũng có thể bổ sung thêm các thuộc tính và phương thức riêng cho lớp con.

43 phương thức cho lớp con Bạn cũng có thể chồng các phương thức của lớp cơ sở Tính thừa kế cho phép bạn tạo phân cấp các đối tượng

Ví dụ: phân cấp class

Trong VB.Net, tất cả các lớp được tạo ra đều có khả năng thừa kế, cho phép bạn tái sử dụng mã và xây dựng các đối tượng phức tạp hơn từ những đối tượng đơn giản Ngoài ra, VB.Net cũng cung cấp nhiều từ khóa hỗ trợ cho việc thực hiện thừa kế.

1.4 Tính đa hình Để chỉ một đối tượng tồn tại nhiều khuôn dạng khác nhau

Khi mua tủ lạnh, bạn có thể liên hệ trực tiếp với người bán hoặc công ty sản xuất Nếu chọn người bán, họ sẽ đặt hàng và làm việc với công ty Ngược lại, nếu bạn liên hệ với công ty, họ sẽ kết nối với người bán trong khu vực của bạn để sắp xếp việc giao tủ lạnh.

Người bán và công ty là hai lớp khác nhau, mỗi lớp có cách phản hồi riêng về việc đặt hàng Điều này có thể được hiểu như là tính đa hình trong lập trình hướng đối tượng.

Tính đa hình cho phép bạn định nghĩa cùng một phương thức nhưng thực hiện các chức năng khác nhau Ngoài ra, bạn có thể thay đổi cách thức thực thi các phương thức của lớp cơ sở, tạo ra sự linh hoạt trong lập trình.

L ập trình hướng đối tượ ng trong VB.NET

Tính trừu tượng được thể hiện bằng việc dùng class, cú pháp tạo class:

[AccessModifier][Keyword] Class _ ClassName [Implements InterfaceName] ' Định nghĩa các thuộc tính và phương thức

AccessModifier định nghĩa khả năng truy cập của class, sử dụng một trong các từ khóa : Public, Private, Protected, Friend,Protected Friend

Keyword chỉ rõ các lớp có được thừa kế hay không, từ khóa Inherit, NotInheritable hoặc MustInherit

Class đánh dấu bắt đầu một class

Classname: tên của một class

Implements chỉ rõ class thực thi trên giao diện nào

InterfaceName miêu tả tên giao diện.Một class có thể thực thi trên một hoặc nhiều giao diện

End Class đánh dấu kết thúc khai báo của một class

Các bước tạo class trong vb.net:

Vào Project \ Add New Item …

Public module, class, structure Được truy cập từ cùng project, từ project khác hoặc từ thành phần khác

Private module, class, structure Chỉ được truy cập trong cùng module, class , structure

Protected Classes, class member Được truy cập trong cùng class , hoặc class được kế thừa Friend module, class, structure Truy cập được trong cùng project

Classes, class member Truy cập được trong cùng project

Và từ cácclass được kế thừa

Trong một tập tin như trên có thể chứa nhiều Class khác nhau

Chúng ta có thể tổ chức các Class cùng loại, cùng nhóm vào chung một không gian tên (NameSpace) do chúng ta tạo ra

End Namespace Để tham chiếu đến một Class được khai báo trong Namespace, chúng ta phải thông qua tên Namespace

Private conbo as Dongvat.Anco

Một không gian tên có thể xuất hiện trong nhiều tập tin Class khác nhau trong một

Ví dụ ta có tập tin thứ hai với nội dung:

Và cùng có chung cách tham chiếu thông qua không gian tên:

2.3 Tạo một Class kế thừa

When creating a derived class, it inherits all components declared with the Public, Friend, and Protected keywords from the base class The syntax for creating a derived class is as follows:

Public Class

Chú ý: Lệnh Inherits phải là dòng đầu tiên sau dòng lệnh khai báo Class

2.4 Khai báo phương thức (Method)

Phương thức là chức năng mà đối tượng có thể thực hiện, nó có thể là một thủ tục

(Sub) hoặc một hàm (Function) Với hàm, phải có giá trị trả về

[] Sub ([])

[] Function ([])

Từ khóa có thể là một trong các giá trị ở bảng sau:

Các từkhóa khai báo phương thức

Public Cho biết phương thức được gọi ở mọi nơi

Protected Cho biết phương thức chỉ được gọi trong phạm vi của Class khai báo và các lớp

Friend Cho biết phương thức chỉ được gọi trong phạm vi của Project

Protected Friend Cho biết phương thức chỉđược gọi trong phạm vi Proctected và

Friend Private Cho biết phương thức chỉ được gọi trong phạm vi của Class

Overloads là khái niệm cho phép nạp chồng nhiều phương thức có cùng tên trong lớp cơ sở Để thực hiện điều này, danh sách tham số của mỗi phương thức nạp chồng phải khác nhau, có thể khác về số lượng, kiểu dữ liệu hoặc cả hai.

Khi tạo các phương thức nạp chồng trong một lớp, không cần sử dụng từ khóa Overloads, nhưng nếu đã khai báo cho một phương thức, thì phải khai báo cho tất cả Ngoài ra, không được phép sử dụng cả hai từ khóa Overloads và Shadows trong cùng một phương thức.

Ví dụ chúng ta có các lớp Tinh và Toan như sau:

Public Class Tinh Function BP(ByVal so As Short) As Integer Return so ^ 2

End Function Function BP(ByVal so As Integer) As Long Return so ^ 2

Public Class Toan Inherits Tinh

Overloads Function BP(ByVal so As Double) As Double Return so ^ 2

Trong lớp Tinh, các hàm BP có thể có hoặc không có từ OverLoads Một thể hiện của lớp Toan có khả năng sử dụng tất cả các hàm Overloads Từ khóa Overrides được sử dụng để chỉ định phương thức ghi chồng một phương thức cùng tên trong lớp cơ sở, và yêu cầu số lượng tham số, kiểu dữ liệu của tham số, cũng như kiểu giá trị trả về phải khớp với lớp cơ sở.

Phương thức Overridable cho phép ghi đè một phương thức cùng tên trong lớp Con Khi sử dụng từ khóa Overrides, phương thức sẽ tự động được phép ghi chồng.

NotOverridable Cho biết phương thức không được phép ghi chồng trong lớp Con

MustOverride Cho biết phương thức không được cài đặt trong lớp khai báo nhưng phải cài đặt trong lớp Con

Shadows cho phép che lấp một thành phần tương tự hoặc một tập hợp các thành phần nạp chồng của lớp cơ sở Các tham số và giá trị trả về không cần phải giống với thành phần bị che lấp Trong lớp che, thành phần bị che sẽ không còn giá trị.

48 Không được phép sử dụng cả hai từ khóa Overloads và Shadows trong cùng

2.5 Khai báo thuộc tính (Property)

Thuộc tính là thành phần quan trọng lưu giữ các tính chất và đặc điểm của đối tượng trong lập trình Để quản lý giá trị của mỗi thuộc tính, chúng ta cần khai báo một biến Private tương ứng Trong VB.NET, cú pháp chung để truy xuất và gán giá trị cho thuộc tính được sử dụng rất linh hoạt.

' Khai báo biến lưu giữ giá trị của thuộc tính

Private mthuoctinh As

[] Property Thuoc_tinh() As

' Truy xuất giá trị của thuộc tính tức truy xuất đến giá trị của biến Get

' Gán trị cho thuộc tính tức gán trị cho biến Set (ByVal

Value As ) mthuoctinh = Value

Chúng ta có thể sử dụng các từ khai báo sau:

Khai báo thuộc tính mặc định Các thuộc tính này phải có tham số và có thể gán và truy xuất không cần chỉ ra tên thuộc tính

Một thuộc tính chỉ có thể là thuộc tính mặc định nếu thỏa các điều kiện:

 Mỗi Class chỉ được có một thuộc tính mặc định, phải kể đến cả các thuộc tính kế thừa

 Thuộc tính mặc định không được là Shared hay Private

 Nếu một thuộc tính nạp chồng (Overloaded) là mặc định thì tất cả các thuộc tính cùng tên cũng phải khai báo mặc định

 Thuộc tính mặc định phải có ít nhất một tham số Cú pháp:

Private mthuoctinh As

Default Public Property Thuoc_tinh(Index as Integer) As

Set (ByVal Value As )

Cho biết thuộc tính chỉ được phép đọc không cho phép gán

Private mthuoctinh As

Public ReadOnly Property Thuoc_tinh() As

Cho biết thuộc tính chỉđược phép gán không cho phép đọc

Private mthuoctinh As

Public WriteOnly Property Thuoctinh() As String Set (ByVal Value As String) mthuoctinh = Value

Thuộc tính này cho phép nạp chồng một hoặc nhiều thuộc tính có tên giống nhau được định nghĩa trong lớp cơ sở Để nạp chồng thành công, danh sách tham số của thuộc tính phải khác biệt so với các thuộc tính nạp chồng khác, cả về số lượng và kiểu dữ liệu.

Chúng ta không cần phải dùng từ khóa Overloads khi tạo các thuộc tính nạp chồng trong một lớp

Nhưng nếu đã khai báo cho một thì phải khai báo cho tất cả

Không được phép sử dụng cả hai từ khóa sau một lượt: Overloads và Shadows trong cùng một thuộc tính

Thuộc tính ghi chồng của một thuộc tính cùng tên trong lớp cơ sở yêu cầu số lượng tham số, kiểu dữ liệu của tham số và kiểu giá trị trả về phải tương thích hoàn toàn với lớp cơ sở.

Cho biết thuộc tính này được phép ghi chồng trong lớp Con

Cho biết thuộc tính không được phép ghi chồng trong lớp Con Mặc nhiên, các thuộc tính là không được phép ghi chồng

Cho biết thuộc tính không được cài đặt trong lớp và phải được cài đặt ở lớp Con

Thuộc tính che lấp có thể có tên tương tự hoặc là một tập hợp các thuộc tính nạp chồng của lớp cơ sở Tham số và giá trị trả về không nhất thiết phải giống với thuộc tính bị che Trong lớp che, thuộc tính bị che sẽ không còn giá trị.

Thuộc tính được chia sẻ là những thuộc tính không gắn liền với một thể hiện cụ thể nào của lớp, mà được sử dụng chung cho tất cả các thể hiện trong lớp đó.

2.6 Khai báo sự kiện (Event)

Sự kiện trong lập trình là thông điệp do một đối tượng phát sinh, cho biết một hành động đang diễn ra, có thể là do tương tác của người dùng hoặc được kích hoạt bởi chương trình khác Đối tượng phát sinh sự kiện được gọi là đối tượng gửi, trong khi đối tượng tiếp nhận và phản hồi lại sự kiện được gọi là đối tượng nhận Mặc dù đối tượng gửi không biết về đối tượng nhận, nhưng giữa chúng có một đối tượng trung gian, đóng vai trò quan trọng trong việc truyền tải sự kiện Trong NET Framework, Delegate (ủy quyền) là kiểu đặc biệt phù hợp cho chức năng này, giúp quản lý sự kiện một cách hiệu quả.

Chức năng của sự kiện được xác định từ ba yếu tố liên quan: một đối tượng cung cấp dữ liệu sự kiện

Trong NET Framework, một sự kiện được định nghĩa bởi dữ liệu sự kiện, một delegate sự kiện và một đối tượng kích hoạt sự kiện (sender) Quy ước đặt tên cho các lớp và phương thức liên quan đến sự kiện trong NET Framework rất quan trọng để đảm bảo tính nhất quán và dễ hiểu trong lập trình.

2.6.1 Phát sinh s ự ki ệ n Để một class phát sinh sự kiện EventName cần có các yếu tố sau:

 Một tham số sự kiện chứa các dữ liệu có tên EventNameEventArgs phát sinh từ lớp System.EventArgs

Thành phần xử lý sự kiện có tên EventNameEventHandler là một thủ tục được kích hoạt khi sự kiện xảy ra Chúng ta có thể sử dụng bất kỳ thủ tục hợp lệ nào làm thành phần xử lý sự kiện, tuy nhiên, không được sử dụng hàm.

 Một đối tượng phát sinh sự kiện Đối tượng này phải cung cấp :

 Một khai báo sự kiện

[] Event EventName As EventNameEventHandler

 Một phương thức tên OnEventName phát sinh sự kiện

 Các đối tượng event delegate và đối tượng dữ liệu sự kiện (EventArgs) có thể phát sinh từ những lớp tương ứng có sẵn trong NET

Các từ khoá khai báo sự kiện có thể là:

Các từ khóa khai báo sự kiện

Public Sử dụng được ở mọi nơi Sự kiện không có từ khóa mặc nhiên là

Private Chỉ truy xuất trong phạm vi khai báo

Protected Chỉ truy xuất trong phạm vi Class và SubClass

Friend Chỉ truy xuất trong phạm vi Project

Protected Friend Chỉ truy xuất trong phạm vi của Protected và Friend

Sự kiện che mờ trong Shadows cho phép một thành phần có tên tương tự trong lớp cơ sở bị che khuất bởi một thành phần khác Khi một thành phần bị che mờ, nó sẽ không còn hoạt động trong lớp kế thừa mà che mờ nó.

Xây dựng các lớp xử lý

Trong phần này, chúng ta sẽ tìm hiểu về mô hình lập trình 03 tầng/lớp (3 layers) và cách xây dựng ứng dụng trên mỗi tầng/lớp

Trong phát triển ứng dụng, việc nhóm các thành phần có cùng chức năng và phân chia trách nhiệm là cần thiết để quản lý hệ thống hiệu quả và tránh xung đột Giống như các phòng ban trong một công ty, mỗi phần mềm cũng được tổ chức theo mô hình kiến trúc đa tầng, trong đó mô hình 3 lớp phổ biến nhất bao gồm Presentation, Business Logic, và Data Access Các lớp này giao tiếp thông qua các dịch vụ mà mỗi lớp cung cấp, cho phép chúng hoạt động độc lập mà không cần biết chi tiết về hoạt động nội bộ của nhau.

Mô hình 3 lớp mà Microsoft đề nghị dùng cho các hệ thống phát triển trên nền NET như sau:

Lớp giao tiếp với người dùng cuối có nhiệm vụ thu thập dữ liệu và hiển thị kết quả thông qua các thành phần giao diện người sử dụng Lớp này sử dụng các dịch vụ từ lớp Business Logic Trong NET, bạn có thể sử dụng Windows Forms, ASP.NET hoặc Mobile Forms để triển khai lớp này.

Trong lớp này có 2 thành phần chính là User Interface Components và User Interface Process Components

UI Components là các phần tử quan trọng trong việc thu thập và hiển thị thông tin cho người dùng cuối Trong ASP.NET, những thành phần này bao gồm các TextBox, Button và DataGrid, đóng vai trò thiết yếu trong việc tạo ra trải nghiệm người dùng hiệu quả.

Các thành phần quy trình UI (UI Process Components) đóng vai trò quan trọng trong việc quản lý các quy trình chuyển đổi giữa các thành phần giao diện người dùng Chúng đảm nhận trách nhiệm điều phối các màn hình nhập dữ liệu trong một chuỗi thao tác đã được xác định trước, chẳng hạn như các bước trong một Wizard.

Lưu ý rằng lớp này không nên truy cập trực tiếp vào các dịch vụ của lớp Data Access, mà nên sử dụng thông qua các dịch vụ của lớp Business Logic Việc sử dụng trực tiếp có thể dẫn đến những vấn đề không mong muốn.

59 như vậy, bạn có thể bỏ qua các ràng buộc, các logic nghiệp vụ mà ứng dụng cần phải có

Lớp này thực hiện các nghiệp vụ chính của hệ thống, sử dụng dịch vụ từ lớp Data Access và cung cấp dịch vụ cho lớp Presentation Ngoài ra, lớp này còn có khả năng tích hợp các dịch vụ từ các nhà cung cấp thứ ba, chẳng hạn như các cổng thanh toán trực tuyến như VeriSign và Paypal, để hoàn thành công việc hiệu quả.

Trong lớp này có các thành phần chính là Business Components, Business Entities và Service Interface

Service Interface là giao diện lập trình mà lớp này cung cấp cho lớp Presentation Lớp Presentation chỉ cần biết đến các dịch vụ qua giao diện này mà không cần quan tâm đến cách thức hiện thực bên trong lớp.

Business Entities là các thực thể đại diện cho thông tin mà hệ thống xử lý, bao gồm các chuyên mục (Category) và bản tin (News) trong ứng dụng của chúng ta Những thực thể này đóng vai trò quan trọng trong việc trao đổi thông tin giữa lớp Presentation và lớp Data Access.

Business Components là những thành phần chính thực hiện các dịch vụ mà Service

Giao diện đảm nhiệm việc kiểm tra các ràng buộc logic và quy tắc nghiệp vụ, đồng thời sử dụng các dịch vụ bên ngoài để thực hiện các yêu cầu của ứng dụng.

Trong ứng dụng của chúng ta, lớp này bao gồm CategoryService và NewsService, chịu trách nhiệm cung cấp các dịch vụ quản lý chuyên mục và bản tin, bao gồm các chức năng thêm, xóa, sửa, xem chi tiết và lấy danh sách.

Lớp này đảm nhiệm các nghiệp vụ lưu trữ và truy xuất dữ liệu cho ứng dụng, thường sử dụng dịch vụ từ các hệ quản trị cơ sở dữ liệu như SQL Server và Oracle Các thành phần chính trong lớp này bao gồm Logic Truy cập Dữ liệu, Nguồn Dữ liệu và Đại lý Dịch vụ.

Các thành phần Logic Truy cập Dữ liệu (DALC) đóng vai trò quan trọng trong việc lưu trữ và truy xuất dữ liệu từ các nguồn dữ liệu như RDBMS, XML và hệ thống tệp Trong môi trường NET, DALC thường được triển khai thông qua thư viện ADO.NET để giao tiếp với các hệ cơ sở dữ liệu, hoặc thông qua các Framework ánh xạ đối tượng/quan hệ (O/R Mapping) để chuyển đổi các đối tượng trong bộ nhớ thành dữ liệu được lưu trữ trong cơ sở dữ liệu Chúng ta sẽ khám phá các thư viện O/R Mapping trong một bài viết khác.

Service Agents giúp người dùng dễ dàng và nhanh chóng truy xuất các dịch vụ bên ngoài, tương tự như cách họ truy cập các dịch vụ nội tại.

Trong mô hình 3 lớp, chúng ta đã khám phá các lớp khác nhau và cách chúng tương tác Để làm rõ hơn, hãy xem xét quy trình cụ thể như việc tạo một chuyên mục mới trong ứng dụng Các lớp sẽ giao tiếp với nhau để thực hiện thao tác này một cách hiệu quả.

Công việc 1: Xây dựng lớp Presentation

- Trình bày một form, có các text box cho phép người sử dụng nhập tên và mô tả cho chuyên mục

- Khi người dùng nhấn nút tạo trên form này, ứng dụng sẽ thực hiện việc tạo một Business Entity Category mới như đoạn code sau minh họa:

Dim theloai As New Category() theloai.Name = txtName.Text theloai.Description = txtDescription.Text

' sử dụng dịch vụ do lớp Business cung cấp để tạo chuyên mục

Công việc 2: Xây dựng lớp Business Logic Để cung cấp dịch vụ tạo một chuyên mục, thành phần CategoryService sẽ cung cấp hàm sau:

Public Sub TaoTheLoai(theloai as Category)

' kiểm tra xem tên khóa của chuyên mục đã tồn tại chưa?

… ' kiểm tra tên khóa của chuyên mục có hợp lệ không?

… ' sử dụng DV của lớp Data Access để lưu chuyên mục mới này vào CSDL

Dim theloaiDB As new CategoryDAO() theloaiDB.CreateCategory(theloai)

Công việc 3: Xây dựng lớp Data Access

Tương tự, để cung cấp dịch vụ lưu một chuyên mục mới vào CSDL, thành phần

CategoryDAO sẽ cung cấp hàm sau (sử dụng ADO.NET để kết nối với CSDL):

Public Sub CreateCategory(Byval theloai As Category)

…' tạo command, khởi tạo các tham số…

… ' lưu dữ liệu cmd.ExecuteNonQuery()

3.2 Xây dựng lớp xửlý lưu trữ

3.2.1 Các khai báo Đây là nhóm khai báo các biến thành viên, hằng cần sử dụng bên trong lớp và thường được khai báo với từ khóa Private:

 Khai báo đối tượng truy xuất cập nhật dữ liệu(DataAdapter): đối tượng này đóng vai trò đọc ghi dữ liệu cho lớp xử lý lưu trữ

 Biến chuỗi chứa nội dung truy vấn dữ liệu

 Biến chuỗi chứa tên bảng muốn truy vấn dữ liệu Biến đối tượng dùng chung kết nối đến nguồn dữ liệu

Imports System.Data Imports System.Data.OleDb

Module PHAN_MEM Public Const Chuoi_lien_ket As String = _ "Provider=Microsoft.JET.OLEDB.4.0;"

Public Class XL_BANG Inherits DataTable

#Region "Khai báo cục bộ "

In the context of database management, it is essential to declare the data reader object for reading and writing data on the database This can be achieved using the Private WithEvents statement to create an OleDbDataAdapter instance, referred to as mBo_doc_ghi Additionally, a string variable named mChuoi_SQL should be declared to hold the SQL query content.

' Khai báo biến chuỗi chứa tên bảng muốn truy vấn dữ liệu Private mTen_bang As String

' Khai báo biến đối tượng dùng chung kết nối đến nguồn dữ liệu Private Shared mKet_noi As OleDbConnection

Ki ểm tra chương I, II

THI Ế T K Ế CÁC D Ạ NG MÀN HÌNH

Các điều khiển hiển thị dữ liệu

1.1 Thuộc tính liên kết dữ liệu của điều khiển

Các điều khiển hiển thị dữ liệu Điều khiển Thuộc tính liên kết dữ liệu

Sau đây chúng ta sẽ đề cập đến một số điều khiển đặc biệt trong việc hiển thị dữ liệu

Khi được dùng để hiển thị dữ liệu, chúng ta cần quan tâm đến các thuộc tính sau :

 DataSource: Chỉ ra nguồn dữ liệu để lấy giá trị liệt kê chọn lựa

 DisplayMember: Cho biết tên cột trên nguồn dữ liệu liệt kê sẽ được hiển thị trên điều khiển

ValueMember là thuộc tính cho phép xác định tên cột trong nguồn dữ liệu mà giá trị sẽ được sử dụng để cập nhật nguồn dữ liệu khi người dùng chọn một dòng trong điều khiển.

 SelectedValue: Giá trị của dòng được chọn ứng với cột có tên là giá trị của

Sự kiện cần lưu ý trên các điều khiển nầy:

SelectedIndexChanged Xảy ra khi thuộc tính SelectedIndex thay đổi (do lệnh và tương tác)

SelectedValueChanged Xảy ra khi thuộc tính SelectedValue thay đổi (do lệnh và tương tác)

SelectionChangeCommitted Xảy ra khi dòng chọn thay đổi và đã được cập nhật (do tương tác)

DataGrid là một điều khiển trong NET cho phép hiển thị dữ liệu dạng bảng với các dòng và cột Nó có khả năng liên kết với DataSet chứa nhiều bảng và mối quan hệ, cho phép người dùng xem từng bảng dữ liệu theo từng mối quan hệ trên lưới Giao diện của lưới hiển thị như một cây thư mục, cho phép chuyển đổi giữa các bảng dữ liệu và cung cấp các nút điều hướng để quay lại bảng trước đó.

Các nút di chuyển về bảng trước, sau v.v…

AllowSorting Định trị cho biết lưới có cho phép sắp xếp khi nhấn phần tiêu đề cột hay không

AlternatingBackColor Màu dòng xen kẻ trên lưới Mặc định màu trắng tức màu các dòng không xen kẻ

CaptionFont Kiểu chữ cho phần tiều đề lưới

CaptionText Nội dung tiêu đề lưới

CaptionVisible Định trị cho biết có hiển thị tiêu đề lưới hay không

ColumnHeadersVisible Định trị cho biết có hiển thị tiều đề cột hay không

ContextMenu Thực đơn ngữ cảnh cho điều khiển

Controls Trả về tập hợp các điều khiển trên lưới

CurrentCell Ô hiện hành trên lưới Không sử dụng được ở chế độ thiết kế CurrentRowIndex Chỉ số dòng hiện hành

DataMember Thành phần nhánh dữ liệu hiển thị trên lưới

DataSource Nguồn dữ liệu của lưới

Enabled Định trị cho biết lưới sáng hay mờ

Font Kiểu chữ dùng hiện thị dữ liệu trên lưới

HeaderFont Kiểu chữ dùng hiện thị tiều đề cột trên lưới

Item Trị của ô có chỉ số truyền vào: Item(,)

DataGrid v ớ i các cách liên k ế t d ữ li ệ u

PreferredColumnWidth Độ rộng mặc định mỗi cột trên lưới theo đơn vị pixels

PreferredRowHeight Chiều cao mặc định của mỗi dòng trên lưới

ReadOnly Định trị cho biết lưới ở chế độ chỉ đọc hay không

RowHeadersVisible Định trị cho biết có hiển thị tiều đề dòng hay không

RowHeaderWidth Độ rộng của tiều đề dòng

TableStyles Tập hợp các kiểu DataGridTableStyle của lưới

Text Nội dung trên ô hiện hành

VisibleColumnCount Trả về số cột nhìn thấy trên lưới

VisibleRowCount Trả về số dòng nhìn thấy trên lưới

1.3.2 Các ph ươ ng th ứ c c ủ a DataGrid

Các phương thức thường dùng

HitTest Lấy thông tin của lưới tại một vị trí chỉ ra trên màn hình Cú pháp HitTest (,)

Phương thức trả về đối tượng HitTestInfo của DataGrid cung cấp thông tin về vùng được nhấn Chúng ta có thể sử dụng phương thức này trong sự kiện MouseDown để xác định dòng và cột tại vị trí nhấn chuột thông qua HitTestInfo.

IsSelected Trị cho biết dòng truyền vào có được chọn hay không

SetDataBinding Liên kết dữ liệu với lưới thông qua DataSource và

Select Chọn dòng chỉ ra qua chỉ số truyền vào

UnSelect Bỏ chọn dòng chỉ ra qua chỉ số truyền vào

CurrentCellChanged Sự kiện xảy ra khi ô hiện hành thay đổi

MouseDown Sự kiện xảy ra khi nhấn chuột trên DataGrid

Datagrid

DataGrid có tập hợp TableStyles gồm những DataGridTableStyle giúp chúng ta định dạng lưới theo một yêu cầu hiển thị cụ thể tùy theo bảng dữ liệu

DataGridTableStyle thuộc không gian tên

Nếu DataView là nội dung cần hiển thị trên lưới thì DataGridTableStyle là hình thức phải tuân theo để hiển thị

Cú pháp: Khởi tạo một DataGridTableStyle

Các thuộc tính của DataGridTableStyle đều kế thừa của DataGrid nên bảng dưới chỉ trình bày các thuộc tính mới và đáng chú ý:

Các thuộc tính của DataGridTableStyle

DataGrid DataGrid mà DataGridTableStyle thuộc về

GridColumnStyles Tập hợp các DataGridColumnStyle của DataGridTableStyle

MappingName Tên dùng để ánh xạ đến một nguồn dữ liệu Đây là tên của

DataTable muốn liên kết dữ liệu

Do lưới cho phép hiển thị dữ liệu từ nhiều nguồn khác nhau, chúng ta có thể tạo nhiều kiểu bảng DataGridTableStyle để phù hợp với từng nguồn dữ liệu.

DataGridTableStyle của lưới được tập hợp lại thành TableStyles Là một tập hợp

TableStyles includes distinct properties and methods characteristic of collections, such as Count, Item, Add, AddRange, Clear, Contains, Remove, and RemoveAt The usage of these properties and methods in TableStyles is similar to that of other collections previously discussed.

Trong khi DataGridTableStyle qui định cách hiển thị của nguồn dữ liệu của lưới thì

DataGridColumnStyle qui định cách hiển thị dữ liệu trên một cột

DataGridColumnStyle thuộc không gian tên

System.Windows.Forms.DataGridColumnStyle Đây là lớp phải kế thừa

(MustInherit) Hiện có hai lớp phát sinh từ lớp này là:

Cú pháp: Khởi tạo một DataGridColumnStyle

Các thuộc tính của DataGridColumnStyle

Alignment Canh lề trong cột

DataGridTableStyle Trả về DataGridTableStyle chứa cột

HeaderText Tiêu đề của cột

MappingName Tên cột trên bảng liên kết với cột

NullText Nội dung hiển thị khi cột có trị Null

ReadOnly Định trị cho biết có được phép chỉnh sửa dữ liệu trên cột hay không

Width Độ rộng của cột

Ngoài các thuộc tính chung nói trên, mỗi loại còn có các thuộc tính riêng của nó

Các thuộc tính riêng của DataGridBoolColumn

AllowNull Trị cho biết cột có nhận giá trị Null hay không

FalseValue Trị được sử dụng khi cột có giá trị False

NullValue Trị được sử dụng khi cột có giá trị Null

TrueValue Trị được sử dụng khi cột có giá trị True

Các thuộc tính riêng của DataGridTextBoxColumn

Format Biểu thức định dạng của cột

FormatInfo Đối tượng chứa thông tin định dạng theo văn hóa, quốc gia… TextBox Trả về Textbox của cột

GridColumnStyles là tập hợp các DataGridColumnStyle

(cả DataGridBoolColumn lẫn DataGridTextBoxColumn) của một

Khi DataGrid liên kết với nguồn dữ liệu, nếu chúng ta không tạo

DataGridTableStyle quy định cách hiển thị dữ liệu trong lưới, cho phép lưới hiển thị thông tin theo định dạng mặc định Để tùy chỉnh hiển thị dữ liệu theo yêu cầu, cần tạo DataGridTableStyle cùng với các thành phần liên quan.

2.3.1 T ạ o DataGridTableStyle khi thi ế t k ế (Design time)

Chúng ta tạo DataGridTableStyle và các

DataGridColumnStyle theo các bước sau :

 Chọn thuộc tính TableStyle trên Properties và nhấn nút […]

 Trên cửa sổ kế tiếp nhấn nút [Add] để tạo một

DataGridTableStyle mới, khai báo các thuộc tính cần thiết như

MappingName, ReadOnly,… và nhấn nút […] ở mục GridColumnStyles để tạo các DataGridColumnStyle

Trên cửa sổ kế tiếp nhấn nút [ ] bên phải nút [Add] để lựa chọn loại

DataGridColumnStyle muốn tạo, mặc định là DataGridTextBoxColumn :

Nhấn nút [Add] để tạo một DataGridColumnStyle đã chọn và khai báo các thuộc tính cần thiết : Alignment, HeaderText, Width, Format,

MappingName, ReadOnly, NullText…Tiếp tục các cột khác

Tạo DataGridColumnStyle mới và khai báo

Hi ể n th ị d ữ li ệu ra điề u khi ể n

Để hiển thị dữ liệu trên màn hình, chúng ta cần xuất dữ liệu từ lớp xử lý ra các điều khiển hiển thị Khi cần cập nhật, chúng ta thực hiện gán giá trị từ các điều khiển vào các cột tương ứng trong lớp xử lý Bài viết dưới đây sẽ giới thiệu một số đối tượng liên quan đến việc đồng bộ dữ liệu trên màn hình.

Trong ADO.Net, DataTable và DataView không có khái niệm dòng hiện hành như trong Recordset, cho phép làm việc với bất kỳ dòng dữ liệu nào Tuy nhiên, khi dữ liệu được hiển thị trên màn hình, khái niệm dòng hiện hành được sử dụng để đồng bộ hóa dữ liệu giữa các điều khiển hiển thị thông tin từ cùng một nguồn dữ liệu.

Dưới đây giới thiệu các lớp đối tượng quản lý dữ liệu trên màn hình

BindingManagerBase là một lớp trừu tượng dùng để quản lý và đồng bộ dữ liệu giữa các điều khiển trên màn hình, tất cả đều liên kết với cùng một đối tượng nguồn Nó thuộc không gian tên, giúp tổ chức và quản lý các liên kết dữ liệu một cách hiệu quả.

System.Windows.Forms.BindingManagerBase gồm hai lớp:

CurrencyManager duy trì một con trỏ đến dòng hiện hành trong danh sách, giúp đồng bộ hóa dữ liệu Các điều khiển liên kết với dòng hiện hành sẽ hiển thị thông tin nhất quán từ cùng một dòng, đảm bảo trải nghiệm người dùng mượt mà và chính xác.

PropertyManager được dùng để duy trì thuộc tính hiện hành của đối tượng, đúng hơn là thuộc tính của đối tượng hiện hành trên danh sách

Cách tạo thường dùng nhất là từđối tượng BindingContext của Form như sau:

Cú pháp: Khởi tạo một DataGridColumnStyle

.BindingContext()

.BindingContext(, )

Khi nguồn dữ liệu chỉ trả về một thuộc tính, BindingContext sẽ cung cấp một PropertyManager Ví dụ, có thể liên kết thuộc tính Text của Label với thuộc tính Text của Textbox.

Nếu nguồn dữ liệu là đối tượng chứa một danh sách, BindingContext sẽ trả về một CurrencyManager

Ví dụ nguồn là DataSet, DataTable, DataView một CurrencyManager được trả về Các thuộc tính cần lưu ý của BindingManagerBase

Các thuộc tính cần chú ý của BindingManagerBase

Count Số dòng trên danh sách do BindingManagerBase quản lý Current Trả vềđối tượng hiện hành (chỉ có tác dụng với

Position Vị trí của đối tượng hiện hành trên danh sách (đọc ghi, chỉ có tác dụng với CurrencyManager)

Các phương thức cần chú ý của BindingManagerBase

AddNew() Thêm dòng mới trên danh sách do BindingManagerBase quản lý (như AddNew của DataView) Dòng mới thêm được chuyển thành đối tượng hiện hành (Current) trên

EndCurrentEdit() Chấm dứt chỉnh sửa trên đối tượng hiện hành và nếu là dòng mới sẽđược đưa vào tập hợp Rows của DataTable (chỉ có tác dụng với CurrencyManager)

CancelCurrentEdit() Bỏ qua các thay đổi của đối tượng hiện hành

Các sự kiện của BindingManagerBase

CurrentChanged Sự kiện xảy ra khi đối tượng hiện hành thay đổi

PositionChanged Sự kiện xảy ra khi vị trí hiện hành của BindingManagerBase thay đổi

Phát sinh từ lớp đối tượng System.Windows.Forms.BindingContext,

BindingContext là một đối tượng quản lý các BindingManagerBase, cho phép các điều khiển kế thừa từ lớp Control có thể sử dụng Tuy nhiên, chỉ có Form và các điều khiển chứa như Groupbox, TabControl và Panel mới có khả năng tạo BindingContext để quản lý các BindingManagerBase, giúp hiển thị dữ liệu cho các điều khiển bên trong chúng.

Mặc dù hai BindingContext liên kết với cùng một nguồn dữ liệu và có cách tham chiếu giống nhau, nhưng chúng sẽ tạo ra hai BindingManagerBase khác nhau và không đồng bộ hóa dữ liệu với nhau.

3.4 Các thủ tục nhập xuất dữ liệu trên màn hình Để hiển thị dữ liệu trên màn hình, chúng ta sử dụng các điều khiển đã đề cập ở trên thông qua thuộc tính liên kết dữ liệu và thường có các thủ tục nhập xuất sau:

 Thủ tục Xuat_ho_so_: xuất các trị của dòng đang làm việc ra các điều khiển trên màn hình

Thủ tục Xuat_ho_so__moi giúp xuất các trị mặc định ra các điều khiển trên màn hình, nhằm chuẩn bị tiếp nhận thông tin cho dòng mới.

 Thủ tục Nhap_ho_so_: nhập trị của các điều khiển trên màn hình vào các cột tương ứng trên dòng đang làm việc

 Thủ tục Xuat_danh_sach_chon_: sử dụng khi cấp nguồn liệt kê cho các điều khiển ComboBox, ListBox, ListCheckBox

 Thủ tục Xuat_luoi_: sử dụng khi xuất dữ liệu của bảng ra lưới (DataGrid)

Màn hình đơn

Nguồn dữ liệu cho màn đơn chỉ là một bảng, phần khai báo cho màn hình này thường như sau:

Private As

Private Them_moi As Boolean = False

Private WithEvents Danh_sach As BindingManagerBase

 là biến tham chiếu đến đối tượng của lớp xử lý nghiệp vụ trên màn hình

 Them_moi là biến theo dõi trạng thái thêm mới của dòng đang làm việc trên màn hình

 Danh_sach là biến tham chiếu đến BindingManagerBase của đang hiển thị trên màn hình

4.2 Các thủ tục nhập xuất

Thực hiện nhập xuất trên màn hình đơn, chúng ta có ba thủ tục sau:

Xuat_ho_so_:

Private Sub Xuat_ho_so_ ()

If Danh_sach.Position >= 0 Then

. = _

. = _

Xuat_ho_so__moi

 Xuat_ho_so__moi:

Private Sub Xuat_ho_so__moi()

. = _

. = _

End Sub

 Nhap_ho_so_:

Private Sub Nhap_ho_so_()

Danh_sach.Current() = . Danh_sach.Current() = . End Sub

Khi sử dụng các điều khiển liệt kê như ComboBox, ListBox, và CheckListBox trên màn hình, cần bổ sung nguồn dữ liệu liệt kê cho điều khiển và thực hiện thêm thủ tục tương ứng.

 Xuat_danh_sach_chon_:

‘ là đối tượng cung cấp danh sách liệt kê cho điều khiển

Private Sub Xuat_danh_sach_chon_()

.DisplayMember = _

.ValueMember = _

.DataSource =

Nếu màn hình hiển thị dữ liệu dưới dạng dòng cột sử dụng DataGrid, thủ tục xuất lưới sẽ là:

Private Sub Xuat_luoi_()

.DataSource =

Trước khi nhập dữ liệu vào DataTable, cần kiểm tra tính hợp lệ của dữ liệu từ mỗi điều khiển để đảm bảo không vi phạm các ràng buộc toàn vẹn dữ liệu và miền giá trị Các hàm kiểm tra sẽ trả về giá trị Boolean: True cho dữ liệu hợp lệ và False cho dữ liệu không hợp lệ.

Kiem_tra_ As Boolean: (số lượng tùy theo số điều khiển cần kiểm tra)

Private Function Kiem_tra_ As Boolean

Dim Ketqua As Boolean =

' Phần này thay đổi tùy mỗi trường hợp

Ketqua =

 Kiem_tra_ghi_ As Boolean: phối hợp các hàm kiểm tra trên để lấy kết quả tổng hợp

Private Function Kiem_tra_ghi_ As Boolean

Dim Ketqua As Boolean = Kiem_tra_ AndAlso _

 Kiem_tra_huy_ As Boolean: kiểm tra hủy dữ liệu có vi phạm ràng buộc toàn vẹn không (kiểm tra trên các bảng nhiều)

Private Function Kiem_tra_huy_ As Boolean

New XL_()

' kiểm tra trên các bảng con khác nếu cần

4.4 Các xử lý sự kiện

Trên màn hình đơn, chúng ta thường có các xử lý sự kiện sau:

 Form_Load: Khởi tạo bảng dữ liệu và thực hiện xuất danh sách chọn (nếu có), xuất lưới, xuất hồ sơ

Private Sub MH_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles MyBase.Load

= New

Danh_sach = Me.BindingContext()

Xuat_ho_so_()

 Sự kiện nhấn của các nút lệnh di chuyển: thay đổi dòng hiện hành nếu hợp lệ Private Sub Dau_Click(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles Dau.Click

If Danh_sach.Position > 0 Then

Private Sub Truoc_Click(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles Truoc.Click

If Danh_sach.Position > 0 Then

Private Sub Sau_Click(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles Sau.Click

If Danh_sach.Position < Danh_sach.Count - 1 Then

Private Sub Cuoi_Click(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles Cuoi.Click

If Danh_sach.Position < Danh_sach.Count - 1 Then

Danh_sach.Position = Danh_sach.Count - 1

Sự kiện nhấn của nút thêm: Thực hiện xuất hồ sơ mới và đưa con trỏ nhập liệu về điều khiển bắt đầu

Private Sub Them_Click(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles Them.Click

Xuat_ho_so__moi()

.Focus

Sự kiện nhấn của nút ghi: Thực hiện kiểm tra ghi Nếu hợp lệ, thực hiện các bước:

+ Nếu Them_moi là True (đang thêm), thêm dòng mới trên Danh_sach + Nhập hồ sơ

+ Thực hiện ghi dữ liệu của lớp xử lý

Private Sub Ghi_Click(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles Ghi.Click

If Kiem_tra_ghi_() Then

If Them_moi Then Danh_sach.AddNew()

Nhap_ho_so_()

Xuat_ho_so_()

 Sự kiện nhấn của nút không: Thực hiện xuất lại thông tin trước đó

Private Sub Khong_Click(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles Khong.Click

Xuat_ho_so_()

 Sự kiện nhấn của nút hủy: Nếu Them_moi là True, thực hiện xuất hồ sơ; ngược lại nếu kiểm tra hủy hợp lệ và đồng ý xóa thực hiện:

+ Đánh dấu hủy dòng hiện hành trên Danh_sach

+ Thực hiện ghi dữ liệu của lớp xử lý

Private Sub Huy_Click(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles Huy.Click

Xuat_ho_so_()

Else If Kiem_tra_huy_() Then

If MsgBox("Đồng ý hủy ?", MsgBoxStyle.Question + _

MsgBoxStyle.YesNo,"Xin cho biết") = MsgBoxResult.Yes Then

The CurrentChanged event of the Danh_sach control triggers the export of records, provided that a new entry is not being added This event handler, defined as a Private Sub, ensures that any changes to the current record prompt the necessary actions without interfering with the process of adding new data.

If Not Them_moi Then

Xuat_ho_so_()

Màn hình m ộ t nhi ề u

Màn hình này hiển thị dữ liệu từ bảng một và bảng nhiều tương ứng với dòng hiện hành của bảng một Dữ liệu trên màn hình được lấy từ cả hai bảng, giúp người dùng dễ dàng theo dõi thông tin liên quan.

Có thể có các dạng :

5.1 Màn hình một-nhiều hai trang

Màn hình bao gồm các điều khiển cho bảng một, lưới cho bảng một và lưới cho bảng nhiều Các điều khiển bảng một được bố trí trên một tab của TabControl, trong khi tab còn lại chứa lưới của bảng một Lưới bảng nhiều được hiển thị trực tiếp trên Form.

Bảng dữ liệu phía nhiều phải được khai báo và có thể:

 Được đọc theo trị cột khóa bảng phía một khi bảng phía một thay đổi dòng làm việc và xuất ra lưới

Khi bảng phía một thay đổi dòng làm việc, có thể lọc theo trị cột khóa bảng và xuất ra lưới, miễn là đã đọc toàn bộ từ đầu.

Ví dụ: Xử lý bảng nhiều được đọc theo khóa bảng một (khi số liệu bảng nhiều quá lớn)

Private As

Private As

Private Danh_sach As BindingManagerBase

Private Danh_sach_nhieu As BindingManagerBase

Private Sub MH_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles MyBase.Load

Call Danh_sach_CurrentChanged(sender, e)

Private Sub Xuat_luoi_()

LUOI_.DataSource = End Sub

Private Sub danh_sach_CurrentChanged(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles danh_sach.CurrentChanged

If Not Them_moi AndAlso Danh_sach.Position >= 0 Then

khoa = Danh_sach.Current()

As New _

("điều kiện lọc theo khóa bảng một")

Xuat_luoi_()

Khi xử lý bảng nhiều, việc đọc và lọc theo khóa bảng sẽ được thực hiện ngay khi dòng hiện hành thay đổi, điều này đặc biệt hiệu quả khi số liệu trong bảng không quá lớn.

Private As

Private Sub MH_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles MyBase.Load

As New ()

Xuat_luoi_()

Call Danh_sach_CurrentChanged(sender, e)

Private Sub Xuat_luoi_()

LUOI_.DataSource = End Sub

Private Sub danh_sach_CurrentChanged(ByVal sender As Object, ByVal e As _

System.EventArgs) Handles danh_sach.CurrentChanged

If Not Them_moi AndAlso Danh_sach.Position >=0 Then

khoa As Integer = Danh_sach.Current()

.Loc_du_lieu("điều kiện lọc theo khóa bảng một") End Sub

5.2 Màn hình một-nhiều ba trang

Màn hình hiển thị TabControl với ba tab: một tab chứa các điều khiển cho bảng đơn, một tab hiển thị lưới cho bảng đơn, và một tab khác dành cho lưới của bảng nhiều Cách thức xử lý trong từng tab vẫn giữ nguyên như trước.

Màn hình lọc dữ liệu

6.1 Màn hình lọc một điều kiện

Màn hình bao gồm các điều khiển cho bảng đơn và lưới (hoặc ListBox) cho bảng nhiều Điều khiển bảng đơn thường có một Combobox, trong khi ListBox liệt kê các giá trị để người dùng dễ dàng lựa chọn Sự kiện SelectedIndexChanged được sử dụng để lọc dữ liệu hiệu quả.

Trên đây là một dạng khác của màn hình lọc theo một điều kiện: (các bảng vở kịch, diễn viên, tham gia được đọc khi mở màn hình)

 Diễn viên được phân vai hiển thị dữ liệu THAM_GIA lọc theo vở kịch được chọn

 Danh sách diễn viên hiển thị dữ liệu DIEN_VIEN đã loại trừ các diễn viên được phân vai

Ví dụ: bang_tham_gia và bang_dien_vien được khởi tạo khi mở màn hình

Private Sub MVK_SelectedIndexChanged(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles Danh_sach_chon_vo_kich.SelectedIndexChanged bang_tham_gia.Loc_du_lieu("MVK=" & MVK.SelectedValue)

Dim chuoi As String = Lap_danh_sach_MDV(bang_tham_gia) If chuoi

"" Then chuoi = "MDV Not In(" & chuoi & ")" bang_dien_vien.Loc_du_lieu(chuoi)

Private Function Lap_danh_sach_MDV(bang As XL_BANG) As String

For i As Integer = 0 To bang.So_dong - 1 ketqua & bang.DefaultView(i)("MDV") & ","

If ketqua.Length > 0 Then ketqua = _ ketqua.SubString(0, ketqua.Length - 1)

 Các nút >, >> thực hiện thêm các dòng chọn trên Danh sách diễn viên vào bang_tham_gia và lọc lại dữ liệu trên bang_dien_vien

 Các nút

Ngày đăng: 17/12/2023, 10:08

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN