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

CheckGroupBox 和 RadioGroupBox

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (26投票s)

2009年1月22日

CPOL

6分钟阅读

viewsIcon

90742

downloadIcon

3617

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 内的子控件能反映 CheckBoxRadioButton 的选中状态,并且 GroupBox 控件的父控件可以在选中状态发生变化时收到通知。

入门

打开你的 WinForm 项目后,选择“添加引用...”并添加 UIToolbox.CheckGroupBox.dllUIToolbox.RadioGroupBox.dll。打开工具箱窗口并导航到“容器”组。现在你应该会看到 CheckGroupBoxRadioGroupBox 列出:

Toolbox.gif

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

NewCheckGroupBox.gif

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

NewCheckGroupBoxWithControls.gif

就是这样。你现在可以构建并运行你的项目了。

DisableChildrenIfUnchecked  

子控件的默认启用/禁用行为在 CheckGroupBoxRadioGroupBox 之间有所不同。从一开始,我就知道我希望 CheckGroupBox 的子控件随着 CheckBox 的选中/取消选中而启用/禁用,但是当 RadioGroupBoxRadioButton 被选中(勾选)时,我不希望子控件的启用状态发生变化。

既然是在 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 本身。

要查看此示例,请打开 RadioGroupBoxExampleApplication 项目中的 Form2.cs

RadioButtonPanelExample.gif

RadioGroupBox 警告 #2:向 RadioGroupBox 添加 RadioButton 控件

RadioGroupBox 控件中看到的 RadioButtonRadioGroupBoxGroupBox 的一个子控件。如果你创建了一个 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.dllUIToolbox.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 会自动添加它,并且无法将其关闭或将许可设置为“其他”。请参考上面的“许可”部分。

© . All rights reserved.