Как рекурсивно построить TreeView в C # - PullRequest
1 голос
/ 22 сентября 2010
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 >, System.Windows.Forms.TreeNode) 'имеет недопустимые аргументы
Аргумент '1': невозможно преобразовать из 'объекта' в 'System.Collections.Generic.IEnumerator >'

Как я могу это исправить, пожалуйста

1 Ответ

1 голос
/ 22 сентября 2010

Скорее всего, виновником является следующая строка:

enumerateValues(iEnumerator.Current.Value, childNode);

Поскольку метод enumerateValues принимает IEnumerator<KeyValuePair<string, object>>, значения пар ключ-значение всегда будут иметь тип object. Поэтому вы не можете вызвать метод с iEnumerator.Current.Value, потому что значение не относится к типу IEnumerator<KeyValuePair<string, object>>.

Это именно то, что говорит вам сообщение об ошибке:

Аргумент '1': невозможно преобразовать из 'объекта' в 'System.Collections.Generic.IEnumerator >'

Прежде чем вы сможете вызвать метод, вам нужно сначала привести iEnumerator.Current.Value к правильному типу. Вы можете сделать это, используя как оператор .

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());
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...