如何在c#中递归构建treeview

时间:2010-09-21 22:20:05

标签: c# recursion treeview

private void enumerateValues(IEnumerator<KeyValuePair<string, object>> iEnumerator, TreeNode parentnode)
{
   if(iEnumerator is IEnumerable)
   {
     // ADD THE KEY
     TreeNode childNode = parentnode.Nodes.Add(iEnumerator.Current.Key);

     enumerateValues(iEnumerator.Current.Value, childNode);
   }
  else
   {
     /// add the value
     TreeNode childNode = parentnode.Nodes.Add(iEnumerator.Current.Value.ToString());
   }
}

我以某种方式得到以下错误:

  

最佳重载方法匹配'WindowsFormsApplication1.Form1.enumerateValues(System.Collections.Generic.IEnumerator&lt; System.Collections.Generic.KeyValuePair&lt; string,object&gt;&gt;,    System.Windows.Forms.TreeNode)'有一些无效的参数
  参数'1':无法从'object'转换为'System.Collections.Generic.IEnumerator&lt; System.Collections.Generic.KeyValuePair&lt; string,object&gt;&gt;'

我该如何解决呢

1 个答案:

答案 0 :(得分:1)

以下几行很可能是罪魁祸首:

enumerateValues(iEnumerator.Current.Value, childNode);

由于enumerateValues方法接受IEnumerator<KeyValuePair<string, object>>,因此键值对的值始终为object类型。因此,您无法使用iEnumerator.Current.Value调用该方法,因为该值不属于IEnumerator<KeyValuePair<string, object>>类型。

这正是错误消息告诉您的内容:

  

参数'1':无法从'object'转换为'System.Collections.Generic.IEnumerator&lt; System.Collections.Generic.KeyValuePair&lt; string,object&gt;&gt;'

在调用方法之前,您必须先将iEnumerator.Current.Value强制转换为正确的类型。您可以使用as operator

执行此操作
private void enumerateValues(IEnumerator<KeyValuePair<string, object>> iEnumerator, TreeNode parentnode)
{
  // Loop through the values.
  while (iEnumerator.MoveNext())
  {
    // Try a 'safe' cast of the current value.
    // If the cast fails, childEnumerator will be null.
    var childEnumerator = iEnumerator.Current.Value as IEnumerator<KeyValuePair<string, object>>;

    if (childEnumerator != null)
    {
      TreeNode childNode = parentnode.Nodes.Add(iEnumerator.Current.Key);

      enumerateValues(childEnumerator, childNode);
    }
    else
    {
      TreeNode childNode = parentnode.Nodes.Add(iEnumerator.Current.Value.ToString());
    }
  }
}

我还建议您使用IEnumerable<T>代替IEnumerator<T>,如果可以的话。它更清楚地显示了代码的意图,您不必手动处理迭代,并且可以在其上使用LINQ

private void enumerateValues(IEnumerable<KeyValuePair<string, object>> items, TreeNode parentnode)
{
  foreach (var item in items)
  {
    // Try a 'safe' cast of the current value.
    // If the cast fails, childEnumerator will be null.
    var childEnumerator = item.Value as IEnumerable<KeyValuePair<string, object>>;

    if (childEnumerator != null)
    {
      TreeNode childNode = parentnode.Nodes.Add(item.Key);

      enumerateValues(childEnumerator, childNode);
    }
    else
    {
      TreeNode childNode = parentnode.Nodes.Add(item.Value.ToString());
    }
  }
}