0

次のようなxmlファイルがあります。

<servers>
<general name="1">      
        <service name="ser1"/>
        <service name="ser2"/>  
</general>
<general name="2">      
        <service name="ser1"/>
        <service name="ser2"/>  
</general>
</servers>

私のwinformアプリケーションでは、チェックボックスプロパティがtrueに設定されたツリービューリストがあります。達成しようとしているのは、このxmlファイルを読み取って、親ノードと子ノードの両方をこのツリービューに更新しようとしていることです。

私が試したことは次のとおりです。

XDocument doc = XDocument.Load(@"D:\\path.xml");
        TreeNode node;            
            var gnrl = from general in doc.Descendants("general")
                       select new
                       {
                           parent = general.Attribute("name").Value,
                           child = general.Descendants("service")
                       };
            //Loop through results
            foreach (var general in gnrl)
            {
                 // Add a root node.
            node = dcselectview.Nodes.Add(String.Format(general.parent));
                foreach (var ser in general.child)
                {
                        // Add a node as a child of the previously added node.
                        node = node.Nodes.Add(String.Format(ser.Attribute("name").Value));                        
                }
           }

ファイルを読み取り、すべての詳細が更新されますが、適切な方法ではありません。むしろ、以下のように表示されます。

ここに画像の説明を入力

必要:

親要素を子要素の上と下に配置したい。可能であれば、親要素のチェックボックスがないといいでしょう。

どんな助けでも本当に感謝しています..

編集:

私のコードが編集されました。今、私は下の新しい写真に示すようになっています:

ここに画像の説明を入力

2本の黒い線を別の子ノードとしてではなく、同じ行に配置したい..

4

5 に答える 5

0

これを試して:

public static class TreeViewExtension
{
    public static bool LoadNodesFromXML(this TreeView tv, string xml)
    {
        try
        {
            XDocument doc = XDocument.Parse(xml);
            TreeNode rootNode = new TreeNode();
            rootNode.Text = doc.Root.ToString().Split('>')[0] + ">";
            rootNode.LoadTreeNodes(doc.Root.Elements());
            tv.Nodes.Add(rootNode);
            return true;
        }
        catch { return false; }
    }
    public static void LoadTreeNodes(this TreeNode parentNode, IEnumerable<XElement> elements)
    {
        foreach (var e in elements) {
            TreeNode childNode = new TreeNode();                
            childNode.Text = e.ToString().Split('>')[0] + ">";
            parentNode.Nodes.Add(childNode);
            childNode.LoadTreeNodes(e.Elements());
        }
    }
}
//Usage:
var yourInputXMLString = "<servers><general name=\"1\"><service name=\"ser1\"/>" +
                         "<service name=\"ser2\"/></general><general name=\"2\">" +
                         "<service name=\"ser1\"/><service name=\"ser2\"/>" +
                         "</general></servers>";
treeView1.LoadNodesFromXML(yourInputXMLString);

ここに画像の説明を入力

于 2013-10-07T10:15:17.453 に答える
0

あなたの助けに感謝します::しかし、私は自分の別の解決策を見つけました::

XDocument doc = XDocument.Load(@"path\\test.xml");            

        // Add nodes to treeView1.
        TreeNode pnode;
        TreeNode cnode;
            var gnrl = from general in doc.Descendants("general")
                       select new
                       {
                           parent = general.Attribute("name").Value,
                           child = general.Descendants("service")
                       };
            //Loop through results
            foreach (var general in gnrl)
            {
                 // Add a root node.
            pnode = treeview.Nodes.Add(String.Format(general.parent));
                foreach (var ser in general.child)
                {
                // Add a node as a child of the previously added node.
                cnode = pnode.Nodes.Add(String.Format(ser.Attribute("name").Value));                        
                }
           }
于 2013-10-07T11:33:01.180 に答える