7

的背景

在 .NET Windows Forms (2.0) 中,单选按钮自动按其容器控件分组,无论是 Form、Panel 还是 GroupBox。

这意味着当您选择一个单选按钮时,同一容器中的每个其他单选按钮都会自动更改为未选中状态。

现在,考虑以下表单布局:

MUST HAVE  NICE TO HAVE  DESCRIPTION
---------  ------------  -----------------------------------------------
   [ ]          [ ]      The gizmo works
   [ ]          [ ]      The gizmo works beautifully
   [ ]          [ ]      The gizmo works amazingly and makes you breakfast
   [ ]          [ ]      The gizmo comes with a pony
  • 每个'[ ]'都是一个单选按钮。
  • 要求用户在第一列中选​​择所需的答案,在第二列中选择可选的(所需的最佳情况答案)。

如您所见,单选按钮应按列分组:选择其中一个单选按钮应清除该列的其余部分,但对另一列没有影响。

问题

基本上问题在于这是一个动态生成的表单。

  • 布局中的行数是动态的,它是从可配置的表单定义中加载的。
  • 描述文本直到运行时才知道,并且长度变化很大(有些可能只有几个单词,有些可能只有十几行)。
  • 无法重新设计布局。这来自于(非技术)用户对这种已使用多年的纸质版本的熟悉程度。此表单也会打印,即使我更改了表单上的输入系统,这也意味着使用“旧”布局编写另一个版本以进行打印。

我尝试过但没有用的

我首先尝试使用三个面板将其实现为动态生成的布局,每列一个,因此自动单选按钮分组可以正常工作。它确实做到了。

但是与单选按钮及其文本之间的水平对齐相关的布局问题简直让我很生气。直到运行时才知道文本的大小,并且文本行可能会换行(有时每个项目会换行几次)。有时它正确对齐,有时它没有。我即将开始调试它,但我在想改变这个三面板实现是否是一个更好的选择。

我正在尝试做的事情

我想通过使用TableLayoutPanel三列来重新设计布局,以简化与对齐相关的问题,但这意味着我不能使用自动单选按钮按容器分组“功能”。

编辑:

正如 Gerrie 建议的那样,其他布局选项是将每一行实现为用户控件并使用流布局面板。

这再次意味着,我可能希望将控件用于布局,但不用于单选按钮分组。

尽管使用水平用户控件,我仍需要获取垂直单选按钮组

/编辑

我想问什么

我需要有关如何手动控制单选按钮分组的指针和建议。RadioButton如果需要,我真的不介意将类子类化。

具体来说,是否有任何“规范”或已知的子类化“RadioButton”或一直到 Win32 API,以便每次检查控件时(通过使用鼠标、键盘 Enter、空格键和任何其他方式我无法意识到选择它们)我可以捕获事件并手动更新表单上所有其他控件的状态,并且以众所周知的自动分组功能被“停用”的方式更新?我担心实现也是与容器相关的,我可能也被迫继承 Panel?。

Windows 窗体中的分组“魔术”如何工作?

我发现的每个实现自定义单选按钮组或“单选按钮列表”的谷歌搜索解决方案都以某种方式基于使用该组的容器。可以避免使用容器吗?如果是这样,如何?

4

2 回答 2

6

我发现的一个临时解决方案(阅读:messy hack)是我将每个单选按钮放在自己的小面板中。因此,它们之间根本不会发生分组。我正在监听每个按钮checked事件并相应地更新相应的事件。

我仍然认为拥有这么多面板有点过头了,如果有人有更清洁的解决方案,我很想听听。

(好吧,很抱歉回答我自己的问题。你知道,当你花时间解释一些事情时,你会开始以不同的眼光看待问题。)

于 2009-02-23T09:14:55.470 回答
1

我会选择一个简单直接的解决方案。例如,一个表示一行的自定义控件(即两个单选按钮和一个标签)。

编辑:好的,我想我现在明白你的要求了。难道你不能只有两个单选按钮集合:A 列中的单选按钮和 B 列中的单选按钮?

绘制表单时,将它们添加到两个 List<RadioButton> 或其他任何内容,并将它们绑定到两个单独的事件:columnARBChecked、columnBRBChecked。当其中一个事件触发时,您可以调用一些逻辑来检查/取消选中其余的单选按钮。

于 2009-02-23T08:41:37.220 回答