上一篇中講到XML基本的結構,還有增刪改查的方法,這一篇中我們就來利用XML來完成一個簡單的訂單系統,主要是實現一個簡單學生名單的增刪改查,如果想要應用到實際的環境中建議考慮數據量的問題,如果數據量大使用XML的話會比較耗時,使用SQL的性能會好一些 這裡使用WinForm窗體程式,大致界面如下: ...
上一篇中講到XML基本的結構,還有增刪改查的方法,這一篇中我們就來利用XML來完成一個簡單的訂單系統,主要是實現一個簡單學生名單的增刪改查,如果想要應用到實際的環境中建議考慮數據量的問題,如果數據量大使用XML的話會比較耗時,使用SQL的性能會好一些
這裡使用WinForm窗體程式,大致界面如下:
- 創建了兩個窗體,一個主窗體用來顯示名單數據,當添加或者編輯操作時則使用另外一個窗體。
- 主窗體中放置四個按鈕,以及一個DataGridView控制項,另外一個添加、編輯窗體,則按照相應的欄位放置好控制項。
- 給各控制項命好名。
XML文檔的格式如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <學生名單> 4 5 <學生 Name="李四一" class="0102"> 6 7 <性別>男</性別> 8 9 <生日>1999年1月2日</生日> 10 11 <學號>20170</學號> 12 13 </學生> 14 15 <學生 Name="張三三" class="高一"> 16 17 <性別>男</性別> 18 19 <學號>0102</學號> 20 21 <生日>2017年6月18日</生日> 22 23 </學生> 24 25 </學生名單>
學生名單為根元素,班級為根元素中的子元素,班級中又嵌套<學生>標記,瞭解了數據是以怎麼的結構儲存那麼下麵就繼續。
數據在DataGridView中的顯示
將XML中的數據,順序顯示在DataGridView控制項中
1 //創建一個datatable存儲XML中的數據 2 3 DataTable dt = new DataTable(); 4 5 //指定每一列的列名,和數據類型 6 7 dt.Columns.Add("Id", (typeof(System.String))); 8 9 dt.Columns.Add("班級", (typeof(System.String))); 10 11 dt.Columns.Add("姓名", (typeof(System.String))); 12 13 dt.Columns.Add("學號", (typeof(System.String))); 14 15 dt.Columns.Add("生日", (typeof(System.String))); 16 17 dt.Columns.Add("性別", (typeof(System.String))); 18 19 //創建一個DataRow對象 20 21 DataRow dr = dt.NewRow(); 22 23 24 25 XmlDocument doc = new XmlDocument(); 26 27 //為相對路徑表示前二級的目錄 28 29 doc.Load(@"..//..//Students.xml"); 30 31 XmlElement root = doc.DocumentElement; 32 33 XmlNodeList studentNodes = root.GetElementsByTagName("學生"); 34 35 //使用foreach遍歷集合元素 36 37 foreach(var item in studentNodes) 38 39 { 40 41 dr["Id"] = ((XmlElement)item).GetAttribute("Id"); 42 43 dr["班級"] = ((XmlElement)item).GetAttribute("Class"); 44 45 dr["姓名"] = ((XmlElement)item).GetAttribute("Name"); 46 47 dr["學號"] = ((XmlElement)item).GetElementsByTagName("學號")[0].InnerText; 48 49 dr["生日"] = ((XmlElement)item).GetElementsByTagName("生日")[0].InnerText; 50 51 dr["性別"] = ((XmlElement)item).GetElementsByTagName("性別")[0].InnerText; 52 53 dt.Rows.Add(dr); 54 55 } 56 57 //將DataTable綁定到DataGridView控制項 58 59 dgvStudents.DataSource = dt;
增加記錄
因為添加學生和編輯學生都需要在同一個窗體,那麼在打開添加或編輯窗體時使用構造函數來傳值,並判斷是編輯還是添加。
1 添加編輯窗體代碼: 2 3 public partial class FrmStudentAddandEdit : Form 4 5 { 6 7 //全局變數接受傳值 8 9 bool IsAdd; 10 11 string Name; 12 13 //使用構造函數進行傳值 true為增加,false為編輯 14 15 public FrmStudentAddandEdit(bool isAdd, string name) 16 17 { 18 19 this.IsAdd = isAdd; 20 21 this.Name = name; 22 23 InitializeComponent(); 24 25 } 26 27 } 28 29 30 31 主窗體添加按鈕單擊事件代碼: 32 33 private void btnAdd_Click(object sender, EventArgs e) 34 35 { 36 37 //在創建窗體時傳值 38 39 FrmStudentAddandEdit form = new FrmStudentAddandEdit(true); 40 41 form.ShowDialog(); 42 43 } 44 45 46 47 新增記錄代碼: 48 49 private void btnOK_Click(object sender, EventArgs e) 50 51 { 52 53 XmlDocument doc = new XmlDocument(); 54 55 doc.Load(@"..//..//Students.xml"); 56 57 XmlElement root = doc.DocumentElement; 58 59 //添加<學生>子節點 60 61 XmlElement Shutdent = doc.CreateElement("學生"); 62 63 //設置Name屬性和Class屬性 64 65 Shutdent.SetAttribute("Name", txtName.Text.Trim()); 66 67 Shutdent.SetAttribute("Class", txtClass.Text.Trim()); 68 69 //創建子節點 70 71 XmlElement eSex = doc.CreateElement("性別"); 72 73 XmlText tSex = doc.CreateTextNode(cmbSex.Text.Trim()); 74 75 //子節點添加內容 76 77 eSex.AppendChild(tSex); 78 79 //將子節點添加進學生標記 80 81 Shutdent.AppendChild(eSex); 82 83 84 85 XmlElement eNum = doc.CreateElement("學號"); 86 87 XmlText tNum = doc.CreateTextNode(txtNumber.Text.Trim()); 88 89 eNum.AppendChild(tNum); 90 91 Shutdent.AppendChild(eNum); 92 93 94 95 XmlElement eBirthday = doc.CreateElement("生日"); 96 97 XmlText tBirthday = doc.CreateTextNode(dtpBirthday.Text.Trim('-')); 98 99 eBirthday.AppendChild(tBirthday); 100 101 Shutdent.AppendChild(eBirthday); 102 103 104 105 //將<學生>標記添加進根節點 106 107 root.AppendChild(Shutdent); 108 109 110 111 doc.Save(@"..//..//Students.xml"); 112 113 MessageBox.Show("添加成功!"); 114 115 this.Close(); 116 117 }View Code
編輯記錄
由於編輯需要查找到這條記錄然後複製到控制項中顯示,那麼在我們啟動”添加或編輯窗體”時需要判斷當前是添加狀態還是編輯狀態,並將表格選擇行的姓名欄位傳給構造函數,通過這個姓名欄位查找相應的值,然後篩選出來再給控制項賦值。
1 主視窗編輯按鈕單擊事件: 2 3 private void btnEdit_Click(object sender, EventArgs e) 4 5 { 6 7 //獲取當前選擇表格的行索引 8 9 int dgvIndex = dgvStudents.CurrentRow.Index; 10 11 //根據行索引獲取單元格的值 12 13 string name = dgvStudents.Rows[dgvIndex].Cells["姓名"].Value.ToString(); 14 15 FrmStudentAddandEdit form = new FrmStudentAddandEdit(false,name); 16 17 form.ShowDialog(); 18 19 } 20 21 22 23 窗體啟動事件進行判斷是添加還是編輯: 24 25 private void FrmStudentAddandEdit_Load(object sender, EventArgs e) 26 27 { 28 29 if (IsAdd) 30 31 { 32 33 this.Text = "添加學生"; 34 35 } 36 37 else 38 39 { 40 41 this.Text = "編輯學生名單"; 42 43 XmlDocument doc = new XmlDocument(); 44 45 doc.Load(@"..//..//Students.xml"); 46 47 XmlElement root = doc.DocumentElement; 48 49 //篩選出符合條件的標記 50 51 XmlElement selectEle = (XmlElement)root.SelectSingleNode("/學生名單/學生[@Name='" + Name + "']"); 52 53 //篩選出符合條件並給控制項賦值 54 55 txtName.Text = selectEle.GetAttribute("Name"); 56 57 txtClass.Text = selectEle.GetAttribute("Class"); 58 59 txtNumber.Text = selectEle.GetElementsByTagName("學號")[0].InnerText; 60 61 dtpBirthday.Text = selectEle.GetElementsByTagName("生日")[0].InnerText; 62 63 cmbSex.Text = selectEle.GetElementsByTagName("性別")[0].InnerText; 64 65 } 66 67 } 68 69 同樣在編輯好內容後,單擊確定按鈕後判斷當前是添加狀態還是編輯狀態: 70 71 private void btnOK_Click(object sender, EventArgs e) 72 73 { 74 75 if (IsAdd) 76 77 { 78 79 //添加記錄代碼…. 80 81 } 82 83 else 84 85 { 86 87 this.Text = "編輯學生名單"; 88 89 XmlDocument doc = new XmlDocument(); 90 91 doc.Load(@"..//..//Students.xml"); 92 93 XmlElement root = doc.DocumentElement; 94 95 //篩選出符合條件的標記 96 97 XmlElement selectEle = (XmlElement)root.SelectSingleNode("/學生名單/學生[@Name='" + Name + "']"); 98 99 selectEle.SetAttribute("Name",txtName.Text.Trim()); 100 101 selectEle.SetAttribute("Class",txtClass.Text.Trim()); 102 103 //篩選出的對象賦給XMLElement對象 104 105 XmlElement eSex = (XmlElement)selectEle.GetElementsByTagName("性別")[0]; 106 107 eSex.InnerText = cmbSex.Text; 108 109 XmlElement eNumber = (XmlElement)selectEle.GetElementsByTagName("學號")[0]; 110 111 eNumber.InnerText = txtNumber.Text; 112 113 XmlElement eBirth = (XmlElement)selectEle.GetElementsByTagName("生日")[0]; 114 115 eBirth.InnerText = dtpBirthday.Text; 116 117 118 119 doc.Save(@"..//..//Students.xml"); 120 121 MessageBox.Show("修改成功!"); 122 123 //這一步很重要一定要關閉視窗不然再次修改會出現不可預料的BUG 124 125 this.Close(); 126 127 } 128 129 }View Code
刪除記錄
也是一樣的邏輯獲取當前選擇表格的姓名欄位,然後按照相關姓名進行刪除,如果姓名不是唯一欄位,那麼可以使用ID,每次添加一條記錄的時候最大ID+1。
1 //獲取當前選擇表格的行索引及姓名 2 3 int dgvIndex = dgvStudents.CurrentRow.Index; 4 5 string name = dgvStudents.Rows[dgvIndex].Cells["姓名"].Value.ToString(); 6 7 //篩選出符合條件的標記 8 9 XmlElement selectEle = (XmlElement)root.SelectSingleNode("/學生名單/學生[@Name='" + Name + "']"); 10 11 //刪除指定子元素 12 13 root.RemoveChild(selectEle); 14 15 doc.Save(“…”); 16 17 //具體代碼省略。。。。。不會的同學可以回到上篇文章。
上面介紹的操作方法是最常使用幾種的,可以使用XML來完成一個數據量比較小的軟體,或者可以用來做軟體的配置文件。