Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Combobox C# -> Skrytí určitých položek

Zdravím,

Chtěl bych se zeptat, zda-li nejde nějak skrýt položky v comboboxu.

Mám 20 comboboxů, v každém je celá abeceda a já potřebuji, aby vždy v následujícím comboboxu se skrylo to písmeno, které už bylo použito, ale aby to nebylo tak jednoduché, tak když se to písmeno uvolní, tak se v ostatních comboboxech zase musí objevit. (prostě každé písmeno může být využito maximálně jednou a 5 písmen zůstane volných)

Napadlo mě to přes index, se mi to nedaří udělat.

Předem děkuji za jakékoliv rady a tipy

Předmět Autor Datum
Proč skrýt? Prostě je tam vůbec nedávej, ne?
Wikan 21.05.2017 21:45
Wikan
Jako, že při vypisování by se vynechalo určité písmeno?
YukiiCZ 21.05.2017 21:51
YukiiCZ
Jako že by kolekce Items tu položku vůbec neobsahovala.
Wikan 21.05.2017 21:52
Wikan
No jo, ale já si potřebuji vybrat ta určitá písmena. Nemůžu to dát tak, že třeba cb1 nebude mít vůbe…
YukiiCZ 21.05.2017 21:55
YukiiCZ
Nemůžu to dát tak, že třeba cb1 nebude mít vůbec písmeno A. To právě klidně můžeš. Můžeš si třeba z…
Wikan 21.05.2017 21:58
Wikan
Nad tím jsem uvažoval, ale přijde mi, že by to zabralo asi sakra hodně řádků.
YukiiCZ 21.05.2017 21:59
YukiiCZ
Tak možná deset.
Wikan 21.05.2017 22:03
Wikan
Udělej si kolekci písmen a do komboboxu pln jen ta, ktera nejsou vybrana v ostatnich komboboxech. Sp…
Jan Fiala 21.05.2017 22:00
Jan Fiala
Nevím přesně jestli by to v tomhle případě bylo proveditelné, ale zkusil bych u každého itemu přidat…
GTS 21.05.2017 22:20
GTS
public partial class Form1 : Form { private string letters = "ABCDEFGHIJKLMNOQRSTUV"; public Form1(… poslední
BěžnýUživatel 21.05.2017 23:23
BěžnýUživatel

Nemůžu to dát tak, že třeba cb1 nebude mít vůbec písmeno A.

To právě klidně můžeš.
Můžeš si třeba z ComboBoxu podědit vlastní třídu a v ní přepsat metodu SetItemsCore, tím budeš moct nastavovat kompletní Items.
Nebo použiješ původní CB a přidávat/odebírat jednotlivé prvky pomocí metod Remove/InsertAt.

Nevím přesně jestli by to v tomhle případě bylo proveditelné, ale zkusil bych u každého itemu přidat boolovskou vlastnost kterou by jsi pak nabindoval v setteru itemu u komboboxu na vlastonst Visibility + pužil bys konvertor, který by vracel buď visible/colapsed,
Něco jako toto(jen ne v lisboxu, ale comboboxu):

<ListBox.ItemContainerStyle>
     <Style TargetType="{x:Type ListBoxItem}">
             <Setter Property="Visibility" Value="{Binding TvojeVlastnost, Converter={StaticResource TrueVisibleConv}}"></Setter>
      </Style>
</ListBox.ItemContainerStyle>
    public partial class Form1 : Form
    {
        private string letters = "ABCDEFGHIJKLMNOQRSTUV";

        public Form1()
        {
            InitializeComponent();
            FillComboBoxes();
        }

        private void FillComboBoxes()
        {
            foreach (MyComboBox cb in Controls)
            {
                foreach (char c in letters)
                {
                    cb.Items.Add(c);
                }
            }
        }

        private void LetterChanged(object sender, EventArgs e)
        {
            MyComboBox comboBox = (MyComboBox)sender;
            char letter = (char)comboBox.SelectedItem;

            foreach (MyComboBox cb in Controls)
            {
                if (cb == sender)
                    continue;

                if (comboBox.PreviousLetter != '\0')
                    cb.Items.Insert(letters.IndexOf(comboBox.PreviousLetter), comboBox.PreviousLetter);

                cb.Items.Remove(letter);
            }

            comboBox.PreviousLetter = letter;
        }
    }

    public class MyComboBox : ComboBox
    {
        public char PreviousLetter { get; set; }
    }

V designeru (Form.designer.cs) si přepíšeš třídu ComboBox na třídu MyComboBox a přidáš EventHandler pro SelectedIndexChanged na metodu LetterChanged.

Zpět do poradny Odpovědět na původní otázku Nahoru