C # .net Сделать флажки, чтобы вести себя как переключатель - PullRequest
1 голос
/ 10 января 2012

У меня есть групповое поле, в котором есть несколько переключателей. Я пытаюсь реализовать сериализацию с помощью учебника из Code Project. Это руководство поддерживает сериализацию флажков, а не переключателей. Поэтому мне нужно сделать переключатели в моем приложении в качестве флажков (то есть они должны быть флажками, но работать как радио-кнопка).

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

Может кто-нибудь помочь мне с этим?

Спасибо

UPDATE:

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

P.S Ссылка на учебник: http://www.codeproject.com/KB/dialog/SavingTheStateOfAForm.aspx

Окончательное обновление:

После ознакомления с опубликованными здесь ответами я решил не изменять свойства по умолчанию, а изменить код сериализатора. Я сделал это, и теперь это работает отлично. Всем большое спасибо.

Ответы [ 5 ]

5 голосов
/ 10 января 2012

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

Правильный способ сделать этоэто исправить ваш код для сериализации переключателей, но не видя ваш код, трудно понять, как вам помочь.Для начала вы можете исправить цикл CheckedChanged, временно удалив обработчик событий, прежде чем что-либо делать.Например:

myCheckBox.CheckedChanged -= MyCheckedChangedEventHandler;
myCheckBox.Checked = true;
myCheckBox.CheckedChanged += MyCheckedChangedEventHandler;

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

Редактировать: Основываясь на учебнике, указанном в вашем обновлении, я предполагаю, что проблема возникает, когда вы вызываете FormSerialisor.Deserialise(), что вызывает срабатывание обработчиков событий ваших элементов управления?Если это так, быстрое решение состоит в том, чтобы просто сделать то, что я упомянул: удалить обработчики событий переключателей перед вызовом FormSerialisor.Deserialise(), а затем повторно добавить их после.Пример:

myRadioButton.CheckedChanged -= MyCheckedChangedEventHandler;
FormSerialisor.Deserialise(this, mySerialisepath);
myRadioButton.CheckedChanged += MyCheckedChangedEventHandler;

Вам также может понадобиться отредактировать класс FormSerialisor для обработки RadioButtons;просто скопируйте код, который обрабатывает флажки, но измените все ссылки на RadioButton.Из вашего вопроса не ясно, будет ли этот шаг необходим или нет.

1 голос
/ 10 октября 2013

Здравствуйте, вот простой ответ для преобразования CheckBox в RadioButton:

object clickBox = null;

 private void checkBox_Click(object sender, EventArgs e)
    {
        clickBox = sender;

        foreach (Control c in this.Controls)
        {
            if (c is CheckBox)
            {
                if (c != clickBox)
                {
                    ((CheckBox)c).Checked = false;
                }
            }
        }

И добавьте это событие Click o каждый флажок Finish

1 голос
/ 10 января 2012

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

(Я не спорю с комментариями. Просто отвечаю на вопрос.)

1 голос
/ 10 января 2012

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

    private bool autoChange = false;
    private void ChangeHandler() {
        if (!autoChange) {
            autoChange = true;
            /* Do stuff */
            autoChange = false;
        }
    }
0 голосов
/ 28 июня 2019

Возьмите CheckedListBox и позвоните ItemCheck Событие и используйте приведенный ниже код. Он будет вести себя как радио-кнопки (это работает для меня): -

 private void chkListBox_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if (e.NewValue == CheckState.Checked)
        {
            for (int item = 0; item < chkListBox.Items.Count; item++)
            {
                chkListBox.SetItemChecked(item, false);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...