И еще в вашем коде не понятно, как добавляются сабитемы. Если это демонстрационный пример, то надо писать более детальные комментарии, чтобы даже ребёнок смог разобраться. А так это выглядит, как какая-то магия.
Они изначально существуют в иерархии объектов, это ж файловая система. Точнее они подгружаются при открытии элементов-папок. Поэтому достаточно этого
Если надо во время работы программы постепенно добавлять (например, кнопка “Добавить”), то надо сделать то, что нужно, с каким-то объектом, чтоб у него появились потомки (например, просто obj.Children.Add()) и
public class Item
{
public string Name;
public Category Category;
public Item(string name, Category category)
{
Name = name;
Category = category;
}
}
public class Category
{
public string Name;
public List<Item> Items = new List<Item>();
}
tvItems.CanExpandGetter = obj => obj is Category;
tvItems.ChildrenGetter = obj => ((Category)obj).Items;
tvItems.ParentGetter = obj =>
{
if (obj is Item)
{
return ((Item)obj).Category;
}
return null;
};
var category = new Category { Name = "Category 1" };
tvItems.Roots = new[] { category };
category.Items.Add(new Item("Item 1", category));
category.Items.Add(new Item("Item 2", category));
public class MyData
{
public List<MyData> Children { get; } = new List<MyData>();
public MyData Parent { get; set; }
public string DisplayName { get; set; }
}
Во! Удалил компонент с формы, закинул заново и заработало! Никогда бы до этого не додумался.
Но теперь другая проблема. Как сделать, чтобы ширина столбца автоматически растягивалась до ширины TreeView, чтобы ее вручную не ресайзить? Установка значения в -1 не помогает.
Каждый раз вручную проходить по всем чилдренам и диспозить?
Или просто вызывать удаление каждого чилдрена, если он есть, и, таким образом, событие tvFavorites_ItemsRemoving рекурсивно придёт для всех чилдренов?
Тут еще вопрос назрел (наверное, последний).
А как получить MyData выделенного нода? Дерево ведь с нодами не связано. Если я правильно понял, TreeListView это ListBox на стеройдах и у него вообще нодов нету.
private void tvFavorites_MouseDoubleClick(object sender, MouseEventArgs e)
{
MyData d = (sender as BrightIdeasSoftware.TreeListView).SelectedItem. ???? //что тут писать?
}
В вашем примере используется какой-то TypedObjectListView, но там не понятно, что это и как работает. Это какой-то совсем не синглтон