Вопрос по TreeView

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Greymos
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.01.2007 (Вт) 15:08

Вопрос по TreeView

Сообщение Greymos » 28.04.2008 (Пн) 21:25

В TreeView есть возможность установить CheckBoxes. Это замечательно, но при его установке это значение получают все узлы дерева. Есть ли возможность устанавливать это свойство для отдельных узлов? Т.е. родительские узлы будут группами свойств, а на дочерних пользователь ставит чеки там где нужно.

Greymos
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.01.2007 (Вт) 15:08

Re: Вопрос по TreeView

Сообщение Greymos » 30.04.2008 (Ср) 9:12

Greymos писал(а):В TreeView есть возможность установить CheckBoxes. Это замечательно, но при его установке это значение получают все узлы дерева. Есть ли возможность устанавливать это свойство для отдельных узлов? Т.е. родительские узлы будут группами свойств, а на дочерних пользователь ставит чеки там где нужно.

Вообщем придумал как выкрутится в этой ситуации. Нужно воспользоваться коллекцией ImageList. Т.е. подставлять рисунок галочки в нужный момент. Однако при написании этого кода возникли вопросы. Итак
Это в процедуру загрузки формы:
Код: Выделить всё
'Строю узлы
        Dim Node1, Node2, Node3 As TreeNode
        Node1 = TreeView1.Nodes.Add("AAA")
        Node2 = Node1.Nodes.Add("aaa")
        Node3 = Node2.Nodes.Add("1")
        Node3 = Node2.Nodes.Add("2")
        Node3 = Node2.Nodes.Add("3")
        TreeView1.ExpandAll()

        ' Создаю ImageList для TreeView
        Dim myImageList As New ImageList
        myImageList.Images.Add(Image.FromFile("PLUS.BMP"))

        ' Связываю ImageList с TreeView
        TreeView1.ImageList = myImageList

        ' Ставлю значение картинки по умолчанию
        TreeView1.ImageIndex = 1

Это в процедуру TreeView1_MouseUp:
Код: Выделить всё
Dim pnt As System.Drawing.Point
        pnt.X = e.X
        pnt.Y = e.Y
        If e.Button = MouseButtons.Right Then
            TreeView1.SelectedNode = TreeView1.GetNodeAt(e.X, e.Y)
            TreeView1.SelectedNode.ImageIndex = 0
        End If

Теперь собственно вопрос. 'Почему при таком коде рисунок появляется на узле выбранном до этого?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 30.04.2008 (Ср) 15:00

еперь собственно вопрос. 'Почему при таком коде рисунок появляется на узле выбранном до этого?
Я не вижу у себя такого поведения. Всё прекрасно работает. И даже без кода в обработчике MouseUp.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Greymos
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.01.2007 (Вт) 15:08

Сообщение Greymos » 30.04.2008 (Ср) 22:00

Nord777 писал(а):Я не вижу у себя такого поведения. Всё прекрасно работает. И даже без кода в обработчике MouseUp.

Без MouseUp картинка вставляться не будет :lol: Но ты навел меня на интересную мысль :idea: Понял почему начинается свистопляска с картинкой. Если убрать обработчик событий MouseUp и после запуска щелкнуть правой кнопкой по узлу то он на мгновение выделится и тутже выделение уйдет на предыдущий выделенный узел. Поэтому и получается что рисунок подставляется не на тот узел по которому щелкнули. Отсюда продолжаю спрашивать: Как сделать айс :cry:

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 01.05.2008 (Чт) 11:46

Без MouseUp картинка вставляться не будет
Кудаж она денется то? Ты вот что... Попробуй вставить картинки не в runtime'e, а в дизайнере форм. ListView должен подставлять нужные картинки автоматом, без всяких обработчиков. Если ничего не получиться, скидывай проект. Посмотрю.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Greymos
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.01.2007 (Вт) 15:08

Сообщение Greymos » 02.05.2008 (Пт) 10:33

В Общем разобрался в чем дело. Проблема в том, что неправильно идентифицировал значение свойства ImageIndex. Думал, что это номер рисунка в коллекции, а оказалось что это позиция в коллекции которая соответствует значению по умолчанию и в моем случаи картинки там вообще не должно быть. Отсюда и свистопляска. Выделяю узел назначаю значение ImageIndex и мой рисунок уходит на другой узел :P
Тогда объясните балбесу как подставить рисунок к узлу зная его индекс и таг , а также номер рисунка в коллекции. При этом рисунок должен оставаться при узле не смотря ни на сворачивание и разворачивание родительского узла. В общем не могу разобраться как программно назначить узлу свой уникальный рисунок.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.05.2008 (Сб) 11:15

При этом рисунок должен оставаться при узле не смотря ни на сворачивание и разворачивание родительского узла
Наверное придется рисовать самому. Создай новый класс (наследуясь от treeview) и перекрой метод OnDrawNode. В нем и рисуй свой нестандартный узел.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Greymos
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.01.2007 (Вт) 15:08

Сообщение Greymos » 03.05.2008 (Сб) 17:01

Nord777 писал(а):
При этом рисунок должен оставаться при узле не смотря ни на сворачивание и разворачивание родительского узла
Наверное придется рисовать самому. Создай новый класс (наследуясь от treeview) и перекрой метод OnDrawNode. В нем и рисуй свой нестандартный узел.

Спасибо тебе большое. Ты навел меня на верную мысль. Сделал проще.
Поскольку мой рисунок в коллекции единственный то стало быть его индекс = 0. Поэтому в процедуру загрузки вставил :
Код: Выделить всё
TreeView1.ImageIndex = 1
TreeView1.SelectedImageIndex = 1

А в процедуру TreeView1_DoubleClick следующее:
Код: Выделить всё
Dim nodeclick As TreeNode
nodeclick = TreeView1.SelectedNode
nodeclick.ImageIndex = 0
nodeclick.SelectedImageIndex = 0

Ну и естественно встроил отработку чтоб типа : раз щелкнул - появился рисунок, еще раз "жахнул" - исчезла. Чесно скажу - так до конца и не понял свойство ImageIndex, однако все работает. Еще раз Спасибо за помощь.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.05.2008 (Сб) 22:18

Посмотри этот код

Код: Выделить всё
Public Class Form1
  Dim ImList As New ImageList

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles MyBase.Load
    'Загрузить из ресурсов картинки состояния
    ImList.Images.Add("Check", My.Resources.bmpCheck)
    ImList.Images.Add("UnCheck", My.Resources.bmpUnCheck)

    MyTreeView1.ImageList = Nothing
    MyTreeView1.CheckBoxes = False
    MyTreeView1.StateImageList = ImList
    MyTreeView1.Nodes.Clear()

    'Добавить корневые ветки
    For i As Integer = 0 To 4
      MyTreeView1.Nodes.Add("Root" & i.ToString)
    Next

    Dim ParentNode, ChildNode As TreeNode
    'Пройтись по всем корневым веткам...
    For i As Integer = 0 To MyTreeView1.Nodes.Count - 1
      ParentNode = MyTreeView1.Nodes(i)
      'и в каждую добавить по три дочерних
      For i1 As Integer = 0 To 2
        ChildNode = ParentNode.Nodes.Add("Child" & i.ToString & "." & i1.ToString)
        ChildNode.StateImageKey = "UnCheck"
      Next
    Next

  End Sub

  Private Sub MyTreeView1_AfterCheck(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles MyTreeView1.AfterCheck
    With e.Node
      If .Checked Then .StateImageKey = "Check" Else .StateImageKey = "UnCheck"
    End With
  End Sub

  Private Sub MyTreeView1_MouseClick(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyTreeView1.MouseClick
    Dim TVHTI As TreeViewHitTestInfo = MyTreeView1.HitTest(e.Location)
    If TVHTI.Location = TreeViewHitTestLocations.StateImage Then
      TVHTI.Node.Checked = Not TVHTI.Node.Checked
    End If
  End Sub

End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Greymos
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.01.2007 (Вт) 15:08

Сообщение Greymos » 04.05.2008 (Вс) 22:41

Nord777 писал(а): Dim TVHTI As TreeViewHitTestInfo = MyTreeView1.HitTest(e.Location)

Классно написано. Вот только нельзя ли без TreeViewHitTestInfo и HitTest, а то у меня 2003 и другого нет.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 05.05.2008 (Пн) 12:43

Вот только нельзя ли без TreeViewHitTestInfo и HitTest, а то у меня 2003 и другого нет.
Если стоит Framework 2.0, то HitTest должен быть, если не стоит, то никто не мешает его поставить. Он бесплатный.

[url=http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&DisplayLang=ru]Дистрибутивный пакет Microsoft .NET Framework 2.0 (x86)
[/url]
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Greymos
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 30.01.2007 (Вт) 15:08

Сообщение Greymos » 05.05.2008 (Пн) 20:07

Nord777 писал(а):
Вот только нельзя ли без TreeViewHitTestInfo и HitTest, а то у меня 2003 и другого нет.
Если стоит Framework 2.0, то HitTest должен быть, если не стоит, то никто не мешает его поставить. Он бесплатный.

[url=http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&DisplayLang=ru]Дистрибутивный пакет Microsoft .NET Framework 2.0 (x86)
[/url]

Пишит что он уже установлен. Полагаю что нужен Студио 2005 или выше года. Руководство богатое :) пусть репу чешит где его раздобыть. Мое дело маленькое - изучай NET как можешь. Сказали что после празников будет. Посмотрим. Большое спасибо.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 101

    TopList