Каков наилучший способ реализации 2D-сетки радиокнопок? - PullRequest
3 голосов
/ 26 ноября 2008

Каков наилучший способ реализации двумерной сетки переключателей, чтобы можно было выбрать только один параметр в каждом столбце и один параметр в каждом ряду?

Ответы [ 3 ]

2 голосов
/ 27 ноября 2008

1D массив 1D массивов радиокнопок. Каждая строка (или столбец) будет использовать обычную функциональность переключателя, в то время как каждый столбец (или строка) будет обновляться циклом, вызываемым всякий раз, когда переключается отдельный переключатель.

0 голосов
/ 23 февраля 2009

Вы можете подойти к этому с помощью пользовательской коллекции и привязать радиокнопки к данным.

У каждого отдельного дочернего элемента будет свойство для строки и свойство для столбца, а также флаг значения true / false, который вызывает событие при изменении его на true посредством нажатия или нажатия клавиши.

Логика в классе коллекции будет реагировать на изменение значения и проходить через другие дочерние элементы в той же строке и столбце, чтобы уведомить их, что они должны быть ложными.

Если вы не хотите привязывать данные, вы также можете сделать это с помощью набора пользовательских элементов управления.

0 голосов
/ 28 ноября 2008

Как то так?

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);
    }

}

С уважением, Тамберг

...