如何避免Windows窗体单选按钮容器自动分组

时间:2009-02-23 08:26:10

标签: .net winforms layout radio-button

背景

在.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建议的那样,其他布局选项是将每一行实现为用户控件并使用流布局面板。

这又意味着我可能想要使用控件进行布局,但不能使用单选按钮分组。

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

/ EDIT

我想问的是什么

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

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

分组'魔术'如何在Windows窗体中运行?

我发现的每个解决方案都实现了自定义单选按钮组或“单选按钮列表”,这在某种程度上是基于组的容器使用。可以避免容器吗?如果是这样,怎么样?。

2 个答案:

答案 0 :(得分:6)

时间解决方案(阅读:凌乱的黑客)我发现我将每个和每个单选按钮放在自己的小面板。因此,任何一个之间都没有任何分组。我正在听每个按钮checked事件并相应地更新相应的事件。

我仍然认为拥有那么多面板太过分了,如果有人有更清洁的解决方案,我很乐意听到它。

(好的,很抱歉回答我自己的问题。你知道当你花时间解释一些事情时,你会开始看到问题,这是另一回事。)

答案 1 :(得分:1)

我会寻求一个简单而直接的解决方案。例如,一个代表一行的自定义控件(因此有两个单选按钮和一个标签)。

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

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