/ / Ograniczenie grupy pól wyboru do pewnej liczby kontroli - .net, winforms, interfejs użytkownika

Ograniczenie grupy pól wyboru do pewnej liczby kontroli - .net, winforms, interfejs użytkownika

Mam grupę pól wyboru, które chcę tylkozezwolić na sprawdzenie ustalonej kwoty w dowolnym momencie. Jeśli nowo zaznaczone pole wyboru przesuwa licznik ponad limit, „chcę, aby najstarsze pole wyboru zostało automatycznie odznaczone.

Osiągnąłem funkcjonalność dzięki kolejce,ale jest to dość chaotyczne, gdy muszę usunąć element ze środka kolejki i myślę, że jest bardziej elegancki sposób. Szczególnie nie lubię konwertować kolejki na listę tylko po to, aby wywołać jedną metodę, zanim przekonwertuję listę z powrotem do kolejki.

  • Czy jest lepszy sposób to zrobić?
  • Czy to dobry pomysł, aby odczepić się ponownie, tak jak ja.

Oto kod.

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);
}
}
}

Edytować:
Chakrit odpowiedziałem na moje aktualne pytanie lepszymzamiennik dla kolejki (Of T). Jednak przekonanie, że mój pomysł na odznaczenie pudełek był w rzeczywistości złym pomysłem, było dość przekonujące. Pozostawiam odpowiedź Chakrit jako zaakceptowaną, ale głosowałem za innymi odpowiedziami, ponieważ oferują one bardziej spójne i użyteczne rozwiązanie w oczach użytkownika.

Odpowiedzi:

2 dla odpowiedzi № 1

Myślę, że szukasz Połączona lista.

Posługiwać się AddLast zamiast Enqueue i RemoveFirst zamiast Dequeue i za usunięcie czegoś w środku użyj zwykłego Remove.


4 dla odpowiedzi nr 2

Na wypadek, gdybyś nie pomyślał o tym w ten sposób.

Z punktu widzenia użyteczności prawdopodobnie masz jakiś tekst mówiący „kliknij nie więcej niż 4 pola wyboru”.

W takim przypadku możesz po prostu zatrzymać liczbę zaznaczonych pól i zapobiec zmianom piątego pola (dopóki oczywiście nie są tylko 3 pola wyboru).


3 dla odpowiedzi nr 3

Jedną rzeczą, którą należy sobie zadać, jest: Czy na pewno chcesz zaimplementować tego typu zachowanie z polami wyboru? Pola wyboru mają już dobrze zrozumiałe zachowanie z punktu widzenia użytkownika, a pozornie losowe pole staje się niezaznaczone, gdy sprawdzane jest nowe, prawdopodobnie będzie bardzo mylące lub może nawet frustrujące dla przeciętnego użytkownika.

Może rozważysz coś takiego jak listbox zdodawaj / usuwaj przyciski, gdzie projekt listy daje użytkownikowi wizualną wskazówkę, że istnieje maksymalnie (powiedzmy) cztery elementy. Jako punkt odniesienia myślę o czymś w rodzaju okno dostosowywania paska narzędzi w IE.

Być może nie jest to odpowiedź, której szukałeś, ale coś do rozważenia.


1 dla odpowiedzi nr 4

To, co zrobiłem wcześniej, to wielokolumnowe menu wyboru w następujący sposób:

<---->

opcje: wybrane wybór-1-puste pole- wybór-2-puste pole- wybór-3-puste pudełko- wybór-4-puste pole-

Wtedy ludzie mogliby zaznaczyć „wybór-1” i trafićprawy przycisk. Nagle druga kolumna zostanie wypełniona elementami w pierwszej. Następnie możesz wyłączyć strzałkę po dodaniu 3 opcji i wyświetlić komunikat „Możesz wybrać tylko trzy opcje”. To ma znacznie większy sens w porównaniu z innymi opcjami. Byłoby znacznie łatwiejsze dla użytkownika.


1 dla odpowiedzi nr 5

Czy to dobry pomysł, aby odczepić się od zaczepów obsługa zdarzeń jak ja.

To zależy.

Czy to Windows Forms? Windows Forms działają na WinAPI, co oznacza, że ​​obsługa zdarzeń jest tak naprawdę funkcją wywoływaną przez pętlę wysyłania komunikatów w głównym wątku. Jako takie funkcje nie muszą być ponownie wprowadzane i są „bezpieczne”.

Ale musisz wykonać obsługę błędów i złapać wszelkie wyjątki, takie jak nieudane przydziały w ciągu Twój program obsługi zdarzeń lub aplikacja zostanie zakończona.


0 dla odpowiedzi № 6

Jeśli poprosisz użytkownika, aby wybrał z listy listę opcji i ograniczył liczbę wyborów, prawdopodobnie pierwszy wybór jest podstawowym wyborem.

na przykład Wybierz dwa, nigdy nie będziesz miał tego, czego nie wybierzesz:

  • pieniądze
  • Moc
  • Seks
  • Podniecenie
  • Gadżety
  • Army of Coders.

Czy twój pierwszy wybór był pierwszym wyborem?

Jeśli chcesz użyć pól wyboru, po prostu wyłącz wszystkie niezaznaczone, gdy drugie jest zaznaczone.