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

BrowseField 和 BrowseList - 文件和文件夹浏览器/列表器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (21投票s)

2004年10月14日

5分钟阅读

viewsIcon

144322

downloadIcon

2558

文件和文件夹浏览器/列表器控件

引言

面向对象编程 (OOP) 和 .NET 的绝妙之处在于,您永远不必一次又一次地编写相同的代码。重用性是游戏的关键。所以,当我最近发现自己陷入一遍又一遍地重写同一个界面组件的恶性循环时,我想肯定有更好的方法。

背景

我经常需要创建小型“向导”和其他处理文件和文件夹的应用程序。“行业标准”定位这些资源的方法是在页面上放置一个 TextBox,旁边放一个文件夹图标,然后使用该文件夹图标启动浏览对话框,并将结果存储在 TextBox 中。当然,您已经见过一千次了,如果您正在构建一个 Web 应用程序,已经有了一个对象可以做到这一点。但在 Windows Forms 中,情况并非如此。

每次我需要使用此功能时,我都必须

  • 将一些 Panel 放置在页面上以托管 TextBoxPictureBox(这使得它们可以正确停靠)。
  • 添加 TextBoxLabelPictureBox 控件。
  • 正确对齐 PictureBox(默认情况下,它从未与 TextBox 正确对齐),如果 Label 放置在左侧,也需要对其进行对齐。
  • 找到文件夹图像。
  • 添加 FileDialogFolderDialog 对象。
  • 根据需要将 FileDialogFolderDialogTextBoxPictureBox 连接起来。
  • 为每个 TextBox 重新编写拖放功能。
  • 如果需要,重新编写从路径中剥离文件名的函数。

好吧,这是很多需要一遍又一遍地编写的代码。我对此感到厌倦。所以我创建了 BrowseField

BrowseField 的特性

  • 允许您将单个控件拖放到页面上,从而消除了上述所有步骤。
  • 有一个名为 BrowseType 的属性,允许您指定它应该弹出文件对话框还是文件夹对话框。
  • CaptionStyle 属性决定 Label 应该出现在 TextBox 的上方、左侧还是外缩进(Wizard 97 样式)。
  • 已设置好接受来自 Windows Explorer 的拖放。
  • 可以直接手动输入路径。
  • 无需任何额外工作即可正确停靠和调整大小。
  • 如果输入文件,您可以指定 FilenameOnly() 选项,该选项会将文件路径截断为仅文件名。
  • 您可以查询 FileName() 属性,该属性也能在保留完整路径的同时提供文件名。
  • 您可以完全控制外观 - 根据需要设置文本和/或 Label 字体,或更改 TextBox 的边框样式等。
  • 公开 TextChanged() 事件。

使用 BrowseField 控件就像将其拖放到页面上,在 IDE 中按您喜欢的方式设置属性,然后查询 Text 值获取结果一样简单。或者,您可以像这样以编程方式设置属性:

BrowseField1.Caption = "This is my label text"
BrowseField1.CaptionStyle = BrowseField.CaptionStyles.Top
BrowseField1.FileDialogFilter = "All Files (*.*)|*.*"
BrowseField1.FileDialogFilterIndex = 1
BrowseField1.BrowseType = BrowseField.BrowseTypes.File
BrowseField1.BorderStyle = BorderStyle.FixedSingle

请注意,您无需设置任何代码即可显示对话框、处理拖放操作或处理大小调整操作。在大多数情况下,您所做的任何更改纯粹是装饰性的。它就是能用。

BrowseList

发布 BrowseField 控件后不久,我意识到我经常以类似的方式使用 ListBox 控件——用于收集多个文件夹和文件名。这比使用 TextBox 更麻烦,因为我通常会添加几个 PictureBox 控件来添加、删除和编辑输入的路径。还需要检查重复的路径。在我看来,ListBox 控件缺少了一些关键事件——ItemAdded()ItemRemoved()ItemChanged()。这些也需要实现。

BrowseList 的特性

  • 拥有 BrowseField 的所有特性(除了 FileName 属性)。
  • 添加了 ItemAdded()ItemRemoved()ItemChanged() 事件。
  • 默认情况下,允许添加多个项目(通过对话框或拖放)。
  • 允许手动编辑列表项的选项(默认启用)。

我想我还应该提到,这两个控件都是用 VB.NET 编写的。但是,您已经知道了,这并不会阻止它与 C# 或任何其他 .NET 兼容语言一起工作。代码中的注释不多——因为这确实是一个工具而不是教程,所以我没有看到注释的必要。另外,由于它们是复合控件,所以它们的性质非常简单。

许可

我总是喜欢将我的项目列为“感谢软件”(ThankYouWare)。也就是说,如果您使用它们,请给我发一封“感谢”电子邮件,让我知道您是否喜欢它们,以及您希望看到哪些功能或改进。这些控件是开源的,您可以随意修改它们(但不要让我修复您修改过的代码)。如果您重新分发原始代码或修改后的代码,请在某个地方注明我,即使只是在代码注释中。

重大更改

虽然我讨厌在控件中进行“重大更改”,但我认为在此控件上是必要的。这些控件的原始版本有一个最小的接口,而不是通过重写属性提供对子控件的访问,而是直接公开了子控件。这可行,而且肯定向程序员公开了子控件的每个方面,但它允许程序员“破坏”代码的功能,并且不适合 VS.NET IDE。(在 IDE 的属性网格中所做的更改往往会随机消失。)坦率地说,这只是糟糕的编程。

在第 2 版中,所有重要的属性和事件都已直接公开。现在程序员无法“破坏”控件内置的验证和安全性。这也意味着控件能很好地与 IDE 配合使用。此外,CaptionLabel)是全新的。

已知问题

控件的大小调整有时有一个有趣的小“bug”。例如,如果您打开示例项目并将窗体的宽度拖动得非常小,然后重新展开它,浏览控件的右侧会超出窗体的边缘。我不知道为什么会发生这种情况。另外,虽然非常小,但控件有关联的图标,但它们似乎没有显示出来。如果有人知道这些问题的解决方案,我很乐意更新代码并在代码中感谢您。谢谢。

历史

  • 2004 年 10 月 15 日 - 添加了 BrowseList 控件。
  • 2005 年 1 月 25 日 - 两个控件都已重写并作为第 2 版发布。
© . All rights reserved.