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的資料來源。
這時,在表單下部的組件托盤中,你會發現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 FunctionPublic 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 SubPrivate 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的新特性來實現的。