Ограничение группы флажков определенным количеством проверок - PullRequest
0 голосов
/ 21 сентября 2008

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

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

  • Есть ли лучший способ сделать это?
  • Это хорошая идея отсоединить обработчики событий, как я.

Вот код.

private Queue<CheckBox> favAttributesLimiter - new Queue<CheckBox>();
private const int MaxFavoredAttributes = 5;

private void favoredAttributes_CheckedChanged(object sender, EventArgs e)
{
    CheckBox cb = (CheckBox)sender;

    if (cb.Checked)
    {
        if (favAttributesLimiter.Count == MaxFavoredAttributes)
        {
            CheckBox oldest = favAttributesLimiter.Dequeue();                  

            oldest.CheckedChanged -= favoredAttributes_CheckedChanged;
            oldest.Checked = false;
            oldest.CheckedChanged += new EventHandler(favoredAttributes_CheckedChanged);
        }

        favAttributesLimiter.Enqueue(cb);

    }
    else // cb.Checked == false
    {                
        if (favAttributesLimiter.Contains(cb))
        {
            var list = favAttributesLimiter.ToList();
            list.Remove(cb);
            favAttributesLimiter=new Queue<CheckBox>(list);
        }
    }
}

Редактировать:
Чакрит ответил на мой настоящий вопрос с лучшей заменой Очереди (Of T). Тем не менее, аргумент, что моя идея снять флажки на самом деле была плохой, был довольно убедительным. Я оставляю ответ Чакрита как принятый, но я проголосовал за другие ответы, потому что они предлагают более последовательное и полезное решение в глазах пользователя.

Ответы [ 6 ]

4 голосов
/ 21 сентября 2008

На тот случай, если вы не подумали об этом.

С точки зрения удобства использования, предположительно, у вас есть какой-то текст, говорящий о чем-то вроде "установите не более 4 флажков".

В таком случае, почему бы просто не вести подсчет количества отмеченных флажков и не допустить каких-либо изменений в 5-ом поле (пока, конечно, не будет только 3 флажков).

3 голосов
/ 21 сентября 2008

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

Может быть, рассмотрим что-то вроде списка с кнопками добавления / удаления, где дизайн списка дает пользователю визуальную подсказку о том, что существует максимум (скажем) четырех элементов. Для справки я думаю о чем-то вроде диалога настройки панели инструментов в IE .

Возможно, не тот ответ, который вы искали, но что-то для рассмотрения.

2 голосов
/ 21 сентября 2008

Я думаю, что вы ищете LinkedList .

Используйте AddLast вместо Enqueue и RemoveFirst вместо Dequeue, а для удаления чего-то посередине просто используйте обычный Remove.

1 голос
/ 22 сентября 2008

Это хорошая идея, чтобы отцепить, повторно взяли обработчики событий, как я.

Это зависит.

Это Windows Forms? Windows Forms работают поверх WinAPI, что означает, что обработчик событий на самом деле является просто функцией, вызываемой циклом отправки сообщений в главном потоке. Таким образом, функции не требуют повторного входа, и они «безопасны».

Но вы должны выполнить обработку ошибок и перехватить любые исключения, такие как неудачные выделения в вашего обработчика событий или вашего приложения будет прервано.

1 голос
/ 21 сентября 2008

То, что я сделал раньше, это меню выбора из нескольких столбцов, например:

<---->

выбор: отдельный выбор-1-пустая коробка- выбор-2-пустая коробка- выбор-3-пустая коробка- выбор-4-пустая коробка-

Тогда люди могли бы выделить «Выбор-1» и нажать правую кнопку. Внезапно второй столбец будет заполнен элементами в первом. Затем вы можете отключить стрелку после добавления 3-х вариантов и всплыть сообщение: «Вы можете выбрать только три варианта». Это имеет гораздо больше смысла по сравнению с другими вариантами. Это было бы намного проще для пользователя.

0 голосов
/ 22 сентября 2008

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

например. Выберите два, у вас никогда не будет ничего из того, что вы не выбрали:

  • Деньги
  • Мощность
  • Пол
  • Волнение
  • Гаджеты
  • Армия кодеров.

Был ли ваш первый выбор основным?

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

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