2009-02-23 5 views
7

ФоновыйКак избежать Windows Forms радиокнопок контейнер Авто группировка

В .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 с три колонки для того, чтобы упростить вопросы выравнивания связанно, но это означает, что я не могу использовать автоматическое радио функция «группировка по контейнеру».

EDIT:

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

Это означает, что я могу использовать элементы управления для компоновки, но не для группировки кнопок.

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

/EDIT

То, что я пытаюсь спросить

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

В частности, существует ли какой-либо «канонический» или известный способ подклассификации «RadioButton» или вплоть до API Win32, так что каждый раз, когда контроль проверяется (с помощью мыши, клавиатуры Enter, пробела, и любым другим способом, который я не мог бы знать о их выборе). Я могу захватить событие и вручную обновить состояние каждого другого элемента управления в моей форме и таким образом, что функция автоматической группировки хорошо известна как «деактивированная», ? Я боюсь, что реализация также связана с контейнером, и мне также может быть предложено подклассы Panel.

Как работает «волшебство» группировки в Windows Forms?

Каждое решение, которое я нашел в Google, которое использует настраиваемые группы переключателей или «списки переключателей», каким-то образом основано на использовании контейнера для группы. Можно ли избежать контейнеров? Если да, то как ?.

ответ

6

временное решение (читай: грязный хак) я обнаружил, что я ставлю каждый и каждый переключатель в своей небольшой панели. Поэтому между ними нет никакой группировки. Я слушаю каждую кнопку checked событий и соответствующим образом обновляю соответствующие.

Я все еще думаю, что это слишком много, чтобы иметь много панелей, и если у кого-то есть более чистое решение, я бы хотел его услышать.

(ОК, извините за ответ на мой собственный вопрос. Вы знаете, что, когда вы берете время, чтобы объяснить то, что вы начинаете видеть проблему это другой свет.)

+0

Если вы идете с этим решением, тогда было бы неплохо создать собственный радиоблок, который не должен быть в панели. И когда вы на нем, добавьте необязательное свойство GroupID, которое будет отправлено обратно при переключении. – Stefan

+0

Еще раз спасибо за помощь Стефан. Кстати, я уже сделал независимый класс RadioButton, но мне еще не пришло в голову добавить свойство GroupId прямо там. Звучит просто так. –

+0

Проверьте изменения моего ответа на несколько идей. –

1

Я бы выбрал простое и понятное решение. Например, настраиваемый элемент управления, который представляет одну строку (так что два переключателя и метка).

EDIT: Хорошо, я понимаю, что сейчас я понимаю ваше требование. Разве у вас нет только двух наборов радиообъектов: те, что указаны в столбце A и в столбце B?

Когда ваша форма рисуется, добавьте их в два списка: < RadioButton> или что-то еще и привяжите их к двум отдельным событиям: columnARBChecked, columnBRBChecked. Когда одно из событий срабатывает, вы можете вызвать некоторую логику, чтобы проверить/снять галочку с остальными радиокнопками, как вам будет угодно.

+0

Это будет работать вместо TableLayoutPanel для макетирования, конечно. Проблема с этим решением заключается в том, что кнопки внутри пользовательского элемента управления будут по-прежнему группироваться внутри пользовательского элемента управления.Поэтому у меня было бы столько групп, сколько экземпляров пользовательского контроля вместо 2 групп (по одному для каждого столбца). –

+0

Тогда, боюсь, я полностью не понимаю ваше требование. Вам нужна горизонтальная группировка? Зачем вам вертикальные панели? Почему вы не можете просто перебирать коллекцию пользовательских элементов управления и читать, какая радио-кнопка там проверена? –

+0

Извините, я отредактирую вопрос, чтобы уточнить, что на самом деле горизонтальная группировка (это то, что произойдет по умолчанию) - это не то, что мне нужно, а вертикальная группировка. Благодарю. –