Bài 13
DataGrid (phn I)
DataGrid trong .NET tuy có các chc năng ging như trong VB6 nhưng đã được nâng
cp vượt bc và cách dùng thay đi rt nhiu nên coi như ta phi hc li t đầu.
Cách dùng thông thưng nht ca mt DataGrid trong VB6 là hin th mt Table các
records trong dng mt spreadsheet, mi hàng (row) cha các datafields ca mt
record và mi ct (column) có header cho biết là datafield gì.
Nói cho đúng ra, nm sau lưng mi DataGrid là mt Recordset, tc là mt Set of
Records mà ta chn ly t database. Table chng qua cũng là mt Recordset trong
trường hp tng quát khi ta không dùng Clause WHERE trong SQL command, thí d
như "Select * from Authors".
Gii thiu ADO.NET
Trong .NET, ý nim Recordset đã được thay thế bng Dataset. Trong mt bài ti ta s
hc chi tiết v Data Access trong VB.NET, nên hin gi ch cn biết đại khái v
Dataset để dùng trong các thí d áp dng DataGrid.
Trong ADO (ActiveX Data Object) ca VB6 ta dùng Connection để ni chương
trình áp dng ca mình vi cơ s d liu và ly ra mt Recordset. Cái connection y
vn được gi nguyên trong khi chương trình ta làm vic vi Recordset. Trong
ADO.NET ca .NET sau khi thiết lp connection vi cơ s d liu ta copy mt hay
nhiu Recordset vào Dataset. Các Recordset ny có th có mi liên h Master/Slave
Relation vi nhau. Thí d như Invoice/InvoiceDetails, trong đó các InvoiceDetails liên
h vi Invoice qua InvoiceID chng hn, tc là InvoiceID là Primary Key ca Invoice và
cũng là Foreign Key ca InvoiceDetails . Sau đó ta ch làm vic vi Dataset mà thôi.
Cái connection coi như đã b ct đứt. Do đó Dataset được xem như là disconnected
database nho nh nm trong b nh.
Chc chn bn s không an lòng và hi nếu có hai người cùng copy các Recordset ra
dùng thì liu khi update ta có b mt nhng sa đổi nào không. Đó là vn đề khó khăn
c đin v Multiuser lúc hai người copy cùng mt record ra để Edit. Người Update
record sau có th viết chng lên Edited Record ca ngưi trước khiến cho nhng thay
đổi ngưi trước đánh vào b mt.
Cái hay ca ADO.NET là khi ta mun Update Dataset, connection s được t động ni
li và dataset s được reconciled vi cơ s d liu. Ch reconcile là mt t k thut
trong kế toán mà ta hay dùng để nói đến vic so sánh các chi tiết tin ra vô ca mt
trương mc gia s sách chúng ta gi và bng báo cáo ca nhà băng để điu chnh li
các con s trong s sách ca chúng ta cho ging như ca nhà băng. Nếu ta gi s
sách chính xác thì s khác bit ch là nhng transactions (món tin ra, vô) nhà băng
làm mà ta chưa biết như chi phí dch v ca nhà băng, thuế tài chánh .v.v.. Bên trong
Dataset có cha các tr s cũ ca datafields để dùng vào vic so sánh khi Reconcile
các records.
Có l bn thc mc ti sao Microsoft li bày đặt thêm ra chuyn ADO.NET vi ý nim
disconnected database chi cho mt, như có người trào phúng: "Mi năm li thêm mt
k thut mi v Data Access t Microsoft". Lý do chính là để áp dng trong Internet. Vì
mi connection trên mng đều nht thi, sau khi hoàn tt transaction thì hai bên chia
tay tm bit. Do đó rt khó cho ta gi mt connection thường trc như trong ADO. Nên
nh rng sau ny ln ln các áp dng trên Internet s thay thế các gii pháp
(Applications) ta dùng trong mng cc b. Ngay c nếu ch mun dùng Application
trong ni b ta cũng có th dùng Intranet. Như thế ta ch cn trin khai mt Application
duy nht đ dùng cho c ngưi ngoài (Internet), ln ni b (Intranet).
Dataset ca ADO.NET cho ta các li ích thc tin như:
Hoàn toàn trong b nh: Mt Table trong Dataset là mt Array of
Rows, nên ta có th dùng thng (direct access) mt record bng
cách nói đến cái Row cha nó, ch không cn phi dùng
MoveNext, MovePrev,.v.v.
Làm nh công tác ca cơ s d kin chính: Vai trò ca Dataset
đối vi cơ s d kin chính (Oracle, Informix, SQLServer .v.v.)
cũng ging như mười năm trước đây ta bt đu dùng
Workstations để làm nh công tác ca Mainframe computer.
Chuyn nào Workstation làm được thì ta giao cho nó, va nhanh,
va linh động, khi cn phin đến Mainframe. Tt c mi công
tác sa đổi d kin đều được thc hin trong Dataset.
Dataset có th được biu din bng mt XML (eXtensible
Marked Language): Ta có th dùng các công c ca XML để
làm vic vi Dataset, trao đi Dataset gia các computers trên
mng dưới dng XML, thm chí có th cha mt cơ s d kin
nho nh dưi dng mt XML.
Dùng thng XML làm cơ s d liu
Chúng ta mun hin th các records ca mt Table trong Dataset để biu din các
chc năng ca DataGrid. Hôm nay mình chơi ni, nên s to mt XML file để dùng nó
làm mt Dataset, thay vì trích mt Table t mt SQLServer hay Access database.
Trước hết bn hãy khi động mt d án mi, đt tên nó là AlarmList. Kế đó, trong
Solution Explorer rename tên ca file Form1.vb thành frmAlarmList.vb và thay đi
property Text ca form thành Alarm List, property Name ca form thành
frmAlarmList.
Lưu ý là ch khi bn thay đổi property Name ca form bn mi thy tên ca Class ca
form thay đổi t Form1 ra frmAlarmList như ta thy trong hình dưới đây:
Nếu bây gi bn right click lên tên ca project AlarmList trong Solution Explorer và
chn PopupMenuItem Properties, dialog AlarmList Property Pages hin ra. Trong
ComboBox ca Startup object vn còn có ch Form1. Bn có th click lên cái cái
tam giác bên phi ca hp Combobox để select ch frmAlarmList để ch định nó làm
Startup form.
Trong chương trình ny ta lo v an ninh và mun hin th các cánh ca trong tòa nhà
b m ca ngoài gi làm vic. Nếu áp dng ngoài đời thì Real-time Data s được thu
thp t các dng c gi là Data Acquisition hay Telemetry Monitoring Devices và báo
cáo cho h thng trung ương đ cp nht hóa Dataset mà ta dùng để hin th trong
DataGrid.
Bn hãy click IDE menu command Project | Add New Item ri chn XML File và đặt
tên nó là AlarmList.xml như trong hình dưới đây:
Kế đó ta s đánh vào data ca AlarmList. Hàng đầu ca XML file là mt Processing
Instruction (hun th cách x lý) tuyên b rng ta dùng tiêu chun xml version 1.0 vi
Unicode encoding utf-8.
<?xml version="1.0" encoding="utf-8"?>
Phn chính ca c cái XML file nm gia cp Tag <alarmlist> (gi là opening Tag) và
</alarmlist> (gi là closing Tag). Ta gi alarmlist là Element. Bên trong chính
alarmlist là nhiu Elements tên alarm. Các Element alarm không cn có closing Tag
vì chúng không có cha gì bên trong. Trong trường hp ny ta chm dt opening Tag
bng />. Tuy nhiên mi Element alarm có ch nhiu Attributes như priority, datetime,
pointid .v.v.. bên trong opening Tag ca nó. Mi Attribute có dng
TêncaAttribute="valuecaAttribute". Lưu ý valuecaAttribute nm gia du
ngoc kép hay ngoc đơn.
<alarmlist>
<alarm priority="3" datetime="20/7/2001 16:33:11" pointid="401-2-9"
description="Level 1 backroom door" statusvalue="Open" diagram="19"
alarm="true" isolate="false" fault="false" ackn="true"/>
<alarm priority="3" datetime="20/7/2001 18:47:33" pointid="402-8-7"
description="Level 1 kitchen side door" statusvalue="Open" diagram="6"
alarm="true" isolate="false" fault="false" ackn="false"/>
<alarm priority="2" datetime="20/7/2001 16:21:40" pointid="401-6-7"
description="Side door of third level" statusvalue="Open" diagram="14"
alarm="true" isolate="false" fault="false" ackn="true"/>
<alarm priority="1" datetime="20/7/2001 15:19:37" pointid="401-2-3"