65.9K
CodeProject 正在变化。 阅读更多。
Home

增强的 BrowseForFolder 风格 TreeView

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (79投票s)

2003年7月2日

Apache

5分钟阅读

viewsIcon

620821

downloadIcon

16942

支持 Explorer、SingleChecked 和 RecursiveChecked 模式(复选框)。允许您指定显示的驱动器类型等...

引言

这个树形视图控件让您能够控制显示哪些驱动器类型,以便用户选择目录。一个可能的场景是只显示本地驱动器,因为您的应用程序会扫描选定的目录并用生成的元数据填充数据库,而不允许来自可移动驱动器的目录是没有意义的。

设计

引言

此版本有一个新的设计,它基于一个聚合树形视图数据提供者接口(策略模式)的树形视图。新设计的目标是提供一种简单的方式来扩展或添加数据提供者,而无需更改树形视图代码的任何一行。基本上,树形视图接口目前不会改变,但数据提供者将改变其行为和功能。

TreeViewFolderBrowser 类定义了以下核心要求

  • 驱动器类型
  • 根目录
  • 复选框行为模式

并负责管理复选框和内部选定目录列表。

ITreeViewFolderBrowserDataProviderTreeViewFolderBrowser 实例使用,并负责

  • 检索计算机驱动器和目录
  • ImageList 用于将图像分配给此实例创建的节点
  • ContextMenu

并可以提供自定义功能和行为以扩展 TreeViewFolderBrowser 类。

TreeViewFolderBrowser

您可以通过控件上的一个 public 实例属性指定驱动器类型。该枚举可以被视为一个位字段,即一组标志。

成员名称 描述
无根目录 无根目录
可移动磁盘 驱动器具有可移动介质。这包括所有软盘驱动器和许多其他类型的存储设备。
本地磁盘 驱动器具有固定(不可移动)介质。这包括所有硬盘,包括可移动的硬盘。
网络驱动器 网络驱动器。这包括网络上任何地方共享的驱动器。
光盘 驱动器是 CD-ROM。不对只读和读/写 CD-ROM 驱动器进行区分。
RAM 磁盘 驱动器是本地计算机上像磁盘驱动器一样运行的随机存取存储器 (RAM) 块。

不同的 CheckboxBehaviorMode 指示是否在树形视图控件的树节点旁边显示复选框以及树形视图如何处理相关事件。SingleCheckedRecursiveChecked 行为之间的主要区别在于,在 RecursiveChecked 模式下,用户不能取消选择已选中文件夹的子文件夹。

成员名称 描述
树形视图控件的树节点旁边不显示复选框
SingleChecked 树形视图控件的树节点旁边显示复选框。用户可以选中目录。
RecursiveChecked 树形视图控件的树节点旁边显示复选框。用户可以选中目录,子目录递归选中

根文件夹属性允许您指定浏览的起始位置。根文件夹值由 System.Environment.SpecialFolder 定义。

成员名称 描述
桌面 树形视图控件显示一个虚拟桌面根节点。个人节点指向用户“我的文件”文件夹。MyComputer 节点显示指定的驱动器类型
我的电脑 树形视图控件在根部显示指定的驱动器类型
System.Environment.SpecialFolder 的所有其他值 树形视图控件显示指定的根文件夹,驱动器类型被忽略

DriveTypeCheckboxBehaviorModesSpecialFolder 枚举值的组合使您能够控制树形视图如何显示其内容以及在选择目录时的行为。

DataProvider

数据提供者是 TreeViewFolderBrowser 背后的工作人员,由它控制。通过实现 ITreeViewFolderBrowserDataProvider 接口,您将完全控制核心过程,例如检索数据、为节点分配图像以及为每个节点提供自定义 ContextMenu 项。但您不必关心复选框、按需加载、如果用户请求 ContextMenu 则查找位置处的节点,您会在需要对其采取一些操作时被挂钩。您唯一必须遵守的是 TreeViewFolderBrowser 实现的核心功能(DriveTypesRootFolder)。

为了提供对所处理的 TreeViewFolderBrowser 类实例的清晰访问,数据提供者接口上的每个方法都提供一个 TreeViewFolderBrowserHelper 类实例,该实例允许您创建节点并让您访问 TreeViewFolderBrowser 实例。

请查看 Raccoom.TreeViewFolderBrowser.DataProviders 项目中提供的两个标准实现。

主要特点

TreeViewFolderBrowser

  • 内置的各种 CheckboxBehaviorModes
  • 子目录的逐步填充。
  • 如果存在选定的子文件夹,则父节点加粗,这有助于在大型结构中查找选定的目录。

TreeViewFolderBrowserDataProvider

  • 通过强类型 Win32_Logicaldisk WMI 类进行驱动器枚举。
  • 用于检索图标的 Shell32 ImageList
  • System.IO 命名空间用于检索目录
  • 遵守 .NET 的代码访问安全功能

TreeViewFolderBrowserDataProviderShell32

继承自 TreeViewFolderBrowserDataProvider

  • 通过 Shell32 互操作对强类型 Win32_Logicaldisk WMI 类驱动器类型进行驱动器和目录枚举。(不遵守 .NET 代码访问安全。)
  • 支持 Shell32 虚拟文件夹(非文件系统文件夹)
  • 用于检索图标的 Shell32 ImageList
  • 每个 Shell 对象的上下文菜单项功能。
  • 已在 WinXP 和 Win2000 上测试。

Using the Code

在开始之前,请确保您的项目对 Raccoom.TreeViewFolderBrowser.dll 有效引用。转到“工具箱”窗口,右键单击并从上下文菜单中选择“自定义工具箱”。在“自定义工具箱”对话框中,转到“.NET Framework 组件”选项卡并选择您刚刚编译的 Raccoom.TreeViewFolderBrowser.dll 程序集。现在将 TreeViewFolderBrowser 控件拖放到您的表单上。

本例假设您已在表单上创建了一个 TreeViewFolderBrowser 控件实例。

填充数据

// set standard data provider
this.myTreeView.DataSource = 
 new Raccoom.Windows.Forms.TreeViewFolderBrowserDataProvider();
// set drive types
this.myTreeView.DriveTypes
= DriveTypes.LocalDisk | DriveTypes.NetworkDrive | 
 DriveTypes.RemovableDisk |
 DriveTypes.CompactDisc;
// set checkbox behavior mode
this.myTreeView.CheckboxBehaviorMode= CheckboxBehaviorMode.SingleChecked;
// fill root level
this.myTreeView.Populate();

事件处理

private void treeView_SelectedDirectoriesChanged(
 object sender, Raccoom.Windows.Forms.SelectedDirectoriesChangedEventArgse)
{
// determine the path which is currently added (checked) 
// or removed (unchecked)
this.statusBar1.Text = e.Path + " is now " + e.CheckState.ToString();
// display all selected path's in a listbox
this.listBox1.Items.Clear();
foreach(string s in myTreeView.SelectedDirectories)
{
this.listBox1.Items.Add(s);
} 
}

备注

此控件显示驱动器类型和文件夹,目前为止都很好。可移动磁盘在运行时可以更改其介质,文件夹也可以更改(新建文件夹、删除文件夹),控件不关心这些。

链接

历史

  • 2015年3月30日 增加了 GitHub 源仓库
  • 2004年4月3日 主要设计更改
  • 2004年8月2日 主要更新
  • 2003年2月7日 最终发布

享受吧...

© . All rights reserved.