【问题标题】:What is the best way to implement a 2D grid of radio buttons?实现 2D 单选按钮网格的最佳方法是什么?
【发布时间】:2010-09-24 05:42:35
【问题描述】:

实现单选按钮的 2D 网格以便每列中只能选择一个选项,每行中只能选择一个选项的最佳方法是什么?

【问题讨论】:

  • 存在一些行为问题(假设行为是相关的): 1.假设选择了(1, 2)中的单选按钮。 2. 另外,(2, 1) 中的单选按钮也被选中。 3. 用户按下 (1, 1)。但是行和列中的两个单选按钮都被选中。它应该忽略输入还是取消选择一个(哪个)?
  • 既然他把它标记为winforms,通常可以认为这是一个.net问题。
  • @friol, @Jeffrey - 正确,.Net,为了便于讨论,我们说 C#。
  • @luiscubal - 按下 (1, 1) 会将第 1 行的选择移动到第 1 列,将第 1 列的选择移动到第 1 行。现在让我们考虑一个 3x3 网格,其中对角线 (1, 1 )、(2, 2) 和 (3, 3) 被选中。现在用户选择按钮 (1, 3) [(r, c)]。然后这会使第 1 列和第 3 行未定义(无选择)。
  • (cont...) 用户需要在这些中做出新的选择。我认识到用户可能会感到困惑。我会提请注意所需的输入。

标签: winforms user-interface radio-button options selecteditem


【解决方案1】:

您可以使用自定义集合和数据绑定单选按钮来解决此问题。

每个单独的子节点都有一个行属性和一个列属性以及真/假值标志,当通过单击或按键更改为真时会引发一个事件。

集合类中的逻辑会响应值的变化,并循环遍历同一行和列中的其他子节点,以通知它们它们应该为假。

如果您不想进行数据绑定,也可以使用一组用户控件来完成。

【讨论】:

    【解决方案2】:

    这样的?

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    class Program {
    
        static RadioButton[] bs = new RadioButton[9];
    
        static void HandleCheckedChanged (object o, EventArgs a) {
            RadioButton b = o as RadioButton;
            if (b.Checked) {
                Console.WriteLine(Array.IndexOf(bs, b));
            }
        }
    
        static void Main () {
            Form f = new Form();
            int x = 0;
            int y = 0;
            int i = 0;
            int n = bs.Length;
            while (i < n) {
                bs[i] = new RadioButton();
                bs[i].Parent = f;
                bs[i].Location = new Point(x, y);
                bs[i].CheckedChanged += new EventHandler(HandleCheckedChanged);
                if ((i % 3) == 2) {
                    x = 0;
                    y += bs[i].Height;
                } else {
                    x += bs[i].Width;
                }
                i++;
            }
            Application.Run(f);
        }
    
    }
    

    问候, 坦伯格

    【讨论】:

    • 这将创建一个 2D 按钮组,它只允许选择整个组中的一个按钮。在我的问题中,我指定它应该是每行一个,每列一个(例如,从六组的九个按钮中总共选择三个)。
    【解决方案3】:

    单选按钮的一维数组的一维数组。每行(或列)都将使用正常的单选按钮功能,而每一列(或行)将通过一个循环更新,只要单个单选按钮被切换。

    【讨论】:

    • 我会使用 JavaScript(例如,jQuery)来禁用会导致两个按钮在同一列(或行)上处于活动状态的点击 - 加上后端检查
    • @WalterTross 大多数浏览器都没有办法取消选择单选按钮,因此如果不允许某些点击,则将选择随机排列以符合要求会很乏味或不可能。
    • 为什么需要取消选择单选按钮?只需禁用点击就足够了
    • @WalterTross 如果数组是方形的并且您已经在每一行(因此在每一列)中进行了选择,那么您的解决方案将使用户无法更改他们的选择。
    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 2013-12-10
    • 1970-01-01
    • 2011-07-08
    • 2021-08-04
    • 2011-06-18
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多