C#基礎知識-使用XML完成一個小程式(十一)

来源:http://www.cnblogs.com/leonliuyifan/archive/2017/06/18/7044463.html
-Advertisement-
Play Games

上一篇中講到XML基本的結構,還有增刪改查的方法,這一篇中我們就來利用XML來完成一個簡單的訂單系統,主要是實現一個簡單學生名單的增刪改查,如果想要應用到實際的環境中建議考慮數據量的問題,如果數據量大使用XML的話會比較耗時,使用SQL的性能會好一些 這裡使用WinForm窗體程式,大致界面如下: ...


上一篇中講到XML基本的結構,還有增刪改查的方法,這一篇中我們就來利用XML來完成一個簡單的訂單系統,主要是實現一個簡單學生名單的增刪改查,如果想要應用到實際的環境中建議考慮數據量的問題,如果數據量大使用XML的話會比較耗時,使用SQL的性能會好一些

 

這裡使用WinForm窗體程式,大致界面如下:

 

  1. 創建了兩個窗體,一個主窗體用來顯示名單數據,當添加或者編輯操作時則使用另外一個窗體。
  2. 主窗體中放置四個按鈕,以及一個DataGridView控制項,另外一個添加、編輯窗體,則按照相應的欄位放置好控制項。
  3. 給各控制項命好名。

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來完成一個數據量比較小的軟體,或者可以用來做軟體的配置文件。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • du -sh 查看當前文件夾下文件與文件夾大小; df -hl 查看磁碟空間大小; ...
  • 最近重裝了系統,於是便重新配置了一下終端,使其更符合用戶習慣。 效果如下: 擁有語法高亮,命令行tab補全,自動提示符,顯示Git倉庫狀態等功能。 安裝 首先我們下載的 iTem2 這個軟體,比Mac自帶的終端更加強大。直接官網 http://iterm2.com/ 下載並安裝即可。 配置 將iTe ...
  • yum groups install -y "GNOME Desktop" "Graphical Administration Tools" ...
  • 在實際的系統開發中,我們往往需要一些簡單的的案例代碼,基於此目的我把Winform開發框架中各種閃光點和不錯的功能,有些是我們對功能模塊的簡單封裝,而有些則是引入了一些應用廣泛的開源組件進行集成使用,因此把它們做了一個Demo進行展示,以方便我們隨時瞭解和參考,並能夠快速應用相應的場景到具體的項目中... ...
  • 軟體環境: Win7 x64 SP1 SQL Server 2008r2 Visual Studio 2017 Professional 目標:取出示例資料庫 ReportServer 的表 Roles 中的所有記錄並顯示。 步驟: 一、添加軟體包 使用NuGet添加以下軟體包: ServiceSt ...
  • 一、泛型 假設我要寫個公用的輸出傳入參數的方法(不用泛型),因為萬物皆對象的理由,我先定義一個方法show(object obj),如下麵所示: 執行這個方法 如果傳入的是值類型,值類型轉換為引用類型,我們知道會發生裝箱,這是對性能的損害,想想如果是個集合,就得多次執行裝箱、拆箱操作。如ArrayL ...
  • .net core 填坑記之二目錄問題(獲取當前目錄、創建目錄) ...
  • SqlSugar 4.0 ORM框架的優勢 為了未來能夠更好的支持多庫分散式的存儲,並行計算等功能,將SqlSugar3.x全部重寫,現有的架構可以輕鬆擴展多庫。 源碼下載: https://github.com/sunkaixuan/SqlSugar 1.性能 性能最好的ORM之一,具有超越Dap ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...