Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> встать на модифицированный узел 
:(
    Опции темы
FasterHarder
Дата 27.9.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Всем программистам привет! Respect! В общем столкнулся с такой проблемкой, суть: есть дерево реестра ОС Windows Treeview. Затем я хочу добавить новое значение для узла(все значения отображаю в listview). Добавив значение мне необходимо как то обновить информацию пользователю. Я просто сворачиваю и разварачиваю родительский узел ближайшей иерархии. Но также необходимо и позиционироваться на модифицированном узле? Подскажите как это можно реализовать? Подскажите как быть то?

P.S. у меня название модифицированного ключа, а также родительский узел по отношению к нему:
Код

string selNode = tree_Nodes.SelectedNode.Text;
            string parNode = tree_Nodes.SelectedNode.Parent.Text;  

юзаю класс RegistryKey. 
PM MAIL   Вверх
FasterHarder
Дата 27.9.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



что то кажется хреново объяснил проблему smile. Если абстрактно, то допустим есть некое дерево(TreeView) с 24 уровнями вложенности и я встал на 4 - ый уровень. На этом четвертом уровне я выбрал один из узлов и программно изменил его значение(аналогично работе реестра ОС). Программа автоматом естесно не обновляет информацию и необходимо сделать некий рефрешь. Что я имею:
1) название узла
2) название родительского узла(3 - й уровень)
3) и позиционирование на только что модифицированном узле
Рефрешь делается просто: сворачиванием иерархии третего уровня и разворачивания. Но есть проблема, как из всего множества узлов 4 - го уровня встать на тот, значение которого было модифицировано(название этого узла знаю)? Подскажите как быть то?

P.S. какой нить метод элементарный применить скорее всего smile 
PM MAIL   Вверх
tol05
Дата 27.9.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



FasterHarder, ИМХО было бы легче, если бы ты не приводил в вопросе ненужные подробности. 
Цитата(FasterHarder @  27.9.2007,  20:02 Найти цитируемый пост)
есть дерево реестра ОС Windows
Цитата(FasterHarder @  27.9.2007,  20:02 Найти цитируемый пост)
юзаю класс RegistryKey

Это важно? А если бы ты xml-файл в TreeView выводил и ноды добавлял/удалял, то проблем с позиционированием не было бы? smile  У тебя проблемы с  Treeview и его нодами, и больше ни с чем.

храни где-нибудь ссылку
Код

TreeNode currentNode

очень поможет для дальнейших операций (а они появятся как только заказчик увидит твою программу, уж поверь мне на слово smile ). В идеале в каждом бизнес-объекте (ты же в ListView значения бизнес-объектов выводишь?) нужно хранить ссылку на ту ноду, на которую он повешен в TreeView.
Когда ты делаешь что-то с TreeView или конкретной нодой - обновляй эту ссылку
Код

currentNode = rootTreeView.SelectedNode;
//или
currentNode = myNewNode; //перед тем, как новую ноду добавить в дерево


ну и все. В нужный момент вызываешь
Код

rootTreeView.SelectedNode = currentNode;
currentNode.Expand();
rootTreeView.Refresh();



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
mihryak
Дата 28.9.2007, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(tol05 @  28.9.2007,  00:38 Найти цитируемый пост)
В идеале в каждом бизнес-объекте нужно хранить ссылку на ту ноду, на которую он повешен в TreeView.

А не наоборот? так выйдет, что при смене отображения (например, долой деревья, даёшь листвью!) придётся ковырять и сами бизнес-объекты. И даже если на первое время такое свойство мало где будет задействовано, практика показывает, что "лишние" свойства и методы постепенно будут расползаться по коду, что ещё больше усложнит задачу рефакторинга.

PM MAIL ICQ   Вверх
FasterHarder
Дата 28.9.2007, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



спасибо tol05, я понял как получить тот же узел, но фактически не происходит позиционирования на модифированном узле, т е он не подсвечивается. Я получаю значение узла(имеется аналогия работы с реестром) когда кликну по нему мышой, все значения отображаются в ListView. А в твоем алгоритме проихсходит простой рефрешь при котором новое значение узла(не путать с добавлением нового простого или сложного узла и его названия) не отображается. Т е необходим некий алгоритм, делающий следующее:
1) добавил новое значение(если непонятно, то см. реестр ОС) уже есть
2) необходимо как то обновить даже не сам узел, а только значение, внесенное в пункте 1. этого нет.

Код

у меня есть метод:
//================================================================
        // Намерение: получить информацию о выбранном ключе(т е определяем название ключа и его значение)
        //================================================================
        private void button4_Click(object sender, EventArgs e)
        {
            baseLevel = "";
            listView1.Items.Clear();
            try
            {
                selectedNode = tree_Nodes.SelectedNode.FullPath;
                if (selectedNode == "")
                {
                    MessageBox.Show("В данный момент ни один из узлов дерева не выбран. Необходимо выбрать конкретный узел",
                        "Сообщение для пользователя", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
            }
            catch (Exception exep)
            {
                MessageBox.Show(exep.Message + " Выделите узел для получения информации", "Сообщение для пользователя", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            for (int w = 0; w < selectedNode.Length; w++)
            {
                if (selectedNode[w].ToString() != @"\")
                    baseLevel = baseLevel + selectedNode[w];
                else
                {
                    break;
                }
            }
            try
            {
                selectedNode = selectedNode.Remove(0, baseLevel.Length + 1);
            }
            catch (Exception exep)
            {
                MessageBox.Show(exep.Message);
                return;
            }
            for (int i = 0; i < base_rk.Length; i++)
            {
                if (base_rk[i].Name == baseLevel)
                {
                    RegistryKey rk = base_rk[i].OpenSubKey(@selectedNode, true);

                    //////////
                    flag = i;
                    //////////

                    if (rk != null)   // т е если узел существует, то обрабатываем его
                    {
                        foreach (string str in rk.GetValueNames())
                        {                            
                            object obj = rk.GetValue(str);
                            ListViewItem lvi = new ListViewItem(str);

                            lvi.SubItems.Add(obj.GetType().Name.ToString());

                            if (obj.GetType().IsArray)
                            {
                                byte[] b = obj as byte[];                                
                                string valueNode = "";
                                foreach (byte bit in b)
                                {
                                    int curr = bit;
                                    curr = curr >> 4;
                                    valueNode = valueNode + hx[curr];
                                    curr = bit;
                                    curr = curr & 15;
                                    valueNode = valueNode + hx[curr] + " ";
                                }
                                lvi.SubItems.Add(valueNode);
                            }
                            else
                            {
                                lvi.SubItems.Add(obj.ToString());
                            }
                            listView1.Items.Add(lvi);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Указанного узла в реестре физически не существует", "Сообщение для пользователя", MessageBoxButtons.OK);
                    }
                }
            }            
        } 


т е можно вызвать нажатие этой кнопки, для повторного считывания всех значений этого ключа, в том числе только что введенного. Но как корректно вызвать этот клик? Подскажите как быть то?
PM MAIL   Вверх
tol05
Дата 28.9.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(mihryak @  28.9.2007,  08:28 Найти цитируемый пост)
А не наоборот? так выйдет, что при смене отображения (например, долой деревья, даёшь листвью!) придётся ковырять и сами бизнес-объекты. И даже если на первое время такое свойство мало где будет задействовано, практика показывает, что "лишние" свойства и методы постепенно будут расползаться по коду, что ещё больше усложнит задачу рефакторинга.
Теория - хорошая вещь. Но на практике ... вспоминаешь что теорий много и все остальные - тоже хорошие.
конечно НЕ наоборот. Можно в TreeNode использовать свойство Tag для хранения ссылки на забинденный объект... Но как найти ноду конкретного объекта, чтобы изменить ее? Поиском по всем нодам дерева? Прежде всего работа идет в бизнес-слое, с объектами, и юзер-интерфейс - только инструмент отображения результатов работы бизнес-слоя. Если в бизнес-слое объект А заменяется на объект В, то как найти ту ноду, которая отображала A.Text, чтобы отобразить B.Text? 

А чтобы не было "что при смене отображения (например, долой деревья, даёшь листвью!) придётся ковырять и сами бизнес-объекты" создается над объектом враппер под конкретный контрол. Т.е. есть бизнес-объект BusinessObj, от него делают TreeViewBusinessObj, или ListViewBusinessObj и т.д. Это не сложно, если хранить ссылку Control bindedControl (и свойство типа Control), а в конкретном враппере переопределять свойство под нужный тип. Нечто подобное паттерну "декоратор".
Хотя если юзер-интерфейс продуман, то достаточно ссылки только на один тип объектов, а остальные привязки нетрудно вывести из данных в самом слое представления, не трогая бизнес-слой вообще.

P.S. mihryak, я конечно могу ошибаться, но... просто я почти 5 месяцев делал один редактор... И выбрал именно этот вариант решения.

FasterHarder, 
Цитата(FasterHarder @  28.9.2007,  08:32 Найти цитируемый пост)
(если непонятно, то см. реестр ОС) уже есть

Да куда там... Я даже не знаю что такое "реестр ОС" !  А ты говоришь "смотри"...  smile Да и не очень интересно... так что "смотри" сам. 
А по поводу 
Цитата(FasterHarder @  28.9.2007,  08:32 Найти цитируемый пост)
фактически не происходит позиционирования на модифированном узле, т е он не подсвечивается.
так "фактически" - все есть. Только фокус дереву нужно дать. Мышкой ты его даешь автоматом...
Код

rootTreeView.SelectedNode = currentNode;
currentNode.Expand();
rootTreeView.Focus();
rootTreeView.Refresh();



Это сообщение отредактировал(а) tol05 - 28.9.2007, 10:52


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
FasterHarder
Дата 28.9.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Всем спасибо, сделал, но не так как описано выше, а вынес просто один кусок в отдельную процедуру. Наверное можно как то сделать и проще, но это и хорошо, есть куда стремиться smile))).  
PM MAIL   Вверх
mihryak
Дата 28.9.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



tol05, вариант с bindedControl ничего так smile
в разработке UI я не силён, как наши интерфейсщики строят и показывают контролы не в курсе, абизнес-объекты просто реализуют INotifyPropertyChanged
PM MAIL ICQ   Вверх
tol05
Дата 28.9.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(mihryak @  28.9.2007,  20:06 Найти цитируемый пост)
абизнес-объекты просто реализуют INotifyPropertyChanged

все зависит от конкретной заддачи. Я тоже не был в восторге от своего варианта, но он работал надежно.
INotifyPropertyChanged - это что? намеренное усложнение UI-слоя? Укрепление связей между бизнесом и рабочими элементами? smile

mihryak, представь себе ситуацию такую:
MyObjectCollection содержит сколько угодно MyObject и сколько угодно MyObjectCollection. Это все биндится на дерево, отображается в гридах и рисуется на панелях (синхронно). Это набор "А"
Есть еще наборы "В", "С" и "и т.д."

Наборы должны не только переключаться с бинданием соответсвенно и с прорисовкой, но и должна быть возможность копирования, перемещения любого объекта (любой коллекции) из одного набора в другой. При этом необходимо проверять уровни допустимого размещения объектов и коллекций, чтобы объект A.Level1.Collection4.Object5 можно было копировать (перемещать) только в В.Level1.Collection4 или в В.Level2.Collection4, но не вместо коллекции (не В напрямую) и не в В.Level2.Collection2. Ну и  т.д.
Про удаление и создание новых я и не говорю.

Так вот как можно привязать Notifier-ы к ноде из набора А, которая вырезана операцией cut и никуда еще не вставлена, потому что идет переключение набора объектов и набор В сначала должен забиндаться в своем исходном состоянии? Все происходит только в слое представления, клики мыши, работа с нодами, обновления контролов. Бизнес-объект трогать нельзя - а вдруг вставка не произойдет? и сколько комбинаций Notifier-ов будет?


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
mihryak
Дата 29.9.2007, 15:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



tol05, повторюсь - за последние года полтора-два я не написал ничего, что было бы видно пользователю напрямую, ну разве что для этого форума что-нибудь простенькое  smile . И я не знаю, как у нас разруливаются возможные проблемы и трудности в слое представления данных. Поэтому не могу сказать, как лучше реализовать описанную ситуацию - просто не сталкивался, а тратить день на поиск оптимального в данном случае решения ради спортивного интереса, признаться, лень smile
И ключевая фраза тут - "данный случай", в столкновении с ним не любая концепция (а мой совет был гораздо более концептуальным, чем практическим) устоит.
А тема очень интересная, надеюсь, что мне ещё посчастливится (безо всякой иронии говорю!) её решать.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0712 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.