ФоновыйКак избежать 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, которое использует настраиваемые группы переключателей или «списки переключателей», каким-то образом основано на использовании контейнера для группы. Можно ли избежать контейнеров? Если да, то как ?.
Если вы идете с этим решением, тогда было бы неплохо создать собственный радиоблок, который не должен быть в панели. И когда вы на нем, добавьте необязательное свойство GroupID, которое будет отправлено обратно при переключении. – Stefan
Еще раз спасибо за помощь Стефан. Кстати, я уже сделал независимый класс RadioButton, но мне еще не пришло в голову добавить свойство GroupId прямо там. Звучит просто так. –
Проверьте изменения моего ответа на несколько идей. –