Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > TreeView


Автор: Idsa 27.3.2007, 17:23
Меня интересует, есть ли нормальный способ сделать так, чтобы TreeNode, не содержащие других TreeNode, отображались с плюсиком слева (по умолчанию они отображаются без возможности раскрытия). На данный момент я добиваюсь желаемого добавлением "фиктивных" элементов, что не есть красиво.

Надеюсь, что понятно объяснил суть проблемы.

Автор: ivashkanet 27.3.2007, 17:35
Цитата(Idsa @  27.3.2007,  16:23 Найти цитируемый пост)
На данный момент я добиваюсь желаемого добавлением "фиктивных" элементов, что не есть красиво.

Так все и делают ;-)

Только вот зачем тебе там плюсики?

Автор: Idsa 27.3.2007, 17:43
Цитата(ivashkanet @  27.3.2007,  17:35 Найти цитируемый пост)
Только вот зачем тебе там плюсики?

Мне нужно сделать так, чтобы на эти элементы можно было "открыть" щелчком мышки. А в этом деле без плюсиков никуда smile

Автор: ivashkanet 27.3.2007, 17:47
Idsa, оно-то понятно назначение плюсиков, но вот непонятно зачем раскрывать пустое

Добавлено через 1 минуту и 43 секунды
Просто, ИМХО, ты занимаешься постепенной подгрузкой нод по клику, так?

Тогда это единственный выход ;-)

Автор: Idsa 27.3.2007, 17:50
Так пустые они лишь потому, что я их пока не заполнил. Слишком долго заполнять весь TreeView разом, поэтому я оставляю неоткрытые ноды пустыми .а заполняю их только при раскрытии.

Автор: _Dream 28.3.2007, 12:19
не понял
то есть тебе надо чтоб раскрывались ноды то есть анбаунд модель?
и тебе надо у каждого нода + чтоб можно было раскрыть и только когда ты раскрыл то ты видишь пустой он или нет. то есть может быть так что ты кликнул по + он пропал а детей не появилось потому что их нет.. так?

я делал так
Код


// инициализация дерева - мой айтем который содаржит много всего но пока отображатся этого не будет и парент - он тут приходит как нул
private void initTree(FileItem resourceItem, TreeListNode parentNode)
{
    treeList.ClearNodes();
    treeList.BeginUnboundLoad();
    treeList.StateImageList = imageList;
    if (resourceItem != null)
    {
              TreeListNode _node = treeList.AppendNode(new object[] { _resourceItem }, parentNode);
              if (_resourceItem.Children.Count != 0) // если есть дети
              {
           _node.HasChildren = true;//!!
           _node.Tag = true;//!!
              }
             _node.StateImageIndex = getImageIndex(_node);
                }
            

    treeList.EndUnboundLoad();
}

// инициализация нода
private void initNode(Object value, TreeListNode parentNode)
{
    FileItem _item = value as FileItem;
    if (_item != null && _item.Children.Count != 0)
    {
        treeList.BeginUnboundLoad();
// есди есть дети(а мы об этом знаем из модели) 
        foreach (FileItem _child in _item.Children)
        {
            TreeListNode _node = treeList.AppendNode(new object[] { _child }, parentNode);
            if (_child.Children.Count != 0)
            {
                _node.HasChildren = true;
                _node.Tag = true;
            }
            _node.StateImageIndex = getImageIndex(_node);
        }
        treeList.EndUnboundLoad();
    }
}


// ну тут повешено инитНод
private void treeList_BeforeExpand(object sender, BeforeExpandEventArgs e)
{
    if (e.Node.Tag != null)
    {
        Cursor _currentCursor = Cursor.Current;
        Cursor.Current = Cursors.WaitCursor;
        initNode(e.Node.GetValue("mainColumn"), e.Node);
        e.Node.Tag = null;
        Cursor.Current = _currentCursor;
    }
}


не знаю то ли тебе надо  smile 

Автор: Idsa 28.3.2007, 15:14
Цитата(_Dream @  28.3.2007,  12:19 Найти цитируемый пост)
и тебе надо у каждого нода + чтоб можно было раскрыть и только когда ты раскрыл то ты видишь пустой он или нет.

Ну почти. Я знаю, есть ли у текущего элемента дети или нет, но даже при их наличии не создаю "детей" в связи с нецелесообразностью сего действия smile.
В общем же ты правильно понял суть проблемы: свойство HasChildren идеально мне подходит... НО такого свойства нет в TreeNode. А TreeList и TreeListNode я не нашел в MSDN... Это сторонние компоненты что ли?

P. S. А вообще, конечно, странно, что TreeNode лишили столь востребованной функциональности: ведь большинство юзает TreeView именно добавляя ноды динамически.

Автор: _Dream 28.3.2007, 16:34
ой точно это дивэкспресс же  smile 

Цитата

Я знаю, есть ли у текущего элемента дети или нет, но даже при их наличии не создаю "детей" в связи с нецелесообразностью сего действия .

так и у меня также - дети создаются только при событии раскрытия нода 
ЗЫ - может для стандартного дерева твой способ единственно верный? smile

Автор: Idsa 28.3.2007, 16:44
Цитата(_Dream @  28.3.2007,  16:34 Найти цитируемый пост)
ой точно это дивэкспресс же

Жаль...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)