CheckGroupBox 和 RadioGroupBox
CheckGroupBox、RadioGroupBox 和 RadioButtonPanel 控件简介

引言
在最近的一个项目中,我需要一个 GroupBox
控件,它可以启用/禁用其中所有的控件。这种类型的控件并没有内置于 .NET Framework 中(这有点令人惊讶),当我试图在 CodeProject 上查找一个实现时,我找到一个用 MFC 编写的,但没有用 .NET(C# 或 VB.NET)编写的,所以我决定自己编写一套控件并在此发布到 CodeProject。
实现
控件本身非常直接。CheckGroupBox
是一个从 System.Windows.Forms.GroupBox
派生的控件,它将一个 CheckBox
添加到 GroupBox
的子控件集合(Controls
属性)中。同样,RadioGroupBox
也是一个从 System.Windows.Forms.GroupBox
派生的控件,它包含一个 RadioButton
。已添加事件处理程序,以便 GroupBox
内的子控件能反映 CheckBox
或 RadioButton
的选中状态,并且 GroupBox
控件的父控件可以在选中状态发生变化时收到通知。
入门
打开你的 WinForm 项目后,选择“添加引用...”并添加 UIToolbox.CheckGroupBox.dll 和 UIToolbox.RadioGroupBox.dll。打开工具箱窗口并导航到“容器”组。现在你应该会看到 CheckGroupBox
和 RadioGroupBox
列出:

像使用其他控件一样,只需将这些控件拖放到你的 WinForm 上即可……

……并且像使用标准 GroupBox
一样向其中添加控件。

就是这样。你现在可以构建并运行你的项目了。
DisableChildrenIfUnchecked
子控件的默认启用/禁用行为在 CheckGroupBox
和 RadioGroupBox
之间有所不同。从一开始,我就知道我希望 CheckGroupBox
的子控件随着 CheckBox
的选中/取消选中而启用/禁用,但是当 RadioGroupBox
的 RadioButton
被选中(勾选)时,我不希望子控件的启用状态发生变化。
既然是在 CodeProject 上,我知道有些开发者可能不想要这种 UI 行为,所以我给两个控件都添加了 DisableChildrenIfUnchecked
属性。DisableChildrenIfUnchecked
在 CheckGroupBox
中默认为 true
,在 RadioGroupBox
中默认为 false
,并且可以在设计时在设计器中设置。
RadioGroupBox 警告 #1:将 RadioButton 控件与 RadioGroupBox 控件混合使用
如果你的 WinForm 包含 RadioGroupBox
控件但没有 RadioButton
控件,你可以直接在 WinForm 中使用 RadioGroupBox
控件,就像使用 CheckGroupBox
一样。然而,如果你的 WinForm 在同一级别上混合了 RadioButton
控件和 RadioGroupBox
控件,你将会遇到广播问题。当一个 RadioButton
从未选中变为选中时,同一级别的 CheckGroupBox
控件将不会收到选中状态变化的通知,反之亦然。
为了克服这个问题,我创建了一个从 System.Windows.Forms.Panel
派生的控件,名为 RadioButtonPanel
。要正确地使用 RadioGroupBox
控件和 RadioButton
控件,请在添加任何 RadioButton
控件或 RadioGroupBox
控件之前,将一个 RadioButtonPanel
控件添加到你的 WinForm。然后,当你添加 RadioButton
控件或 RadioGroupBox
控件时,将它们添加到 RadioButtonPanel
中,而不是根 WinForm 本身。
要查看此示例,请打开 RadioGroupBox
的 ExampleApplication
项目中的 Form2.cs。

RadioGroupBox 警告 #2:向 RadioGroupBox 添加 RadioButton 控件
在 RadioGroupBox
控件中看到的 RadioButton
是 RadioGroupBox
的 GroupBox
的一个子控件。如果你创建了一个 RadioGroupBox
控件的实例并查看该实例的 Controls
属性(一个控件集合),你会发现该集合包含 RadioButton
。
如果在将 RadioGroupBox
添加到 WinForm 后,你又添加了一些 RadioButton
控件,这些控件也会被添加到 GroupBox
的控件集合中。这样做的问题是,由于它们都在同一个集合中,选中 GroupBox
中的一个 RadioButton
会取消选中作为 GroupBox
的标题 RadioButton
。
为了克服这个问题,在向 RadioGroupBox
添加 RadioButton
控件之前,先向 RadioGroupBox
添加一个 Panel
控件,然后将 RadioButton
控件添加到 Panel
中。通过这种技术,RadioButton
控件由 Panel
而不是 RadioGroupBox
所有,因此选中它们中的一个不会影响 RadioGroupBox
的标题 RadioButton
。
摘要
就是这样。控件非常直接且易于使用。希望其他人也能从中受益。如果你遇到任何 bug,请给我发电子邮件,我会更新代码。
许可证
本文及附带文件可自由使用,前提是满足以下条件:
- 不删除或修改文件中的版权声明。
- 代码不得以未编译的形式出售(作为应用程序一部分的已编译二进制文件是可以的)。
- 不得“重新品牌化”设计、代码或已编译的二进制文件。
可选
- 在发布的产品中,我在“关于”框中获得署名(类似“CheckGroupBox 和 RadioGroupBox 版权所有 (c) 2009 Jeff Beeghly”)。
- 我将获得该产品的完整许可副本(无论产品是免费的、零售的还是商业的)。这是可选的,但如果你发布使用了我贡献代码的产品,我将不胜感激收到一份完整许可副本。
此外,你不得
- 未经我本人明确书面授权,公开发布修改后的代码或公开发布衍生自该代码的作品。
常见问题解答
问:是否存在 VB.NET 版本?
答:否,但本文 zip 文件中的源代码包含已编译的 DLL(UIToolbox.CheckGroupBox.dll 和 UIToolbox.RadioGroupBox.dll),可以作为引用添加到 VB.NET 项目中。
问:如果我创建一个 VB.NET 版本,我能发布它吗?
答:不行,这将违反许可协议。
问:我发现了文章代码中的一个 bug。我该怎么办?
答:要么在下面的消息板中发布解决方案,要么将更改通过电子邮件发送给我。我将整合这些更改并发布一个新版本。
问:我有一个建议/增强/功能请求。我该怎么办?
答:要么在下面的消息板中发布解决方案,要么将更改通过电子邮件发送给我。如果我决定采纳该建议/增强/功能请求,我将整合更改并发布一个新版本。
问:是否存在 Visual Studio .NET 2008 版本?
答:是的,存在 2005 和 2008 版本项目,尽管控件是用 Visual Studio .NET 2005 和 C# 2.0 编写的,并且 Visual Studio .NET 2008 或 C# 3.5 中没有任何新功能是控件所利用的。
历史
- 2009年1月22日,1.0
- 首次发布
- 2009年1月23日,1.1
- 修复了文本处理方式,使其在 Vista 下能正确显示。
请忽略以下许可部分。CodeProject 会自动添加它,并且无法将其关闭或将许可设置为“其他”。请参考上面的“许可”部分。