[置頂] c#如何實現(xiàn)從xml中加載樹目錄,并且顯示完整的Text
來源:程序員人生 發(fā)布時間:2015-04-03 08:16:46 閱讀次數(shù):2953次
談到xml,相信有1定編程基礎的童鞋們都比較清楚了。xml文件格式類似于嵌套的樣式,這類獨特的層次結構很容易使我們聯(lián)想到目錄樹,因此這不由讓我們對二者之間產(chǎn)生1種牽線的想法。這不由,使我們有這么1個問題:如何將xml存儲的數(shù)據(jù)轉(zhuǎn)換成目錄樹情勢??
首先我先貼1段xml代碼:
<nativeplace>
<China text="中國" value="中國">
<ShanDong text="山東" value="山東">
<JiNing text="濟寧" value="濟寧">
<RenChengQu text="任城區(qū)" value="任城區(qū)">
<ChangGouZhen text="長溝鎮(zhèn)" value="長溝鎮(zhèn)">
</ChangGouZhen>
</ReChengQu>
</JiNing>
</ShanDong>
</China></nativeplace>
這段代碼很清楚的展現(xiàn)給我們他們之間的層次關系,接下來,我們就將此xml中的區(qū)域與c#的TreeView進行聯(lián)系,從而到達我們想要的目錄樹效果。
首先我們需要將xml加載到TreeView中。加載xml也就是我們所說的找到xml然后讀取xml內(nèi)容。在這里我多介紹1段關于尋覓程序集路徑的代碼,我做項目習慣于將xml文件放在程序集bin/Debug下,緣由也是c#提供了此訪問方式。
接下來的1段代碼便是讀取項目的程序集Debug路徑的方法:
public String GetAssemblyFileDirectory()
{
#region 變量說明
String FilePath, StringX;
FileInfo FileInfoX;//這里我創(chuàng)建的操作文件夾的類,固然你你也能夠用其它方式
Uri UriX;
#endregion
#region 獲得.dll的位置
//獲得.dll文件的位置,主要是用于肯定
數(shù)據(jù)庫文件
StringX = Assembly.GetCallingAssembly().CodeBase;
//生成1個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(); //創(chuàng)建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; //創(chuàng)建1個xml元素,將獲得的每個結點轉(zhuǎn)換成xml元素,方便對其進行屬性賦值。
TreeNode newTreeNode = new TreeNode();//創(chuàng)建1個新的treenode,將xmlnode中信息存到treenode中。
newTreeNode.Text = xe.GetAttribute("text");
newTreeNode.Name = xe.GetAttribute("value");
treeNode.Add(newTreeNode);//將創(chuàng)建并包括信息的treenode加載到treenode集合中。
if (node.HasChildNodes)
{
bindXmlToTreeView(node.ChildNodes, newTreeNode.Nodes);//孫子結點加載
}
}
}
這樣我們就創(chuàng)建好了1個目錄樹,接下來我展現(xiàn)1下我之前創(chuàng)建好的1個目錄樹的效果圖:

有時我們需要獲得treenode的text,但是,當我們點擊1個結點時如何獲得完全的結點名呢(就是加上其所有父節(jié)點的text)?,其實我們可以這樣來實現(xiàn):
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;//這樣總是獲得結點的父節(jié)點text。
text = text.Parent;//我們text結點是傳遞過來的點擊結點,然后不斷將其父節(jié)點賦值給它,這樣就能夠向上推上去了。知道treeview中的根節(jié)點。
}
nativeplace["address"] = fullText.Text;//這里只是將結點的文本復制給傳遞過來的datarow相應的列,大家可以不用管,現(xiàn)在你可以用監(jiān)視去查看1下fullText.Text就會顯示完全的目錄名了。
}
點擊肯定按鈕,則在datagridview中顯示詳細的名字:

至此xml加載到treeview的方法介紹終了!
再次祝大家元宵節(jié)快樂!!
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈