KỲ 6
THÊM, XÓA, CẬP NHẬT NÚT TRONG TÀI LIỆU XML
Cho đến thời điểm này, có lẽ các bạn cũng đã khá rành cách chọn 1 nút trên tài liệu, nhưng đã chọn được rồi, thì tất nhiên là sẽ có những lúc bạn muốn thêm, xóa hoặc chỉnh sửa 1 nút nào đó. Trong kỳ này, mình sẽ hướng dẫn các bạn xử lý những vấn đề này.
Chúng ta sẽ làm thử 1 ứng dụng như hình dưới:
Ứng dụng của chúng ta gồm:
-6 label, trong đó label6 là label dùng để hiện thị vị trí của nút hiện hành (lblRecord).
-1 combobox để hiện mã số nhân viên
-4 textbox dùng để hiện thị thông tin nhân viên
-3 button tương ứng với 3 tính năng: thêm,cập nhật, xóa.
-4 button để di chuyển trên tài liệu: về đầu, lùi 1 nút, tăng 1 nút, về cuối.
Đầu tiên, bạn nhớ Imports System.Xml rồi sau đó khai báo 2 biến thành viên:
Mã: Chọn tất cả
Dim chimuc As Integer = 0Dim doc As New XmlDocument
Thụ lý tình huống Load của của Form:
Mã: Chọn tất cả
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load doc.Load(Application.StartupPath + "\employees.xml") For Each node As XmlNode In doc.DocumentElement.ChildNodes cboEmployeeID.Items.Add(node.Attributes("employeeid").Value) Next cboEmployeeID.SelectedIndex = 0 FillControls() UpdateLabel() End Sub
Trong Form1_Load, bạn thấy đơn giản là chúng ta cho mở tập tin employees.xml, sau đó tìm đến nút nguồn của tài liệu (employees), tìm và thêm các attribute employeeid của nút employee vào combobox. Rồi cho chọn phần tử đầu tiên của combobox.
Kế đến là 2 phương thức FillControls (điền đầy thông tin nhân viên vào các textbox thông tin) và UpdateLabel (cập nhật vị trí nút trên lblRecord). 2 phương thức này, tí nữa chúng ta sẽ xây dựng.
Bây giờ, chúng ta tiếp tục thụ lý tình huống Click cho 4 button di chuyển trên tài liệu:
Mã: Chọn tất cả
Private Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click chimuc = 0 FillControls() UpdateLabel() End Sub
Mã: Chọn tất cả
Private Sub btnPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrevious.Click chimuc = chimuc - 1 If chimuc < 0 Then chimuc = 0 End If FillControls() UpdateLabel() End Sub
Mã: Chọn tất cả
Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click chimuc = chimuc + 1 If chimuc >= doc.DocumentElement.ChildNodes.Count - 1 Then chimuc = doc.DocumentElement.ChildNodes.Count - 1 End If FillControls() UpdateLabel() End Sub
Mã: Chọn tất cả
Private Sub btnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLast.Click chimuc = doc.DocumentElement.ChildNodes.Count - 1 FillControls() UpdateLabel() End Sub
Giờ đây, chúng ta bắt đầu xây dựng 2 phương thức FillControl và UpdateLabel để hoàn tất nửa chặng đường đầu tiên:
Mã: Chọn tất cả
'Fill Controls Public Sub FillControls() 'node = nút con thứ <chimuc> của nút gốc của tài liệu Dim node As XmlNode = doc.DocumentElement.ChildNodes(chimuc) 'combobox mã số nhân viên = giá trị của attribute employeeid của nút con vừa tìm cboEmployeeID.Text = node.Attributes("employeeid").Value 'gán chuỗi nằm giữa cặp tag đóng-mở cho các textbox thông tin txtFirstName.Text = node.ChildNodes(0).InnerText txtLastName.Text = node.ChildNodes(1).InnerText txtHomePhone.Text = node.ChildNodes(2).InnerText txtNotes.Text = node.ChildNodes(3).InnerText End Sub
Mã: Chọn tất cả
'Update Label Public Sub UpdateLabel() 'doc.Document.ChildNodes.Count = số nút con của nút gốc của tài liệu lblRecord.Text = (chimuc + 1).ToString & "/" & doc.DocumentElement.ChildNodes.Count End Sub
Nửa chặng đường tiếp theo chúng ta bắt đầu lo cho việc thêm,xóa, sửa thông tin cho nút:
Dễ nhất là cập nhật (UPDATE) thông tin cho một nút:
-Đoạn mã thụ lý tình huống Click của button UPDATE:
Mã: Chọn tất cả
Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click 'chọn 1 nút tương ứng với mã nhân viên được chọn từ cboEmployeeID Dim node As XmlNode = doc.SelectSingleNode("employees/employee[@employeeid = '" & cboEmployeeID.SelectedItem & "']") 'nếu có nhân viên tương ứng If node IsNot Nothing Then 'gán các giá trị trong các textbox thông tin 'vào giữa cặp tag đóng-mở của các nút con của nút đang xét 'ở đây là các tag: firstname,lastname,notes của nút employee node.ChildNodes(0).InnerText = txtFirstName.Text node.ChildNodes(1).InnerText = txtLastName.Text node.ChildNodes(2).InnerText = txtNotes.Text 'riêng với CData, ta phải làm bằng cách tạo 1 biến kiểu XmlCDataSection 'phương thức doc.CreateCDataSection sẽ giúp ta tạo 1 CData dựa trên 1 chuỗi được truyền vào phương thức Dim notes As XmlCDataSection = doc.CreateCDataSection(txtNotes.Text) 'thay thế CDataSection cũ là : node.ChildNodes(3).ChildNodes(0) 'bởi nút notes node.ChildNodes(3).ReplaceChild(notes, node.ChildNodes(3).ChildNodes(0)) 'lưu lại tài liệu doc.Save(Application.StartupPath + "\employees.xml") End If End Sub
-Kế đến là công việc xóa nút
Đoạn mã thụ lý tình huống Click của button DELETE:
Mã: Chọn tất cả
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click 'chọn 1 nút tương ứng với mã nhân viên được chọn từ cboEmployeeID Dim node As XmlNode = doc.SelectSingleNode("employees/employee[@employeeid = '" & cboEmployeeID.SelectedItem & "']") 'nếu có nhân viên tương ứng If node IsNot Nothing Then 'di chuyển nút employee tương ứng khỏi tài liệu 'thông qua phương thức RemoveChild(<nut can xoa>) 'của doc.DocumentElement doc.DocumentElement.RemoveChild(node) End If 'lưu lại tài liệu doc.Save(Application.StartupPath + "\employees.xml") 'Cập nhật lại số vị trí của nút UpdateLabel() End Sub
-Công việc cuối cùng của chúng ta là thêm 1 nút mới vào tài liệu, đoạn mã có thể hơi dài, nhưng cũng không quá khó để hiểu:
Đoạn mã thụ lý tình huống Click của Button ADD
Mã: Chọn tất cả
Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click 'khai báo các biến phần tử (XmlElement) của tài liệu 'ứng với tên của chúng được truyền vào phương thức CreateElement Dim employee As XmlElement = doc.CreateElement("employee") Dim firstname As XmlElement = doc.CreateElement("firstname") Dim lastname As XmlElement = doc.CreateElement("lastname") Dim homephone As XmlElement = doc.CreateElement("homephone") Dim notes As XmlElement = doc.CreateElement("notes") 'khai báo 1 biến tượng trưng cho attribute employeeid (XmlAttribute) 'với tên là chuỗi được truyền vào phương thức CreateAttribute Dim employeeid As XmlAttribute = doc.CreateAttribute("employeeid") 'gán giá trị của cboEmployeeID vào 'biến attribute employeeid vừa tạo employeeid.Value = cboEmployeeID.Text 'khai báo các biến tượng trưng cho chuỗi nằm giữa cặp tag đóng-mở của 1 nút bất kỳ 'với giá trị là chuỗi được truyền vào phương thức CreateTextNode Dim firstnametext As XmlText = doc.CreateTextNode(txtFirstName.Text) Dim lastnametext As XmlText = doc.CreateTextNode(txtLastName.Text) Dim homephonetext As XmlText = doc.CreateTextNode(txtHomePhone.Text) 'riêng đối với đoạn văn bản nằm trong tag CData, ta phải làm cách khác với cách XmlText 'tạo 1 biến kiểu XmlCDataSection Dim notestext As XmlCDataSection = doc.CreateCDataSection(txtNotes.Text) 'phần tử notes thêm notestext vào bản thân nó. notes.AppendChild(notestext) 'phần tử employee thêm attribute employeeid vào bản thân nó employee.Attributes.Append(employeeid) 'cho phần tử employee có các nút con là : firstname,lastname,homephone và notes employee.AppendChild(firstname) employee.AppendChild(lastname) employee.AppendChild(homephone) employee.AppendChild(notes) 'thêm phần tử employee vừa tạo vào nút gốc employees của tài liệu doc.DocumentElement.AppendChild(employee) 'lưu lại tài liệu doc.Save(Application.StartupPath + "\employees.xml") 'cập nhật lại thông tin vị trí của nút UpdateLabel() End Sub