Hướng dẫn lập trình Visual Basic.NET
Architect của application software hiện giờcó nói chung ba tầng (three tiers): tầng giao diện (Presentation Tier),
tầng giữa (Middle Tier) và tầng dữkiện (Data Tier):
Presentation Tier: Trong desktop Client ta dùng VB6 và nối với middle tier qua DCOM. Trong browser based
Client ta dùng Javascript hay Java applet. Từbrowser based Client ta dùng http đểnối với middle tier qua
IIS/ASP (có thểdùng COM ở đây).
Middle Tier: Chứa các rules đểvalidate data trên client và các business rules khác. Ta dùng VB6 ở đây,
nhưng cách triển khai COM với những Object Oriented Programming concepts rắc rối hơn bình thường. Ta
phải thiết kếsao cho các components scale well (dùng cho mọi cở). Có khi dùng Microsoft Transaction Server
trên Windows NT hay COM+ Services trên Windows 2000. Lấp ráp các versions của components là một thách
thức lớn.
Nhiều khi middle tier còn nói chuyện với các database qua HTTP, ADO và CDO (Collaborative Data Objects),
.v.v.
Data Tier: Thường là relational database nhưMicrosoft SQL Server hay Oracle. Ngoài ra còn có Exchange hay
các database xưa của mainframe.
Do đó ta thấy:
• Desktop tools không thích hợp cho Distributed System hay Internet
Phải dùng nhiều thứcodes nhưVB6 Code, VBScript, JavaScript, Dynamic HTML, Cascading Style Sheet,
VC++, Stored Procedures (Transact-SQL trong SQLServer hay PL-SQL trong Oracle).
•Tùy thuộc quá nhiều vào central database: Ngay cảADO dù là tiện dụng cũng đòi hỏi Client luôn luôn
connect với Server. Điều nầy không thích hợp cho Internet applications, vì bản chất của Internet là
stateless(không giữtrạng thái), mỗi lần cần làm việc mới connect lại một chút thôi.
• DLL "Hell": Các ActiveX cần phải được registered với Windows Registry, chỉcó một version được chấp
nhận. Nếu version mới nhất của một DLL không compatible với các versions trước đó mà applications trên
máy đang cần thì có rắc rối
thì mới dùng command ấy được. Thí dụ Command Modify
Username/Password/Level có level bằng 5 thì chỉ có MasterUser với level bằng 5 mới dùng nó được.
Đến đây ta đã định nghĩa xong các Attributes của một Element operator mà ta sẽ dùng làm record trong Table
operator trong cơ sỡ dữ liệu XML. Để có một XML hợp lệ ta cần phải gói các Element operator vào trong một
Element gốc (root) mà ta sẽ gọi nó là operatorlist.
Bạn hãy drag icon E Element từ XML Schema Toolbox vào khung vàng nhạt và sửa tên của Element đó thành
operatorlist. Kế đó nắm góc trái trên (top left) của hình Element oparator và drag drop nó vào ngay hàng dưới
chữ operatorlist của Element operatorlist. Bạn sẽ thấy hình dưới đây:
124
Nếu bây giờ bạn click Tab XML phía dưới của khung vàng nhạt bạn sẽ thấy mã nguồn XML của Schema
operatorlist.xsd như sau:
Mã nguồn XML của Schema operatorlist.xsd cho thấy Element operatorlist là Element gốc (root) còn gọi là
DocumentElement của XML nầy. Bên trong Element operatorlist có Element operator. Mỗi Element
operator có những Attributes là operatorid, username, password và level. Để ý datatype của Attributes
operatorid và level là integer.
Trở lại hình của Schema bằng cách click Tab Schema phía dưới, ta thấy hàng đầu tiên của mỗi khung chữ
nhật chứa tên của Element chủ của khung ấy. Từ hàng thứ nhì trở xuống là định nghĩa những gì thuộc về
Element ấy
Bài 15
DataGrid (phần III)
Edit XML file dựa trên XML Schema
Sau khi xác định cấu trúc và datatypes của các Elements và Attributes của
table operator, bây giờ ta sẽ cho data vào table ấy. Bạn hãy dùng IDE
menuCommand Project | Add New Item để thêm một XML file (click lên
icon XML file) vào project. Sửa Name của file ấy từ XMLFile1 thành
alarmlist.xml.
Right click lên trang trống của XML, chỉ mới có câu:
125
Chọn PopupMenu command Properties để hiển thị dialog DOCUMENT
Property Pages.
Trong cái Dropdown Combo, chọn
làm Target Schema cho operatorlist.xml của chúng ta. Sau đó bạn sẽ thấy
Element operatorlist có thêm một Attribute mới tên xmlns (chữ ns trong
xmlns là viết tắc cho namespace) với trị số
Điều nầy có nghĩa là ta áp đặt Schema
operatorlist.xsd lên cấu trúc và các dữ kiện bên trong XML file operatorlist.xml.
Bây giờ, bạn có thể bắt đầu đánh data vào trang operatorlist.xml. Để ý là vì
IDE biết ta đang dùng Schema operatorlist.xsd, nên nó có thể áp dụng
Intellisense để giúp ta edit chính xác và nhanh như trong hình dưới đây:
Mỗi khi bạn đánh xong opening Tag operator là closing Tag của nó tự động
hiện ra. Bên trong opening Tag của operator, Intellisense sẽ hiển thị tên các
Attributes để bạn chọn. Mỗi khi bạn đánh dấu = sau tên một Attribute thì IDE
sẽ tự động insert một cặp dấu ngoặc kép.
Sau khi đánh xong dữ kiện của một số operators, nếu bạn click MenuCommand
XML | Validate XML Data để IDE validate các dữ kiện ta vừa mới cho vào
để xem nó có đúng như định nghĩa trong cái Schema operatorlist.xsd không thì
sẽ thấy IDE than phiền như sau:
E:\NET\HongDevelopment\LessonPreparation\Operators\operatorlist.xml(4): Element
' has invalid child element
'
126
Đó là vì trong Schema không có nói rõ là bên trong Element operatorlist có
nhiều Element operator. Để giải quyết trở ngại nầy ta phải edit trực tiếp trong
mã nguồn XML của Schema. Bạn hãy doubleclick lên file name operatorlist.xsd
của Solution Explorer và nếu cần thì click Tab XML của trang Schema để hiển
thị mã nguồn XML của operatorlist.xsd.
Thay thế cái cặp Tags bằng cặp Tags
như trong hình
dưới đây để nói rằng có nhiều Elements operator trong Element
operatorlist :
Typed Dataset
Trong bài 13 ta đã tạo Dataset từ Schema bằng cách dùng IDE MenuCommand
XML | Schema Generate Dataset. Sau đó mỗi khi muốn nói đến một
datafield của record ta dùng tên của datafield ấy. Thí dụ để nói đến datafield
description trong DataRowView drv ta viết như sau:
Label1.Text = drv("description")
Một cách viết dễ đọc và tự nhiên hơn là:
Label1.Text = drv.description
Coding cách nầy được thêm lợi điểm là ngay trước khi chạy chương trình,
compiler sẽ cho biết ngay nếu ta đánh vần không đúng chữ description
chẳng hạn. Thêm nữa, Intellisense có thể hổ trợ ta trong lúc đánh code vào
bằng cách hiển thị danh sách của tất cả datafields của drv. So với trường hợp
ta dùng tên datafield, nếu đánh vần không đúng chữ description thì cho đến
run-time chương trình mới khám phá ra việc ấy.
127
Loại Dataset cho phép ta code drv.description được gọi là Typed Dataset
và ta có thể phát sinh (generate) nó từ Schema của XML file bằng cách dùng
line command:
xsd.exe /d /l:VB operatorlist.xsd /n:operatorlistDS
Ở đây ta dùng chương trình dụng cụ xsd.exe để phát sinh từ Schema
operatorlist.xsd một dataset trong ngôn ngữ (language) lập trình VB với
namespace tên operatorlistDS.
Nếu bạn không thấy xsd.exe thì tìm nó trong folder \Program
Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin rồi có thể copy
nó vào project folder. Lưu ý là bản xsd.exe dùng trong final version của
VS.NET thì khác với bản xsd.exe dùng trong version Beta 2.
Kế đó, bạn có thể thêm Typed Dataset nầy vào project bằng cách dùng IDE
MenuCommand Project | Add Existing Item rồi chọn operatorlist.vb từ
project folder.
Dùng Dataform wizard để phát sinh form từ Dataset
Ta sẽ dùng Dataform Wizard để generate một dataform. Nhưng trước đó, ta
cần phải compile project với IDE menuCommand Build | Build Operators để
chốc nữa Wizard thấy được Typed Dataset.
Bạn hãy dùng IDE MenuCommand Project | Add Windows Form, click lên
icon Data Form Wizard và đổi Name của form thành frmOperator.vb như
trong hình dưới đây:
128
Tiếp theo đó bạn sẽ thấy Data Form Wizard dialog với tên của Typed Dataset
hiện ra trong ComboBox của Option Use the following dataset: như dưới
đây:
Để y nguyên và click Next:
129
Click Checkbox Include an Update button, rồi click Next:
Để y nguyên và click Next:
130
Chọn các options như trong hình bên trên rồi click Finish.
Form frmOperator sẽ được generated và tự động cho vào Project. Bây giờ
bạn hãy right click lên tên file Form1.vb trong Solution Explorer để delete nó
và right click tên project Operators rồi chọn command Properties từ
PopupMenu để đổi Startup object thành frmOperator. Kế đó hãy sắp xếp
các object trên form frmOperator cho gọn lại như trong hình dưới đây:
Để hiển thị các operator records như một Spreadsheet phía dưới, bạn hãy
thêm một DataGrid tên DataGrid1 vào form. Và để dấu các chữ của Password
trong Dataform, ta sẽ Edit Property PasswordChar của TextBox
editpassword thành * như dưới đây:
131
Để load data vào DataForm sau khi khởi động chương trình bạn hãy
doubleclick lên button Load rồi viết code sau đây cho Event Click:
Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
btnLoad.Click
' Read operator data from XML file
Me.objoperatorlist.ReadXml("..\operatorlist.xml")
' Bind DataGrid1's Datasource to table operator
DataGrid1.SetDataBinding(Me.objoperatorlist, "operator")
' Define our owned display style. Do not display Passwords
AddCustomDataTableStyle()
' Display current record position
Me.objoperatorlist_PositionChanged()
End Sub
Ta sẽ gọi một Sub AddCustomDataTableStyle để hiển thị các records của
operators trong DataGrid1. RowHeaders của DataGrid1 sẽ được để yên
visible để cho user có thể click bên trái một record khi muốn làm việc với
record ấy. Đồng thời ta cũng cố ý không hiển thị Datafield password.
Coding của Sub AddCustomDataTableStyle được liệt kê dưới đây:
Private Sub AddCustomDataTableStyle()
' Instantiate a DataGridTableStyle object
Dim ts1 As New DataGridTableStyle()
' Map table operator to it
ts1.MappingName = "operator"
' Set other properties.
ts1.AlternatingBackColor = Color.Beige
' Add a first column style.
Dim TextCol1 As New DataGridTextBoxColumn()
TextCol1.MappingName = "operatorid"
TextCol1.HeaderText = "OperId"
TextCol1.Width = 50
ts1.GridColumnStyles.Add(TextCol1)
DataGrid1.TableStyles.Add(ts1)
' Add a second column style.
Dim TextCol2 As New DataGridTextBoxColumn()
132
TextCol2.MappingName = "username"
TextCol2.HeaderText = "Operator"
TextCol2.Width = 120
ts1.GridColumnStyles.Add(TextCol2)
' Add a third column style.
Dim TextCol3 As New DataGridTextBoxColumn()
TextCol3.MappingName = "level"
TextCol3.HeaderText = "Level"
TextCol3.Width = 35
ts1.GridColumnStyles.Add(TextCol3)
' Now add ts1 to the Datagrid1's collection of TableStyles
DataGrid1.TableStyles.Add(ts1)
End Sub
Bây giờ hãy chạy chương trình và click nút Load. Data của các operators sẽ
được loaded vào cả DataForm lẫn DataGrid1. Khi bạn click các nút navigators
để di chuyển đến record sau hay record trước, cái hình tam giác nho nhỏ trong
DataGrid RowHeaders nằm bên trái DataGrid1 cũng di chuyển theo như trong
hình dưới đây:
Ngược lại, khi bạn click bên trái một row trong DataGrid1, DataForm sẽ hiển thị
chi tiết các dữ kiện của record ấy. Tuy nhiên hàng chữ cho biết vị trí của record
(nằm giữa các nút navigators) vẫn không được thay đổi theo.
Để giải quyết chuyện đó ta tạm dùng Event TextChanged của TextBox
editoperatorid như sau:
Private Sub editoperatorid_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
editoperatorid.TextChanged
' Show position of current record
objoperatorlist_PositionChanged()
133
End Sub
Để cho đầy đủ, ta cũng sẽ viết code cho Event Click của button Update để lưu
trử data trong một XML file tên operatorlistNew.xml:
Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
btnUpdate.Click
' Accept all changes in Dataset
Me.objoperatorlist.AcceptChanges()
' Write Dataset to XML file
Me.objoperatorlist.WriteXml("..\operatorlistNew.xml")
End Sub
File đính kèm:
Hướng dẫn lập trình Visual Basic.NET.pdf

