Дополнительная информация в нодах TreeView

А List-то какого типа?

Да, я знаю, это Linq. Методы расширения. Я просто не помню, в каком виде они возвращают.

Я про List<T> Class (System.Collections.Generic) | Microsoft Docs

То есть туда можно присвоить любую коллекцию, массив.

Я тоже. Но какого типа должен быть список?

            tvFavorites.Roots = new List<string>() { "0", "1" };

получается пустой список

Не знаю как там с примитивными типами, для объектов у столбцов указывается имя свойства.

Какие столбцы могут быть у TreeView? Это же дерево.

Ну в моем примере ж есть )

Дерево объектов, у каждого объекта свойства, которые могут быть столбцами.

Можно и одно свойство/столбец конечно. Тогда можно скрыть заголовок через HeaderStyle None.

если всё так просто, почему тогда

ничего не отображается?

Оно для объектов предназначено, с просто строками хз работает ли.

Тема же про доп. инфу в нодах.
Надо просто создать объекты со всей инфой, и хотя бы одно свойство для отображения указать в столбце.

а чем List<string> не коллекция? Сами же сказали любую, хотя я раза 3 переспрашивал, совсем любую любую, или какую-то определённую любую.

Я про любой сам тип коллекции: List, массив, …, всё, что является IEnumerable<T>.

А внутри да, объекты, что-то другое туда класть смысл не особо есть раз нужна доп. инфа.

В оф. примере же и создавались объекты из строк

Включу режим Ванги.
Вы пытаетесь сказать, что

public class совершенно_любой_собственный_класс_пофиг_какой
{
  совершенно_любой_собственный_класс_пофиг_какой parent;
  совершенно_любой_собственный_класс_пофиг_какой child;
  BlaBlaType blaBla;
}

Main()
{
roots = List<совершенно_любой_собственный_класс_пофиг_какой>() { new совершенно_любой_собственный_класс_пофиг_какой(), ... };
}

так чтоли? :open_mouth:

Да, только children тоже коллекция, ну или в ChildrenGetter надо создать её.

Так а что тут странного?

В стандартном TreeView тоже объекты же, просто меньше возможностей и менее удобно.

Странно, как минимум, то, что при таком подходе будет отсутствовать поле text (или как бы оно ни называлось). Откуда тогда он будет брать текст для отображения нода в списке? В getting started этого не нашел.

Так любое свойство объекта может им стать.

Скачал ваш исходник, но не понял, как добавлять сабитемы к рутам. Возможно, всё так просто, что я этого не вижу.
roots это коллекция IEnumerable. Но как обращаться к ее элементам без foreach?
Вот допустим, есть у меня теперь в roots один элемент класса MyData. Как к нему обратиться, чтобы что-то из него прочитать или записать?

:arrow_down:

В функцию для ChildrenGetter передается объект и надо вернуть его потомков.
И в CanExpandGetter аналогично вернуть есть ли потомки.
И еще ParentGetter, не уверен нужен ли он.

            tvFilesystem.CanExpandGetter = obj => ((FileSystemItem)obj).IsDir;
            tvFilesystem.ChildrenGetter = obj => ((FileSystemItem)obj).Children;
            tvFilesystem.ParentGetter = obj => ((FileSystemItem)obj).Parent;

Ну так из Roots и можно достать. Или Objects из TypedObjectListView<MyData> как в моем примере, чтоб не кастовать.
Только при изменении объектов после изначального заполнения/присвоения Roots надо вызывать RefreshObject, или для изменения списка в корне AddObject/RemoveObject.
https://stackoverflow.com/a/39723488/964478
https://stackoverflow.com/a/25382530/964478

Достать как?
MyData d = tvFilesystem.Roots[0];
Так ведь не скомпилируется.

Я в вашем коде не вижу обращения к нодам. Только это:

            tvFilesystem.ChildrenGetter = obj =>
            {
                try
                {
                    return ((FileSystemItem)obj).Children;
                }
                catch (UnauthorizedAccessException ex)
                {
                    BeginInvoke(new Action(() =>
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        tvFilesystem.Collapse(obj);
                    }));
                    return new List<FileSystemItem>();
                }
            };

но это, как я понял, просто возвращает чилдрена, если он есть или создаёт его при ошибке.

Там к CheckedObjects.

Но у _tptvFilesystem есть и Objects, что то же самое, что Roots.
_tptvFilesystem.Objects[0]

Или просто кастануть. (MyData) ...Roots[0].
UPD: а, не, в C# нет индексов у IEnumerable.

.Roots.Cast<MyData>().ToList()

У _tptvFilesystem есть, там сразу IList.