標籤:datagridview c# 分類樹
談到xml,相信有一定編程基礎的童鞋們都比較清楚了。xml檔案格式類似於嵌套的樣式,這種獨特的階層很容易使我們聯想到分類樹,因此這不禁讓我們對兩者之間產生一種牽線的想法。這不禁,使我們有這麼一個問題:如何將xml儲存的資料轉換成分類樹形式??
首先我先貼一段xml代碼:
<nativeplace> <China text="中國" value="中國"> <ShanDong text="山東" value="山東"> <JiNing text="濟寧" value="濟寧"> <RenChengQu text="任城區" value="任城區"> <ChangGouZhen text="長溝鎮" value="長溝鎮"> </ChangGouZhen> </ReChengQu> </JiNing> </ShanDong> </China></nativeplace>
這段代碼很清楚的展示給我們他們之間的層次關係,接下來,我們就將此xml中的地區與c#的TreeView進行聯絡,從而達到我們想要的分類樹效果。
首先我們需要將xml載入到TreeView中。載入xml也就是我們所說的找到xml然後讀取xml內容。在這裡我多介紹一段關於尋找程式集路徑的代碼,我做項目習慣於將xml檔案放在程式集bin/Debug下,原因也是c#提供了此訪問方式。
接下來的一段代碼便是讀取項目的程式集Debug路徑的方法:
public String GetAssemblyFileDirectory(){#region 變數說明String FilePath, StringX;FileInfo FileInfoX;//這裡我建立的操作檔案夾的類,當然你你也可以用其它方式Uri UriX;#endregion#region 擷取.dll的位置//擷取.dll檔案的位置,主要是用於確定資料庫檔案StringX = Assembly.GetCallingAssembly().CodeBase;//產生一個URI,以用於解析UriX = new Uri(StringX);//擷取設定檔的目錄FileInfoX = new FileInfo(UriX.LocalPath);FilePath = FileInfoX.DirectoryName;//if (!(FilePath.Substring(FilePath.Length - 1, 1) == @"\"))//{ FilePath = String.Concat(FilePath, @"\"); }return FilePath;#endregion} 這樣我們就擷取了xml檔案的位置,接下來我們所做的就是載入xml檔案。具體代碼如下:
helper = new Helper();//此類中包含了擷取程式集目錄的方法 xmlpath = helper.GetAssemblyFileDirectory() + "/Resources/Dictionary.xml"; XmlDocument xmldoc = new XmlDocument(); //建立xml文檔類 xmldoc.Load(xmlpath);//載入xml文檔 xmlNode = xmldoc.DocumentElement.SelectSingleNode("nativeplace");//擷取結點nativeplace nodes = xmlNode.ChildNodes;//擷取nativeplace結點下的所有孩子結點,此孩子是真孩子結點,並非所有的“後代”結點 bindXmlToTreeView(nodes, nativePlaceTreeView.Nodes);//該方法是將xml結點載入到TreeView分類樹中接下來我們所做的便是如何遍曆nativeplace下所有子結點以及孫子結點等。方法如下:
public void bindXmlToTreeView(XmlNodeList nodeList, TreeNodeCollection treeNode) { foreach (XmlNode node in nodeList) { XmlElement xe = (XmlElement)node; //建立一個xml元素,將擷取的每一個結點轉換成xml元素,方便對其進行屬性賦值。 TreeNode newTreeNode = new TreeNode();//建立一個新的treenode,將xmlnode中資訊存到treenode中。 newTreeNode.Text = xe.GetAttribute("text"); newTreeNode.Name = xe.GetAttribute("value"); treeNode.Add(newTreeNode);//將建立並包含資訊的treenode載入到treenode集合中。 if (node.HasChildNodes) { bindXmlToTreeView(node.ChildNodes, newTreeNode.Nodes);//孫子結點載入 } } } 這樣我們就建立好了一個分類樹,接下來我展示一下我之前建立好的一個分類樹的:
有時我們需要擷取treenode的text,然而,當我們點擊一個結點時如何擷取完整的結點名呢(就是加上其所有父節點的text)?,其實我們可以這樣來實現:
private void okButton_Click(object sender, EventArgs e) { parentNode(nativePlaceTreeView.SelectedNode);//這裡是將擷取的點擊結點傳遞過去 this.Close(); }
private void parentNode(TreeNode text) { TreeNode fullText = text; while (text.Parent != null) { fullText.Text = text.Parent.Text +fullText.Text;//這樣總是擷取結點的父節點text。 text = text.Parent;//我們text結點是傳遞過來的點擊結點,然後不斷將其父節點賦值給它,這樣就可以向上推上去了。知道treeview中的根節點。 } nativeplace["address"] = fullText.Text;//這裡只是將結點的文本複製給傳遞過來的datarow相應的列,大家可以不用管,現在你可以用監視去查看一下fullText.Text就會顯示完整的目錄名了。 }
點擊確定按鈕,則在datagridview中顯示詳細的名字:
至此xml載入到treeview的方法介紹完畢!
再次祝大家元宵節快樂!!
c#如何?從xml中載入樹目錄,並且顯示完整的Text