XML是目前在Web上應用很普遍的一項技術,而在.NET 2.0中,則提供了更為豐富的功能,使得在創建XML應用的時候更加得心應手。在本文中,將簡單以一個例子來說明,.Net 2.0在創建XML應用時的一些新特性。
首先,我們平常在創建Web應用時,都會選擇以數據庫的形式來存貯數據的,但如果要以純XML來存貯數據的話,那的確會是種挑戰。在.NET 1.0/1.1框架中,對XML的支持功能有限,比如對同一應用中的多個XML文件的支持。在.Net 2.0中,這種情況得到了改變,增加了新的功能,比如:
1、Datatable現在可以讀和寫XML數據了
2、使用DatGridVIEw控件,可以讓你在dataset裡,展示來自不同表的數據。
下面我將以一個Web應用的例子來說明這些新的特性。在這個程序中我將所有的數據都存儲在XML文件中。展示了如何同時在dataset裡,讀和寫多個XML文件,以及如何將XML文件綁定到datagridview控件;並且展示了datagridvIEw控件如何從XML文件中讀和寫數據,如何在多個XML文件中尋找數據。這些新功能,都是以往的.Net中做不到的。
任務跟蹤應用
接下來,我們將創建一個實現"任務跟蹤"的Web應用程序。這個應用程序其實很簡單,是可以幫助大家跟蹤一些任務和活動的進展情況。它需要創建兩個xml文件:activitIEs.xml和tasks.XML文件。Activites文件存放了日常的活動,包括每次活動需要完成些什麼任務,任務的描述,開始和結束的時間。Tasks文件存放的是任務的類型,比如浏覽email,編寫程序,閱讀書本等。下圖顯示了這兩個文件之間的數據結構。
兩個文件之間的數據結構
通常,可能你會想通過手工來創建這兩個xml文件,但實際上這是不提倡的,因為在vs.ne 2005中,可以通過dataset設計器來幫助你設計xml 文件的結構,允許你創建上圖關系的XML 文件,下面具體來講解下。
1) 打開Visual.net 2005 beta 2,新建一個Windows應用程序,選擇vb.Net 語言,將這個工程命名為DTKXML,然後添加一個dataset類型的文件,將其命名為dsactivitiesTasks.。然後添加兩個表,activitIEs和tasks 表(見圖1)。只需要在設計器界面上,右鍵點選鼠標,在彈出的菜單上選Add->datatable就可以了。
接著,對著每個表的表名,右鍵點鼠標,在彈出的菜單裡選擇Add->Column,為每個表增加列,其中,每個列的名稱,屬性和數據類型如下表所示:
Activites表
Column
Name
Property
1
activityid
DataType=System.Int32
Autoincrement=True
AutoincrementSeed=1
AutoincrementStep=1
Unique=True
2
taskid
DataType=System.Int32
3
description
DataType=System.String
4
startime
DataType=System.DateTime
5
endtime
DataType=System.DateTime
Tasks表
Column
Name
Property
1
taskid
DataType=System.Int32
Autoincrement=True
AutoincrementSeed=1
AutoincrementStep=1
Unique=True
AllowDBNull=False
2
task
DataType=System.String
AllowDBNull=False
接下來,要為這兩個XML文件建立關聯,這是十分簡單的。在activitIEs和task表的設計視圖狀態下,鼠標右鍵點選,在彈出的菜單中選擇"Add Relation",按照下圖所示,設置兩個文件的關聯性。
設置兩個文件的關聯性
2) 這個時候,我們可以設計應用的界面了。應用包括兩個窗體,第一個窗體,允許用戶處理關於活動的有關信息,第二個窗體,可以提供給用戶對各類型的任務進行編輯。
將工程中默認的窗體改名為frMactivities,在工具箱中拖一個datagridview控件到窗體中。接著,注意選擇控件右上角的smart tag標記,這時會出現一個菜單(如下圖所示),選擇dsActivitiesTasks(就是我們剛才創建的dataset類型文件)作為datagridvIEw的數據源。
dsActivitIEsTasks
這時,在窗體下部的組件托盤中,你會發現visual studio添加了dsActivitiesTasks的實例,和另外一個組件叫dsActvitiesTasksBindingSource。實際上,你不需要Binding Source,只需要直接將dataset綁定到Datagridview控件,因此,選擇這個bingding source控件並刪除它。之後,再次使用smarttag的功能,再次選擇dsActivitIEsTasks做為數據源。
接下來,我們要對datagridvIEw控件進行屬性的設置,以將一些不需要顯示的列隱藏,設置時,再次選smarttag標志,在彈出的菜單中選擇"Edit Columns", 按如下表對其屬性進行設置,
Column
Property
activityid
Visible=False
Taskid
ColumnType= DataGridVIEwComboBoxColumn
DataSource= DsActivitIEsTasks
DataMember= tasks.task
ValueMember=tasks.taskid
description
Width=180
再往該窗體中添加3個按鈕,名稱分別是btnEditAddTasks, btnSave, btnDelete,則第一個窗體的界面設置完畢。
編寫相關代碼 編寫代碼時,分兩個步驟:1、加載相關的數據,2、使用戶能對數據進行增,刪,保存。下面分步說明:
加載相關數據到datagridvIEw控件中。
由於我們已經有了dataset類型的文件,因此我們可以由此創造出上述的兩個文件,則應用程序第二次運行時,會先檢查是否存在這兩個XML文件。代碼如下:
在form_load事件中寫入
If CheckFileExistence() Then
LoadDataSet()
Else
’如果兩個xml文件不存在,則創建這兩個XML文件
CreateXMLFile()
End If
接著,定義一系列的變量,以存放兩個XML文件的具體位置,如下代碼:
Dim myDocumentsFolder As String = My.Computer.FileSystem.SpecialDirectorIEs.MyDocuments
Dim activitiesFileName As String = "\ActivitIEs.XML"
Dim tasksFileName As String = "\Tasks.XML"
Public activitiesFile As String = String.Concat(myDocumentsFolder, activitIEsFileName)
Public tasksFile As String = String.Concat(myDocumentsFolder, tasksFileName)
注意其中一個用法My.Computer.FileSystem.SpecialDirectories.MyDocuments返回當前計算機上"我的文檔"的具體位置。這裡,將兩個文件保存到"我的文檔"中去。並且用activitIEsFile和tasksFile變量,保存兩個XML文件實際存取的路徑。接下來是相關幾個過程的代碼,如下所示
Public Function CheckFileExistence() As Boolean
’檢查兩個XML文件是否存在
If My.Computer.FileSystem.FileExists(activitIEsFile) And _
My.Computer.FileSystem.FileExists(tasksFile) Then
Return True
Else
Return False
End If
End Function
Public Sub CreateXMLFile()
DsActivitIEsTasks.Tasks.AddTasksRow("Email")
DsActivitIEsTasks.Tasks.AddTasksRow("Browsing")
DsActivitIEsTasks.Tasks.WriteXml(tasksFile, System.Data.XMLWriteMode.WriteSchema)
DsActivitiesTasks.activities.WriteXml(activitIEsFile, System.Data.XMLWriteMode.WriteSchema)
End Sub
上面的createxmlfile過程,首先前兩句代碼往task的XML文件中增加一些樣本數據,分別為email和browsing.接著的兩句代碼,是.Net 2.0中新增加的功能,設置了一個重要的參數writeSchema,以便自動將數據保存到tasksfile和activitIEsfile兩個文件中,並且自動將XML 的schema模式保存起來,只有這樣才能將兩個文件之間的在數據表上對應的關系保存起來。
Public Sub LoadDataSet()
DsActivitIEsTasks.tasks.ReadXML(tasksFile)
DsActivitiesTasks.activitIEs.ReadXML(activitIEsFile)
End Sub
上面是loaddataset過程,十分簡單,分別讀取兩個xml文件。可以看到,在.net 2.0中,可以同時在一個dataset裡加載多個XML文件,如上述所示。而在.Net 1.1中,這是很難做到的。
保存和刪除數據
在datagridvIEw中,提供了給用戶自動新增記錄的功能,用戶只需要將光標移動到新一行中就可以了。而當用戶編輯了數據後,需要對其進行保存,這個時候需要編寫一點代碼。保存功能只需要調用writeXML方法就可以了,同樣,刪除數據時,需要調用removeat方法就可以了。如下所示:
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnSave.Click
Me.DsActivitiesTasks.activitIEs.AcceptChanges()
Me.DsActivitiesTasks.activities.WriteXml(activitIEsFile, System.Data.XMLWriteMode.WriteSchema)
End Sub
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnDelete.Click
Me.DataGridView1.Rows.RemoveAt(Me.DataGridVIEw1.CurrentRow.Index)
btnSave_Click(sender, e)
End Sub
增加和編輯任務 我們要為btnEditAddTasks這個按鈕編寫相關代碼,而我們新建一個窗體frmEditAddTasks,在這個窗體中,可以添加刪除不同的任務。首先,拖拉一個datagridvIEw控件,增加兩個按鈕分別命名為btnSave和btnDelete,如下圖所示:
在load事件中,寫入如下代碼
DataGridView1.DataSource = frMactivities.DsActivitIEsTasks
DataGridView1.DataMember = frMactivities.DsActivitIEsTasks.tasks.TableName
以將datagridview綁定到dataset的tasks 文件中去。注意這時以frmActivities.DsActivitiesTasks的形式調用的,因為該dataset是在第一個窗體中frMactivitIEs中設立的。
接著,為保存save按鈕編寫代碼:
frMactivities.DsActivitIEsTasks.tasks.AcceptChanges()
frMactivities.DsActivitIEsTasks.tasks.WriteXML(frMactivitIEs.tasksFile, _
System.Data.XMLWriteMode.WriteSchema)
而刪除按鈕delete的代碼也一樣簡單:
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
Me.DataGridView1.Rows.RemoveAt(Me.DataGridVIEw1.CurrentRow.Index)
btnSave_Click(sender, e)
End Sub
最後,我們要記得,在frMactivitIEs窗體的btnEditAddTasks按鈕中,編寫如下代碼,以能夠使用戶點這個按鈕時,可以彈出編輯任務task的窗口
Dim frmtasks As New frmEditAddTasks
frmtasks.ShowDialog()
運行代碼 現在可以開始運行代碼了。結果如下圖所示:
這時,你可以點"Edit/add Tasks"按鈕來添加不同的任務。也可以在這個窗體中,通過下拉框來選擇每個活動中不同的任務,指定每個任務的描述,開始和結束時間,並對它們進行保存和刪除,而這一切,全部是通過使用.Net 2.0中XML的新特性來實現的。