А List
-то какого типа?
Да, я знаю, это Linq. Методы расширения. Я просто не помню, в каком виде они возвращают.
А 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 совершенно_любой_собственный_класс_пофиг_какой(), ... };
}
так чтоли?
Да, только children тоже коллекция, ну или в ChildrenGetter
надо создать её.
Так а что тут странного?
В стандартном TreeView тоже объекты же, просто меньше возможностей и менее удобно.
Странно, как минимум, то, что при таком подходе будет отсутствовать поле text
(или как бы оно ни называлось). Откуда тогда он будет брать текст для отображения нода в списке? В getting started
этого не нашел.
Так любое свойство объекта может им стать.
Скачал ваш исходник, но не понял, как добавлять сабитемы к рутам. Возможно, всё так просто, что я этого не вижу.
roots
это коллекция IEnumerable
. Но как обращаться к ее элементам без foreach
?
Вот допустим, есть у меня теперь в roots
один элемент класса MyData
. Как к нему обратиться, чтобы что-то из него прочитать или записать?
В функцию для 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
.