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
Ứ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:
int chimuc = 0;
XmlDocument doc = new XmlDocument();
Thụ lý tình huống Load của của Form:
private void Form1_Load(object sender, System.EventArgs e)
{
doc.Load(Application.StartupPath + "\\employees.xml");
foreach (XmlNode node in doc.DocumentElement.ChildNodes) {
cboEmployeeID.Items.Add(node.Attributes("employeeid").Value);
}
cboEmployeeID.SelectedIndex = 0;
FillControls();
UpdateLabel();
}
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:
private void btnFirst_Click(object sender, System.EventArgs e)
{
chimuc = 0;
FillControls();
UpdateLabel();
}
private void btnPrevious_Click(object sender, System.EventArgs e)
{
chimuc = chimuc - 1;
if (chimuc < 0) {
chimuc = 0;
}
FillControls();
UpdateLabel();
}
private void btnNext_Click(object sender, System.EventArgs e)
{
chimuc = chimuc + 1;
if (chimuc >= doc.DocumentElement.ChildNodes.Count - 1) {
chimuc = doc.DocumentElement.ChildNodes.Count - 1;
}
FillControls();
UpdateLabel();
}
private void btnLast_Click(object sender, System.EventArgs e)
{
chimuc = doc.DocumentElement.ChildNodes.Count - 1;
FillControls();
UpdateLabel();
}
4 phương thức này cũng không có chi quá khó hiểu, đơn giản là lấy chỉ mục của nút hiện hành gán vào biến chimuc. Cuối cùng, 2 phương thức FillControl và UpdateLabel sẽ dựa vào giá trị của biến chimuc này mà tìm đến nút tương ứng trong tài liệu.
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:
//Fill Controls
public void FillControls()
{
//node = nút con th? <chimuc> c?a nút g?c c?a tài li?u
XmlNode node = 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;
}
//Update Label
public void 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;
}
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
private void btnUpdate_Click(object sender, System.EventArgs e)
{
//ch?n 1 nút t??ng ?ng v?i mã nhân viên ???c ch?n t? cboEmployeeID
XmlNode node = doc.SelectSingleNode("employees/employee[@employeeid = '" + cboEmployeeID.SelectedItem + "']");
//n?u có nhân viên t??ng ?ng
if (node != null) {
//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
XmlCDataSection notes = 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");
}
}
-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:
private void btnDelete_Click(object sender, System.EventArgs e)
{
//ch?n 1 nút t??ng ?ng v?i mã nhân viên ???c ch?n t? cboEmployeeID
XmlNode node = doc.SelectSingleNode("employees/employee[@employeeid = '" + cboEmployeeID.SelectedItem + "']");
//n?u có nhân viên t??ng ?ng
if (node != null) {
//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);
}
//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();
}
-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
private void btnAdd_Click(object sender, System.EventArgs e)
{
//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
XmlElement employee = doc.CreateElement("employee");
XmlElement firstname = doc.CreateElement("firstname");
XmlElement lastname = doc.CreateElement("lastname");
XmlElement homephone = doc.CreateElement("homephone");
XmlElement notes = 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
XmlAttribute employeeid = 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
XmlText firstnametext = doc.CreateTextNode(txtFirstName.Text);
XmlText lastnametext = doc.CreateTextNode(txtLastName.Text);
XmlText homephonetext = 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
XmlCDataSection notestext = 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();
}