0

私はC#を初めて使用しますが、直面している問題は、プロセスID、プロセス名、および親IDのフィールドを持つプロセス情報のリストを含むXMLファイルがあることです。この xml ファイルをツリー ビューに入力する際に​​助けが必要です。XML ファイルはフォーマットされたものではありません。私の XML ファイルは次のようになります。

<Process id="0" name="[System Process]" ParentPID="0" />
<Process id="4" name="System" ParentPID="0" />
<Process id="100" name="MyApp.exe" ParentPID="4" />
<Process id="120" name="avgrsx.exe" ParentPID="10"/>
<Process id="150" name="avgcsrvx.exe" ParentPID="120" />
<Process id="155" name="csrss.exe" ParentPID="100" />
<Process id="170" name="winlogon.exe" ParentPID="100" />
<Process id="180" name="services.exe" ParentPID="170" />
<Process id="200" name="lsass.exe" ParentPID="170" />
<Process id="110" name="svchost.exe" ParentPID="180" />
<Process id="380" name="svchost.exe" ParentPID="200"/>
<Process id="530" name="svchost.exe" ParentPID="1764" />
<Process id="420" name="Avg.exe" ParentPID="110" />

次のようなツリー ビューを C# で作成したいと考えています。

0
|-4
|  |-100
|     |-155
|     |-170
|       |-180
|       |   |-110
|        |      |-420
|        |-200
|            |-380
|-10     
|  |-120
|     |-150  
|-155
|-1764
    |-530  

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

2

これがあなたのための私の解決策です:

    private TreeNode[] FindTreeNodes(string Key)
    {
        return oTreeView.Nodes.Find(Key, true);
    }

    private void LoadTreeview(string XmlFile)
    {
        oTreeView.Nodes.Clear();

        if (File.Exists(XmlFile) == true)
        {
            XmlDocument oXmlDocument = new XmlDocument();
            oXmlDocument.Load(XmlFile);

            XmlNodeList oXmlNodeList = oXmlDocument.SelectNodes("/Processes/Process");

            foreach (XmlNode oXmlNode in oXmlNodeList)
            {
                int iID = Convert.ToInt32(oXmlNode.Attributes["id"].Value);
                string sName = oXmlNode.Attributes["name"].Value;
                int iParentID = Convert.ToInt32(oXmlNode.Attributes["ParentPID"].Value);

                TreeNode[] oParentNodes = FindTreeNodes(iParentID.ToString());
                if (oParentNodes.Length == 0)
                {
                    TreeNode oTreeNode = new TreeNode();

                    oTreeNode.Name = iID.ToString();
                    oTreeNode.Text = String.Format("{0} ({1})", sName, iID);

                    oTreeView.Nodes.Add(oTreeNode);
                }
                else
                {
                    if (oParentNodes.Length > 0)
                    {
                        foreach (TreeNode oParentTreeNode in oParentNodes)
                        {
                            TreeNode oTreeNode = new TreeNode();

                            oTreeNode.Name = iID.ToString();
                            oTreeNode.Text = String.Format("{0} ({1})", sName, iID);

                            oParentTreeNode.Nodes.Add(oTreeNode);
                        }
                    }
                    else
                    {
                        Console.WriteLine("  ** Could not find the parent node {0} for child {1} ({2})", iParentID, sName, iID);
                    }
                }
            }
        }
    }

    protected override void OnLoad(EventArgs E)
    {
        base.OnLoad(E);

        LoadTreeview("Xml.xml");
    }

XML を少し変更して、次のようにしました。基本的には同じです。

<?xml version="1.0" encoding="utf-8" ?>

<Processes>
  <Process id="0" name="[System Process]" ParentPID="0" />
  <Process id="4" name="System" ParentPID="0" />
  <!--
  <Process id="10" name="MissingNode" ParentPID="0" />
  <Process id="1764" name="MissingNode" ParentPID="0" />
  -->
  <Process id="100" name="MyApp.exe" ParentPID="4" />
  <Process id="120" name="avgrsx.exe" ParentPID="10"/>
  <Process id="150" name="avgcsrvx.exe" ParentPID="120" />
  <Process id="155" name="csrss.exe" ParentPID="100" />
  <Process id="170" name="winlogon.exe" ParentPID="100" />
  <Process id="180" name="services.exe" ParentPID="170" />
  <Process id="200" name="lsass.exe" ParentPID="170" />
  <Process id="110" name="svchost.exe" ParentPID="180" />
  <Process id="380" name="svchost.exe" ParentPID="200"/>
  <Process id="530" name="svchost.exe" ParentPID="1764" />
  <Process id="420" name="Avg.exe" ParentPID="110" />
</Processes>

最後に、次のノードは XML 内に定義がないため表示されません。

  • 10
  • 1764年

これらは、上記の XML ファイル内でコメント アウトされています。

これがあなたが探しているものであることを願っています。

乾杯!

于 2012-08-23T04:58:23.047 に答える
0

次のアルゴリズムを試してください。

       TreeNode[] arr = new TreeNode[elemCnt]

       arr[0] = new TreeNode with base (root) element

        For each XML element "Process":

                   Let v = Find parent node with linear search in ar


                   If v is not null ( parent found)

                               Add element as child to v

                   Add element to arr

        Add nodes that have null parents to TreeView.Nodes
于 2012-08-23T04:10:02.120 に答える