Использование ApplicationSettings для хранения свойства Checked для WinForms RadioButtons - PullRequest
5 голосов
/ 02 июня 2009

У меня есть диалоговое окно WinForms, которое содержит 3 переключателя. Я использую ApplicationSettings для привязки свойства Checked каждого из этих RadioButton элементов управления, но он не выполняет то, что я ожидаю. Теперь мне нужно дважды щелкнуть по каждой радиокнопке, прежде чем она будет проверена, а выбранная радиокнопка не сохраняется.

Есть ли строка кода, которую мне нужно выполнить при закрытии формы, которая сохраняет настройки пользователя?

Как избавиться от необходимости повторного нажатия на переключатели?

Есть ли лучший способ сохранить этот тип пользовательских настроек? У меня есть общедоступное свойство в классе диалогового окна, которое получает / устанавливает значение перечисления, в зависимости от того, какой переключатель установлен, но я не видел простого способа привязать это свойство к пользовательской настройке.

Редактировать: Должен был указать, что я использую vb.net. Я думаю, что это означает My.Settings вместо Properties.Settings.

Ответы [ 4 ]

6 голосов
/ 02 августа 2011

Благодаря Джеффри Ван Вику и ohadsc (за ссылку) я придумал следующий пользовательский элемент управления. Это в основном пользовательский кадр, который будет автоматически реализовывать код Джеффри на всех содержащихся в нем радиокнопках. Преимущество состоит в том, что теперь вы можете использовать ApplicationSettings для привязки свойства selected элемента управления, и оно будет работать так, как и должно быть.

Вот мой код c # для создания пользовательского элемента управления:

 public partial class RadioPanel : System.Windows.Forms.Panel
    {
        protected override void OnControlAdded(ControlEventArgs e)
        {
            base.OnControlAdded(e);
            var radioButton = e.Control as RadioButton;
            if (radioButton != null)
                radioButton.Click += radioButton_Click;
        }

        void radioButton_Click(object sender, EventArgs e)
        {
            var radio = (RadioButton)sender;
            if (!radio.Checked)
                radio.Checked = true;
        }

    }
6 голосов
/ 26 июня 2010

Я отвечу на эту часть вашего вопроса:

Как избавиться от необходимости повторного нажатия на переключатели?

Вы можете добавить следующий обработчик события к событию Click каждой из трех кнопок RadioButton (свойства Checked которых связаны с настройками приложения) в вашем GroupBox:

Private Sub RadioButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tomRadioButton.Click, dickRadioButton.Click, harryRadioButton.Click
    If sender.Checked = False Then
        sender.Checked = True
    End If
End Sub

Это работает, даже несмотря на то, что непроверенная RadioButton проверяется после нажатия на полсекунды после нажатия на нее.

Причина этой проблемы была объяснена два года назад (в 2008 году) в разделе 5 публикации Выживающие данные WinForms в блоге Turbulent Intelect (спасибо, ohadsc , за ссылка):

Правило 5: Не привязывайте к нажимаемым кнопкам радио

Я знаю, как было бы здорово, если бы ты может просто связать вашу кучу радио кнопки для свойства enum. я действительно делать. Вы думаете, что вы просто собираетесь подключить некоторые события форматирования и разбора перевести обратно на ваше перечисление, и все будет хорошо. Было бы так чертовски удобно, если это действительно сработало. Но WinForms просто не предназначены для этого. Для 3 полных выпусков сейчас (или это 3.5 релизы?), это было так. Это из-за порядка событий, который это не то, что MS может пойти переключаясь не вызывая тысячи разработчиков, чтобы получить действительно сыр выкл.

Проблема действительно сводится к тот факт, что в отличие от других элементов управления свойства, Проверено свойство радио-кнопка на самом деле не меняется пока фокус не покинет переключатель. И как со всеми WinForms контролирует фокус не покидает радио Кнопка до тех пор, пока фокус не будет дан другой контроль, и на самом деле не до после события Click нового сфокусированный контроль сработал. Результат этого, как это относится к радио кнопки, это то, что если вы пытаетесь привязать к их, связанные свойства в вашем источник данных будет фактически отставать ваш визуальное состояние переключателей по одному нажмите . Если у вас есть только два радио кнопки, источник данных будет прямо напротив видимого состояния, пока вы не нажмете в другом месте, что не вызывает действие, которое ссылается на эти источники данных свойства. Который может сделать это действительно бешеная ошибка, чтобы выследить. Я почти думал, что у меня галлюцинации.

Теперь, честно говоря, возможно сделай так, чтоб это работало. Но это клуджист Клудж, который когда-либо клудж. Хорошо может быть это не так плохо ... но это грязно взломать наверняка. Это занимает много работы за то, что действительно должно уже будет доступен. Как можно ближе скажите, единственный способ решить это проблема, не отказываясь от механизм привязки данных к по сути, сделать свой собственный RadioButton контроль, с изменением свойства и порядок событий, который на самом деле полезен. Вы можете написать один с нуля, или подкласс RadioButton и переопределить вся логика событий с кастомами обработка сообщений.

3 голосов
/ 06 марта 2010

Это поведение объясняется в пункте 5 здесь:

http://turbulentintellect.blogspot.com/2008/07/surviving-winforms-databinding.html

Одним из возможных решений будет пользовательский GroupGox: Лучший способ привязать группу радиокнопок в WinForms

3 голосов
/ 02 июня 2009

Я могу ответить на эту часть вашего вопроса:

Есть ли строка кода, которую мне нужно выполнить при закрытии формы, которая сохраняет настройки пользователя?

Настройки приложения хранятся в вашем классе Settings, в пространстве имен Properties. Класс Settings имеет статическое свойство, называемое Default, которое представляет текущие настройки для вашего приложения. Итак, на закрытии вашей основной формы вы звоните:

Properties.Settings.Default.Save();

... для сохранения настроек.

Аналогично, вы можете программно перейти к настройкам, используя имя параметра: Properties.Settings.Default.MyRadioButtonState (или как вы его называли).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...