我有一个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 !!
}
}