Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > [VC#] TreeView - Explorer - Файловый проводник


Автор: MuForum 31.3.2009, 17:21
Доброе время суток!
Работаю на "Microsoft Visual Studio 2008". Язык программирования C#.

# Задача: Реализовать файловый проводник при помощи компонента TreeView с отображением иконок объектов.

1. Реализацию чтение и построение папок системы я сделал, но меня она не устраивает.
-- Реализовал следующим образом, сканирую логические диски и записываю их первыми нодами.
-- Затем при раскрытии какого-то нода я сканирую входящие папки до 2 уровня. (Максимально облегчить загрузку)
-- Чтобы не проделывать это бесконечно кол-во раз, при создание нода в поле Tag присваиваю string.Empty, после раскрытия/свёртывания присваиваю "+/-".
-- Оптимизировал как мог, но всё равно это не системное дерево/лист файлов.
-- Посему, меня интересует вопрос: Как привязаться к системному дереву/листу файлов, чтобы не заниматься выше изложенными идиотизмом.


# Добавлено: Нашел упоминания о функции http://msdn.microsoft.com/en-us/library/bb762179(VS.85).aspx.


# Добавлено: На сколько я понял, так для отслеживания изменений файлов можно приспособить класс http://progs.biz/csharp/csharp/lessons/062.aspx, заметки http://www.gotdotnet.ru/Forums/Common/522889.aspx.


P.S. -> Если есть какие-то ссылки, или названия книг, структур и т.д., которые к этому относятся, буду рад увидеть.

Автор: Partizan 31.3.2009, 17:42
MuForum, 

Цитата

-- Затем при раскрытии какого-то нода я сканирую входящие папки до 2 уровня. (Максимально облегчить загрузку)


так она наоборот утяжеляется smile

Автор: MuForum 31.3.2009, 17:57
Цитата(Partizan @ 31.3.2009,  17:42)
MuForum, 

Цитата

-- Затем при раскрытии какого-то нода я сканирую входящие папки до 2 уровня. (Максимально облегчить загрузку)


так она наоборот утяжеляется smile

Ниже написал, что я использую поле .Tag для определения, были ли уже загружены тужа ноды или нет.
- Если да, То просто раскрываю, если нет, то загружаю.

Код

        private void NodeExpand(TreeNode tn)
        {
            if (tn == null) return;
            // ----
            // Если есть подузлы.
            if (tn.Nodes.Count != 0)
            {
                // Если раскрываем в первый раз.
                if (tn.Tag == null || ((string)tn.Tag) == "")
                {
                    // Удаляем фиктивный узел.
                    tn.Nodes.RemoveAt(0);
                    // Добавляем подузлы.
                    AddTreeNodes(tn);
                    // Устнавливаем признак того, что
                    // узел уже раскрывали и добавили в него все подузлы.
                    tn.Tag = "+";
                }
            }
            else
            {
                AddTreeNodes(tn);
                // Устнавливаем признак того, что
                // узел уже раскрывали и добавили в него все подузлы.
                tn.Tag = "+";
            }
            // ----
            WDir(tn.FullPath);
            // ----
            ListView_ShowFiles(tn.FullPath);
        }

Автор: Partizan 31.3.2009, 20:07
MuForum, да 2 уровня-то зачем? smile

Автор: MuForum 31.3.2009, 20:47
Цитата(Partizan @ 31.3.2009,  20:07)
MuForum, да 2 уровня-то зачем? smile

Суть не в этом =)
- Для того, чтобы разобраться с фиктивным нодам, нужно его добавлять или нет. (Есть ли файлы во второстепенных папках или нет)
- Ладно, вопрос то звучал по другому =)
- Чего можешь подсказать касательно главного вопроса ;) ?

Автор: Partizan 31.3.2009, 21:02
Цитата

Посему, меня интересует вопрос: Как привязаться к системному дереву/листу файлов, чтобы не заниматься выше изложенными идиотизмом.


По этому вопросу? 

Да никак smile Нет системного дерева smile
Всё ручками делать...либо взять чужую реализацию...на CodeProject куча статей на эту тему наверняка

Автор: XoLa 8.6.2009, 19:42
MuForum, выложи плз алгоритм всей проги ну или хотя бы функций
ListView_ShowFiles
WDir
AddTreeNodes
Заранее благодарю!

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