что может быть причиной того, что это заполняет это древовидное представление несколько раз? - PullRequest
1 голос
/ 13 декабря 2010

Я нашел этот код онлайн.Это работает, но по какой-то причине загружает каталог файлов дважды.

namespace DockSample.Controls
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Drawing;
    using Microsoft.VisualBasic.FileIO;
    using DockSample;



    //TODO: Add options for filtering by robot
       public class SolutionExplorer : TreeView
        {

            public SolutionExplorer()
            {
                this.BeforeExpand += customBeforeExpand;
                this.Nodes.Clear();
                CreateTree(this);
            }

            private bool CreateTree(TreeView treeView)
            {

                bool returnValue = false;

                try
                {
                    // Create Desktop
                    TreeNode desktop = new TreeNode();
                  //  desktop.Text = "Desktop";
                  //  desktop.Tag = "Desktop";
                  //  desktop.Nodes.Add("");
                  //  treeView.Nodes.Add(desktop);
                    // Get driveInfo
                    foreach (DriveInfo drv in DriveInfo.GetDrives())
                    {

                        TreeNode fChild = new TreeNode();
                        if (drv.DriveType == DriveType.CDRom)
                        {
                            fChild.ImageIndex = 1;
                            fChild.SelectedImageIndex = 1;
                        }
                        else if (drv.DriveType == DriveType.Fixed)
                        {
                            fChild.ImageIndex = 0;
                            fChild.SelectedImageIndex = 0;
                        }
                        fChild.Text = drv.Name;
                        fChild.Nodes.Add("");
                        treeView.Nodes.Add(fChild);
                        returnValue = true;
                    }

                }
                catch 
                {
                    returnValue = false;
                }
                return returnValue;

            }

            /* Method :EnumerateDirectory
            * Author : Chandana Subasinghe
            * Date : 10/03/2006
            * Discription : This is use to Enumerate directories and files
            * 
            */
            public TreeNode EnumerateDirectory(TreeNode parentNode, List<string> thisFilter)
            {

                try
                {
                    DirectoryInfo rootDir;

                    // To fill Desktop
                    Char[] arr = { '\\' };
                    string[] nameList = parentNode.FullPath.Split(arr);
                    string path = "";

                    if (nameList.GetValue(0).ToString() == "Desktop")
                    {
                        path = SpecialDirectories.Desktop + "\\";

                        for (int i = 1; i < nameList.Length; i++)
                        {
                            path = path + nameList[i] + "\\";
                        }

                        rootDir = new DirectoryInfo(path);
                    }
                    // for other Directories
                    else
                    {

                        rootDir = new DirectoryInfo(parentNode.FullPath + "\\");
                    }

                    parentNode.Nodes[0].Remove();
                    foreach (DirectoryInfo dir in rootDir.GetDirectories())
                    {

                        TreeNode node = new TreeNode();
                        node.Text = dir.Name;
                        node.Nodes.Add("");
                        parentNode.Nodes.Add(node);
                    }
                    //Fill files
                    foreach (FileInfo file in rootDir.GetFiles())
                    {
                        if (isValidFilter(getExtention(file.Name)))
                        {
                            TreeNode node = new TreeNode();
                            node.Text = file.Name;
                            node.ImageIndex = 2;
                            node.SelectedImageIndex = 2;
                            parentNode.Nodes.Add(node);
                        }
                    }



                }

                catch 
                {
                }

                return parentNode;
            }
            private bool isValidFilter(string ext)
            {
                bool result = false;
                foreach(string s in filter)
                {
                    if (ext == s)
                        result =  true;

                }

                return result;
            }
            private string getExtention(string filename)
            {
                return filename.Substring(filename.IndexOf("."));
            }
            private void customBeforeExpand(object sender, TreeViewCancelEventArgs e)
            {
                if (e.Node.Nodes[0].Text == "")
                {
                    TreeNode node = this.EnumerateDirectory(e.Node,filter);
                }
            }
            private List<string> filter = new List<string>();
            public List<string> Filter
            {
                get { return filter; }
                set { filter = value; }
            }
            private void InitializeComponent()
            {
                this.SuspendLayout();
                this.ResumeLayout(false);

            }
        }

}

1 Ответ

2 голосов
/ 14 декабря 2010

Конструктор вашего элемента управления работает как во время разработки, так и во время выполнения. Поэтому, как только вы уроните элемент управления в форме, он заполнит дерево. Проблема в том, что узлы будут сериализованы в InitializeComponent (). Взгляните на файл Designer.cs для вашей формы, вы найдете их там. Когда вы запускаете форму, конструктор запускается снова, удваивая список.

Необходимо запретить конструктору добавлять узлы во время разработки. Это немного сложно сделать, вы обычно используете свойство DesignMode, но оно еще не установлено в true в конструкторе. Сделайте это следующим образом:

protected override void OnHandleCreated(EventArgs e) {
    base.OnHandleCreated(e);
    if (!DesignMode && treeView.Nodes.Count == 0) {
        CreateTree(this);
    }
}

Или сделайте это явно, добавив открытый метод, который вы вызываете в конструкторе формы или методе OnLoad. Что довольно мудро, вы можете захотеть ловить исключения. Всегда вероятно, когда вы возитесь с файловой системой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...