C#WinForms - 使用系统目录刷新TreeView(TreeViewMS)

时间:2016-04-27 14:19:48

标签: c# winforms treeview refresh nullreferenceexception

我有一个TreeView with Multiple Selection(TreeView MS)组件,显示Form中的所有系统目录;我尝试在Form中开发一个事件,当按下'F5'时,TreeView刷新本身(找到新目录或删除已删除的目录)。

问题在于TreeView不刷新自身,它在Program类的TreeView中显示NullReferenceException,这里是我刷新的方法:

private void frmInit_KeyDown(object sender, KeyEventArgs e){
    if(e.KeyCode == Keys.F5)
        ReloadTreeView();
}

private void ReloadTreeView(){
    if(TreeViewFiles.Nodes != null){
        TreeViewFiles.Nodes.Clear(); //maybe this way isn't the best to do this.
        exArq.CreateDirectoryTree(TreeViewFiles);
    }
}

这是完整的例外:

An unhandled exception of type 'System.NullReferenceException' occurred in TreeView MS.dll Additional information: Object reference not set to an instance of an object.

方法CreateDirectoryTree搜索系统目录并使用它们创建树:

public void CreateDirectoryTree(TreeView treeView) {

    foreach (DriveInfo drv in DriveInfo.GetDrives()) {

        TreeNode rootDirectoryNode = new TreeNode();
        rootDirectoryNode.ImageIndex = ImageIndexs.SystemDiskIcon;
        rootDirectoryNode.SelectedImageIndex = ImageIndexs.SystemDiskIcon;
        rootDirectoryNode.Text = drv.Name;

        switch (drv.DriveType) {

            case DriveType.Network:
                rootDirectoryNode.ImageIndex = ImageIndexs.NetworkDiskIcon;
                rootDirectoryNode.SelectedImageIndex = ImageIndexs.NetworkDiskIcon;
                break;

            case DriveType.CDRom:
                rootDirectoryNode.ImageIndex = ImageIndexs.CDDiskIcon;
                rootDirectoryNode.SelectedImageIndex = ImageIndexs.CDDiskIcon;
                break;

            case DriveType.Fixed:
                rootDirectoryNode.ImageIndex = ImageIndexs.LocalDiskIcon;
                rootDirectoryNode.SelectedImageIndex = ImageIndexs.LocalDiskIcon;
                break;

            case DriveType.Removable:
                rootDirectoryNode.ImageIndex = ImageIndexs.RemovalDiskIcon;
                rootDirectoryNode.SelectedImageIndex = ImageIndexs.RemovalDiskIcon;
                break;

        }

        bool isSystemDirectory = drv.Name.ToString() == Path.GetPathRoot(Environment.SystemDirectory);

        if (isSystemDirectory) {
            rootDirectoryNode.ImageIndex = ImageIndexs.SystemDiskIcon;
            rootDirectoryNode.SelectedImageIndex = ImageIndexs.SystemDiskIcon;
        }

        rootDirectoryNode.Nodes.Add(String.Empty);

        treeView.Nodes.Add(rootDirectoryNode);
    }

}

我还有另一种方法可以在展开节点时找到目录:

public TreeNode GetDirectoriesAndFilesNodes(TreeNode parentNode) {

    string nodePath = parentNode.FullPath + Constants.DIRECTORY_SEPARATOR;

    DirectoryInfo rootDirectory = new DirectoryInfo(nodePath);
    parentNode.Nodes[0].Remove();
    try {

        foreach (DirectoryInfo dir in rootDirectory.GetDirectories()) {

            TreeNode directoryNode = new TreeNode();
            directoryNode.Text = dir.Name;
            directoryNode.Nodes.Add(String.Empty);
            directoryNode.ImageIndex = ImageIndexs.DirectoryIcon;
            directoryNode.SelectedImageIndex = ImageIndexs.DirectoryIcon;
            parentNode.Nodes.Add(directoryNode);

        }

        foreach (FileInfo file in rootDirectory.GetFiles()) {

            bool isExcel = Path.GetExtension(file.Name).ToLower().Equals(Constants.EXTENSION_EXCEL_X) || Path.GetExtension(file.Name).ToLower().Equals(Constants.EXTENSION_EXCEL);

            bool isZipedFile = Path.GetExtension(file.Name).ToLower().Equals(Constants.EXTENSION_RAR) || Path.GetExtension(file.Name).ToLower().Equals(Constants.EXTENSION_ZIP);

            bool isTextFile = Path.GetExtension(file.Name).ToLower().Equals(Constants.EXTENSION_TXT);

            TreeNode fileNode = new TreeNode();
            fileNode.Text = file.Name;

            if (isExcel) {
                fileNode.ImageIndex = ImageIndexs.ExcelFileIcon;
                fileNode.SelectedImageIndex = ImageIndexs.ExcelFileIcon;
            } else if (isZipedFile) {
                fileNode.ImageIndex = ImageIndexs.ZipedFileIcon;
                fileNode.SelectedImageIndex = ImageIndexs.ZipedFileIcon;
            } else if (isTextFile) {
                fileNode.ImageIndex = ImageIndexs.TextFileIcon;
                fileNode.SelectedImageIndex = ImageIndexs.TextFileIcon;
            } else {
                fileNode.ImageIndex = ImageIndexs.GenericFileIcon;
                fileNode.SelectedImageIndex = ImageIndexs.GenericFileIcon;
            }

            parentNode.Nodes.Add(fileNode);
        }

    } catch (UnauthorizedAccessException) {
        TreeNode errorNode = new TreeNode();
        errorNode.Text = "Negate Acess!";
        errorNode.ImageIndex = ImageIndexs.NoPermissionIcon;
        errorNode.SelectedImageIndex = ImageIndexs.NoPermissionIcon;
        parentNode.Nodes.Add(errorNode);
    } catch (IOException) {
        TreeNode errorNode = new TreeNode();
        errorNode.Text = "The Driver isn't readdy!";
        errorNode.ImageIndex = ImageIndexs.DriverNotReady;
        errorNode.SelectedImageIndex = ImageIndexs.DriverNotReady;
        parentNode.Nodes.Add(errorNode);
    }

    return parentNode;
}

我在代码中放置一个断点,以查看异常抛出的位置,并且我发现:在重新加载之后,异常它将在Program类中抛出

static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmInit()); // EXCEPTION !!
    }
}

0 个答案:

没有答案