代码之家  ›  专栏  ›  技术社区  ›  Sergio Acosta

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

  •  7
  • Sergio Acosta  · 技术社区  · 16 年前

    背景

    在.NET中 Windows Forms (2.0)单选按钮根据其容器控件自动分组,无论是窗体、面板还是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
    
    • '[ ]' 这是一个单选按钮。
    • 要求用户选择 必修的 在第一栏中回答,然后 (期望的最佳案例答案)在第2列。

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

    问题

    • 布局中的行数是动态的,它是从可配置的表单定义加载的。
    • 直到运行时,描述文本才为人所知,其长度变化很大(有些可能只有几个单词,有些可能有十几行)。
    • 无法重新设计布局。这是因为(非技术性)用户对该表单的纸质版已经使用多年了。此表单也将被打印,即使我更改了表单上的输入系统,也意味着要用“旧”布局编码另一个版本以进行打印。

    我试过但没用的东西

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

    我想做什么

    TableLayoutPanel 为了简化与对齐相关的问题,我使用了三列,但这意味着我不能使用按容器“feature”自动分组的单选按钮。

    编辑:

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

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

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

    /编辑

    我想问的是什么

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

    具体地说,是否有任何“规范”或已知的方法对“RadioButton”进行子类化,或一直到Win32 API,以便每次检查控件时(通过使用鼠标、键盘输入、空格键和我不知道的任何其他方式选择它们)我可以捕获事件并手动更新窗体上每个其他控件的状态,并且自动分组功能众所周知是“取消激活”的?我担心该实现也与容器相关,我可能还被迫将Panel?子类化?。

    分组“魔力”在Windows窗体中是如何工作的?

    2 回复  |  直到 12 年前
        1
  •  6
  •   Peter Mortensen icecrime    12 年前

    A. 解决方案(改为: 乱七八糟的黑客 )我发现是我把 每个单选按钮都有自己的小面板。所以它们之间根本没有分组。我在听每个按钮 checked

    我仍然认为有这么多的面板太过分了,如果有人有更干净的解决方案,我很乐意听到。

    (好的,很抱歉回答我自己的问题。你知道,当你花时间解释某件事时,你开始从不同的角度看待问题。)

        2
  •  1
  •   Peter Mortensen icecrime    12 年前

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

    编辑:好的,我想我现在明白你的要求了。你就不能有两组单选按钮:A列和B列中的单选按钮吗?

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