Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2011, 06:53   #1
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию Как отследить удаление узла в TreeView

Здравствуйте.
Подскажите пожалуйста, как можно отследить удаление узла в TreeView.
Дело в том, что к узлам у меня привязаны элементы из внешнего списка, и когда удаляется родительский узел, то надо, что бы удалялись все связанные с ним и его потомками элементы во внешнем списке.
Greek9000 вне форума Ответить с цитированием
Старый 23.05.2011, 10:41   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Если у тебя есть привязка узел-элемент списка, то надо писать процедуру прохода по списку в глубь. Допустим ты нашел узел node,который надо удалить, тогда проходи по всем всем узлам node.Nodes[i], находи соответствующие им элементы и т.д. В общем рекурсия.
Дальше все зависит конкретно от твоей привязки. Обычно используют treeView.Nodes[i].Tag для хранения объекта.. Тогда этот объект должен содержать метод Delete,с которого и начинается рекурсия..
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 23.05.2011, 14:31   #3
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Скарам Посмотреть сообщение
Если у тебя есть привязка узел-элемент списка, то надо писать процедуру прохода по списку в глубь. Допустим ты нашел узел node,который надо удалить, тогда проходи по всем всем узлам node.Nodes[i], находи соответствующие им элементы и т.д. В общем рекурсия.
Дальше все зависит конкретно от твоей привязки. Обычно используют treeView.Nodes[i].Tag для хранения объекта.. Тогда этот объект должен содержать метод Delete,с которого и начинается рекурсия..
Удалить узел и отследить его удаление - это разные вещи.
Тут необходимо событие, которое возникает при удалении узла, а в TreeView я это событие найти не могу. Оно там вообще есть, или надо перекрывать Node.Remove()?
Greek9000 вне форума Ответить с цитированием
Старый 23.05.2011, 16:13   #4
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

ммм... каким образом удаляется узел?.. методом класса?,тогда следи за этим методом удаления узла. Просто само по себе ничего не удаляется и не создается.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 23.05.2011, 21:13   #5
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Без плясок с бубном тут не обойтись. Вот пример с переопределением самого TreeView. Так сказать расширенная версия оного.
Код:
        private class TreeViewEx : TreeView
        {

            public TreeViewEx()
            {
                SetStyle(ControlStyles.EnableNotifyMessage, true);
            }
            public event EventHandler NodeDeleted;

            protected override void OnNotifyMessage(Message m)
            {
                if (m.Msg == 0x1101)
                {
                    TV_ITEM itm = (TV_ITEM)Marshal.PtrToStructure(m.LParam, typeof(TV_ITEM));
                    string text = Marshal.PtrToStringAuto(itm.pszText);
                }
                base.OnNotifyMessage(m);
            }

            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            public struct TV_ITEM
            {
                public int mask;
                public IntPtr hItem;
                public int state;
                public int stateMask;
                public IntPtr pszText;
                public int cchTextMax;
                public int iImage;
                public int iSelectedImage;
                public int cChildren;
                public IntPtr lParam;
            }
        }
Есть один нюанс, если удаляется узел, у которого есть потомки, то для потомков не вызывается нотификация.
Spawn™Production® вне форума Ответить с цитированием
Старый 24.05.2011, 06:23   #6
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Спасибо.
Только я не понял, каким образом будет вызываться "public event EventHandler NodeDeleted;"
Greek9000 вне форума Ответить с цитированием
Старый 24.05.2011, 07:58   #7
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

А, самое главное и не сделал
Код:
 if (m.Msg == 0x1101)
                {
                    TV_ITEM itm = (TV_ITEM)Marshal.PtrToStructure(m.LParam, typeof(TV_ITEM));
                    string text = Marshal.PtrToStringAuto(itm.pszText);
                    if (NodeDeleted != null)
                        NodeDeleted(this, EventArgs.Empty);
                }
Единственное, что на вскидку ещё можно передать - текст удаляемого узла, а вот индекс его и родительские узлы уже труднее откопать, так как классы .NET'а лишь обёртка.
Spawn™Production® вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление узла из красно-черного дерева CodeNOT Общие вопросы C/C++ 0 18.05.2011 07:15
Выборка в DBGrid по выбору узла в TreeView WhiteDemon БД в Delphi 13 17.02.2011 19:29
Ссылка на объект у узла TreeView Sanprof Общие вопросы C/C++ 0 25.11.2010 13:42
TreeView - картинка только у определенного узла Sanprof Общие вопросы Delphi 1 16.08.2010 14:09