Como exibir TreeNodes por nós de ligação no treeview para nós do documento XML
Pergunta
Eu tenho um Treeview onde sobre a seleção de um nó os atributos e valores deve ser exibido na caixa de listagem.
Em treeView1_AfterSelect, o código de texto de análise depende da representação textual para um nó na exibição em árvore, que pode ser alterado a qualquer momento e quebrar toda a lógica de exibição lista. Esta forte dependência entre a vista de árvore e a exibição da lista devem ser eliminados por nós de ligação no treeview para nós do documento XML, de modo que os dados XML bruto pode ser usado para texto de exibição no list.What Devo escrever aqui?
private static void AddingNodesToTree(XmlNode xmlNode,TreeNode tnode)
{
//Adding nodes to tree while looping through the entire XML file
if (xmlNode.HasChildNodes)
{
XmlNodeList nodeList = xmlNode.ChildNodes;
for (int i = 0; i <= nodeList.Count - 1; i++)
{
XmlNode xmladdtreeNode = xmlNode.ChildNodes[i];
String nodetype = "" + xmladdtreeNode.NodeType;
if (nodetype.Equals("Text") || nodetype.Equals("Comment"))
{
tnode.Nodes.Add(new TreeNode(xmladdtreeNode.InnerText));
}
else
{
String name = "<" + xmladdtreeNode.Name;
XmlAttributeCollection attCol = xmladdtreeNode.Attributes;
foreach (XmlAttribute xmlatt in attCol)
{
name += " " + xmlatt.Name + "=\"" + xmlatt.Value + "\"";
}
name += ">";
TreeNode tn = new TreeNode(xmladdtreeNode.Name);
tn.Text = name;
tnode.Nodes.Add(tn);
TreeNode treeNode = tnode.Nodes[i];
AddingNodesToTree(xmladdtreeNode,treeNode);
}
}//for
}//if
else
{
tnode.Text = xmlNode.OuterXml.Trim();
}//else
}//AddingNodesToTree
//To show Attributes and values of selected Nodes.
private void treeView1_AfterSelect(object sender,TreeViewEventArgs e)
{
TreeNode treenode = e.Node; //Node selected in Treeview
String text = treenode.Text;
String relevent = text;
Boolean flag = true;
while (flag)
{
int SpaceIndex = relevent.IndexOf(" ");
if (SpaceIndex != -1)
{
int indexofEqual = relevent.IndexOf('=', SpaceIndex);
if (indexofEqual != -1)
{
int indexOFValue = relevent.IndexOf("\"", indexofEqual + 2);
if (indexOFValue != -1)
{
String attribute = relevent.Substring(SpaceIndex + 1, indexofEqual - SpaceIndex - 1);
String value = relevent.Substring(indexofEqual + 2, indexOFValue - indexofEqual - 2);
listBox1.Items.Add("Attribute : " + attribute + " Value : " + value);
relevent = relevent.Substring(indexOFValue);
}
else
{
listBox1.Items.Add("Bad format of the xml file for this node");
flag = false;
}
}
else
{
flag = false;
}
}
else
{
flag = false;
}
}
}//AfterSelect()
Obrigado ....
Solução
Se eu entendi a pergunta corretamente, você quer voltar para o XmlNode quando um TreeNode é selecionado. A solução usual é a de armazenar o XmlNode na propriedade Tag:
TreeNode tn = new TreeNode();
tn.Text = name;
tn.Tag = xmladdtreeNode;
e na AfterSelect
TreeNode treenode = e.Node;
XmlNode xmlNode = (XmlNode) treeNode.Tag;
Outras dicas
Eu tentei isso, mas tenho a NullRefrenceException nesta linha foreach (xmlatt XmlAttribute em attCol) em attcol
Este é o código que eu escrevi ..
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
listBox1.Items.Clear();
XmlNode xNode = e.Node.Tag as XmlNode;
XmlAttributeCollection attCol = xNode.Attributes;
foreach (XmlAttribute xmlatt in attCol)
{
listBox1.Items.Add(xmlatt.Name);
listBox1.Items.Add(xmlatt.Value);
}
} //AfterSelect()