2

what is the valid argument for IEnumerator on TreeNode?

i got the error on this line:

IEnumerator ie = tn.Nodes.GetEnumerator();

in this method:

private void parseNode(TreeNode tn)
    {
        IEnumerator ie = tn.Nodes.GetEnumerator();

        string parentnode = "";

        parentnode = tn.Text;

        while (ie.MoveNext())
        {
            TreeNode ctn = (TreeNode)ie.Current;

            if (ctn.GetNodeCount(true) == 0)
            {
                _nodeToString += ctn.Text;
            }
            else
            {
                _nodeToString += "<" + ctn.Text + ">";
            }
            if (ctn.GetNodeCount(true) > 0)
            {
                parseNode(ctn);
            }
        }

        _nodeToString += "</" + parentnode + ">";
        _nodeToString += "\n";
    }
Sam Holder
  • 32,535
  • 13
  • 101
  • 181
Vincent Dagpin
  • 3,581
  • 13
  • 55
  • 85

1 Answers1

5

(from comments)

Using the generic type 'System.Collections.Generic.IEnumerator' requires '1' type arguments

That means you have

using System.Collections.Generic;

and not

using System.Collections;

switch to the latter and it will work. IEnumerable / IEnumerator are the non-generic API.

Or better: use foreach - it is simpler, safer and more correct (you didn't remember to check for IDisposable, for example).

Additional notes:

  • concatenating strings in a loop is very bad - it causes telescopic string allocations (i.e. lots of intermediate strings); something like StringBuilder is preferred by a long margin
  • building xml by hand is not ideal - you need to encode etc; XmlWriter would be ideal

so IMO: use an XmlWriter that writes to a StringBuilder, using foreach

Untested, but something like:

    private string parseNode(TreeNode tn)
    {
        var sb = new StringBuilder();
        using (var writer = XmlWriter.Create(sb))
        {
            writer.WriteStartElement("xml");
            parseNode(tn, writer);
            writer.WriteEndElement();
        }
        return sb.ToString();
    }
    private void parseNode(TreeNode tn, XmlWriter writer)
    {
        if (tn.Nodes.Count > 0)
        {
            writer.WriteStartElement(tn.Text);
            foreach (TreeNode child in tn.Nodes)
            {
                parseNode(child, writer);
            }
            writer.WriteEndElement();
        }
        else
        {
            writer.WriteString(tn.Text);
        }
    }
Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900