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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeVeiw и все диски и каталоги, загрузка постепенно  
:(
    Опции темы
nmc
Дата 12.11.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток!

В TreeVeiw загружаем список всех имеющихся дисков и папок.
Как сделать так, что бы загрузка вложенных элементов происходила 
после раскрытия соответствующего узла.
Так как при первой загрузке, проект загружается очень долго,рекурсивно проходит
по всем каталогам и подкаталогам.
PM   Вверх
Экскалупатор
Дата 12.11.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



обрабатываешь событие TreeView.BeforeExpand которое происходит до развертывания узла дерева. и в нем читаешь подкаталоги узла.
PM MAIL ICQ   Вверх
nmc
Дата 13.11.2009, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вылетает ошибка, "неправильный путь" при разворачивании узла
Код

public Form1()
        {
            InitializeComponent();
            PopulateTreeView();
        }

Функуция PopulateTreeView() и остальной код
Код

private void PopulateTreeView()
       {
           rootNode = new TreeNode("Comp");
           rootNode.Tag = "Comp";
           treeView1.Nodes.Add(rootNode);
           string [] logikalDick = Environment.GetLogicalDrives();
           TreeNode disk;
           DirectoryInfo info;    
           foreach (string s in logikalDick)
           {
               disk = new TreeNode(s);
               info = new DirectoryInfo(s);
               rootNode.Tag = s;  
                   try
                   {
                       GetDirectoriesStart(info.GetDirectories(), disk);
                   }
                   catch (Exception)
                   {
                       rootNode.Nodes.Add(disk);
                       continue;
                   }
               rootNode.Nodes.Add(disk);              
           }
////////////////
 private void GetDirectoriesStart(DirectoryInfo[] subDirs,TreeNode nodeToAddTo)
       {
           TreeNode aNode;
           DirectoryInfo[] subSubDirs;
           foreach (DirectoryInfo subDir in subDirs)
           {
               aNode = new TreeNode(subDir.Name,0,0);
               aNode.Tag = subDir;
               aNode.ImageKey = "folder";
               try
               {
                   subSubDirs = subDir.GetDirectories();
               }
               catch (Exception)
               {
                   continue;
               }             
               nodeToAddTo.Nodes.Add(aNode);
           }
       }
       private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
       {
           TreeNode aNode;
           DirectoryInfo[] subSubDirs;
           foreach (DirectoryInfo subDir in subDirs)
           {
               aNode = new TreeNode(subDir.Name, 0, 0);
               aNode.Tag = subDir;
               aNode.ImageKey = "folder";
               try
               {
                   subSubDirs = subDir.GetDirectories();
               }
               catch (Exception)
               {
                   continue;
               }
               if (subSubDirs.Length != 0)
               {
                       GetDirectories(subSubDirs, aNode);
                       BeforeExpand = true;       
               }
               nodeToAddTo.Nodes.Add(aNode);
           }
       }
//здесь по нажатию разворачиваем узлы,отображаться неправильно 
       private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
       {         
          string str = "Comp"
           if (str.Exsits(treeView1.SelectedNode.Text))//если не корневой узел
           {
               DirectoryInfo dirTree = new DirectoryInfo(treeView1.SelectedNode.Text);   
               GetDirectories(dirTree.GetDirectories(), treeView1.SelectedNode);//сдесь вылетает неправильный путь
           }

       }

PM   Вверх
Экскалупатор
Дата 13.11.2009, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



у меня получился такой вариант, правда на событие TreeView.BeforeExpand как мне показалось не очень удобно, но попрактикуйся на каких нить других.
я завязывал на
Код

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            PopulateFolder(e.Node);
        }



Код

private void PopulateTreeView()
        {
            string [] drives = Environment.GetLogicalDrives();
            foreach (string str in drives)
            {
                this.treeView1.Nodes.Add(str);
                this.treeView1.Nodes[treeView1.Nodes.Count - 1].Tag = str;
                PopulateFolder(this.treeView1.Nodes[treeView1.Nodes.Count - 1]);
            }
        }
        private void PopulateFolder(TreeNode node)
        {
            node.Nodes.Clear();
            DirectoryInfo directory = new DirectoryInfo(node.Tag.ToString());
            try
            {
                foreach (DirectoryInfo dir in directory.GetDirectories())
                {
                    node.Nodes.Add(dir.Name);
                    node.Nodes[node.Nodes.Count - 1].Tag = dir.FullName;
                }
            }
            catch
            {
            }
        }


нормально все работало...
PM MAIL ICQ   Вверх
Partizan
Дата 13.11.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



nmc, можно и асинхронную загрузку организовать


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
nmc
Дата 13.11.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
 Partizan
nmc, можно и асинхронную загрузку организовать

Partizan честного говоря не понял

Реализовал пока так 
Код


public Form1()
        {
            InitializeComponent();
            PopulateTreeView();
        }

private void PopulateTreeView()
       {
           string [] logikalDick = Environment.GetLogicalDrives();
           TreeNode disk;
           DirectoryInfo info;        
           foreach (string s in logikalDick)
           {     
                   disk = new TreeNode(s);
                   info = new DirectoryInfo(s);
                   disk.Tag = info;
                   treeView1.Nodes.Add(disk);
                   treeView1.SelectedImageIndex = i;
                   disk.Nodes.Add("");  //без этого не получаться "крестики" до клика по ветки дерева
                                                //хотя наверно это неправильно по сути 
           }
      }

 private void PopulateFolder(TreeNode node)
       {
           //node.Nodes.RemoveAt(0);
           node.Nodes.Clear();
           TreeNode tnFolder;
           DirectoryInfo directory = new DirectoryInfo(node.Tag.ToString());        
               foreach (DirectoryInfo dir in directory.GetDirectories())
               {
                   tnFolder = new TreeNode(dir.Name);
                   tnFolder.Tag = dir.FullName;
                   node.Nodes.Add(tnFolder);
                   //
                   tnFolder.Nodes.Add("");  //без этого не получаться "крестики" до клика по ветки дерева
                                                     //хотя наверно это неправильно по сути 
      }
      }
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
       {
     
               PopulateFolder(e.Node);
       }



Это сообщение отредактировал(а) nmc - 13.11.2009, 23:42
PM   Вверх
Экскалупатор
Дата 14.11.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



Цитата

честного говоря не понял


сделать загрузку папок в дерево в отдельном потоке...
nmc, а чем тебя мой вариант не устроил? реально меньше писанины, и как то все понятнее, ну можно было только добавить крестики что бы отображались...

Добавлено через 2 минуты и 28 секунд
кстати, а у тебя не вылетает ошибка, когда пытается получить папки из диска сидирома, если там нет диска?
PM MAIL ICQ   Вверх
nmc
Дата 16.11.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Экскалупатор
nmc, а чем тебя мой вариант не устроил? реально меньше писанины, и как то все понятнее, ну можно было только добавить крестики что бы отображались...

С чего ты взял, что не устроил?Просто, раскрытые в последнем варианте узла, происходит в  BeforeExpand
Код
 
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
       {                 
       }



По хорошему,наверно, стоит сделать без очищения дерева, каждый раз, (node.Nodes.Clear();) и без создания пустого( disk.Nodes.Add("");) узла?!. 
Экскалупатор, а что ты думаеш на счет, загрузок соотвествующих, картинок в дерево
http://forum.vingrad.ru/forum/topic-280060.html

Это сообщение отредактировал(а) nmc - 16.11.2009, 16:59
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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