📄 13.1.txt
字号:
Listing 13.1 Populating a TreeView Using XML
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Xml;
namespace _1_XmlTextReader
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem mnuOpen;
private System.Windows.Forms.MenuItem menuItem3;
private System.Windows.Forms.TreeView tvXML;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.ListView lvAttributes;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label lblTextNode;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void mnuOpen_Click(object sender, System.EventArgs e)
{
if( openFileDialog1.ShowDialog(this) == DialogResult.OK )
{
PopulateTreeView( openFileDialog1.FileName );
}
}
private void PopulateTreeView( string fileName )
{
XmlTextReader rdr = new XmlTextReader( fileName );
Stack nodeStack = new Stack();
TreeNode curTreeNode = null;
// clear tree view
tvXML.Nodes.Clear();
while( rdr.Read() )
{
switch (rdr.NodeType)
{
// new start element found
case XmlNodeType.Element:
{
// push last element onto stack
if( curTreeNode != null )
nodeStack.Push( curTreeNode );
// create new element
curTreeNode = new TreeNode( rdr.Name );
curTreeNode.Tag = new Hashtable();
// populate attribute hashtable for element
if( rdr.HasAttributes == true )
{
curTreeNode.ForeColor = Color.Red;
while( rdr.MoveToNextAttribute() )
{
((Hashtable) curTreeNode.Tag).Add(
rdr.Name, rdr.Value );
}
}
// add element to proper place in tree.
// Parent node is on top of stack
if( nodeStack.Count > 0 )
((TreeNode)nodeStack.Peek()).Nodes.Add(curTreeNode);
else
tvXML.Nodes.Add( curTreeNode );
if( rdr.Name.EndsWith( “/>” ))
{
if( nodeStack.Count > 0 )
curTreeNode = (TreeNode) nodeStack.Pop();
}
break;
}
case XmlNodeType.Text:
{
((Hashtable) curTreeNode.Tag).Add(“Text”, rdr.Value);
break;
}
case XmlNodeType.EndElement:
{
// pop the last parent node off the stack
if( nodeStack.Count > 0 )
curTreeNode = (TreeNode) nodeStack.Pop();
break;
}
default:
{
break;
}
}
}
rdr.Close();
}
private void tvXML_AfterSelect(
object sender,
System.Windows.Forms.TreeViewEventArgs e )
{
// clear attribute list view
lvAttributes.Items.Clear();
Hashtable atts = (Hashtable )tvXML.SelectedNode.Tag;
IDictionaryEnumerator attsEnum = atts.GetEnumerator();
// enumerate tree node attribute hashtable and add to listview
while( attsEnum.MoveNext() )
{
if( attsEnum.Key.ToString() != “Text” )
lvAttributes.Items.Add(new ListViewItem(
new string[]{attsEnum.Key.ToString(),
attsEnum.Value.ToString()} ));
}
if( ((Hashtable) tvXML.SelectedNode.Tag).ContainsKey( “Text” ))
{
lblTextNode.Text = ( ((Hashtable)
tvXML.SelectedNode.Tag)[“Text”].ToString());
}
else
{
lblTextNode.Text = “”;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -