كيفية عرض treenodes قبل العقد ملزم في treeview إلى العقد وثيقة XML
سؤال
ولدي تريفيف حيث على اختيار عقدة الصفات والقيم وليتم عرضها في مربع القائمة.
في treeView1_AfterSelect، يعتمد توزيع التعليمات البرمجية النص على تمثيل نصية للعقدة في عرض شجرة، والتي يمكن تغييرها في أي وقت وكسر كل منطق عرض القائمة. ينبغي القضاء على هذه التبعية القوية بين عرض شجرة وعرض القائمة حسب العقد ملزمة في treeview إلى العقد وثيقة XML، بحيث يمكن استخدام بيانات XML الخام لعرض النص في list.What أن أكتب هنا؟
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()
والشكر ....
المحلول
إذا فهمت السؤال بشكل صحيح كنت ترغب في الحصول على العودة إلى XmlNode عند تحديد TreeNode. الحل المعتاد هو لتخزين XmlNode في خاصية العلامات:
TreeNode tn = new TreeNode();
tn.Text = name;
tn.Tag = xmladdtreeNode;
ووفي AfterSelect
TreeNode treenode = e.Node;
XmlNode xmlNode = (XmlNode) treeNode.Tag;
نصائح أخرى
وحاولت ذلك ولكن حصلت على NullRefrenceException في هذا الخط على foreach (XmlAttribute xmlatt في attCol) على attcol
وهذا هو رمز كنت قد كتبت ..
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()