Kontrolki listowe - ComboBox i ListBox

Wyobraź sobie, że projektujesz formularz zamówienia kuriera. Do wyboru rozmiaru paczki (Mała, Średnia, Duża) użyłeś trzech kontrolek RadioButton - i to był strzał w dziesiątkę. Co jednak zrobisz, gdy w kolejnym kroku użytkownik ma wybrać jedno z 16 województw albo jedno z 195 państw świata? Wstawienie 195 kółek na ekran sprawi, że Twoje okno nie zmieści się na żadnym monitorze!

Właśnie w tym miejscu na scenę wkraczają kontrolki listowe: zgrabna lista rozwijana ComboBox oraz klasyczna lista ListBox. Sprawdźmy, jak je okiełznać pod egzamin INF.04!

1. Pojedynek: ComboBox vs ListBox - Kiedy czego używać?

Obie kontrolki służą do przechowywania kolekcji elementów, ale pełnią zupełnie inne role w interfejsie:

2. Jak napełnić listę danymi? (XAML vs C#)

Elementy do listy możesz włożyć na dwa sposoby.

Sposób A: Bezpośrednio w pliku XAML

Używamy znaczników ComboBoxItem (lub ListBoxItem). Atrybut SelectedIndex="0" sprawia, że pierwsza pozycja jest zaznaczona domyślnie od razu po starcie programu!

<ComboBox x:Name="cbStanowisko" SelectedIndex="0" Width="200" Height="30">
    <ComboBoxItem Content="Kierownik" />
    <ComboBoxItem Content="Starszy programista" />
    <ComboBoxItem Content="Młodszy programista" />
    <ComboBoxItem Content="Tester" />
</ComboBox>

Sposób B: Dynamicznie w kodzie C# (Code-Behind)

Znacznie wygodniejsze podejście, gdy wczytujesz dane z tablicy lub dodajesz je po kliknięciu przycisku, korzystając z kolekcji Items:

public MainWindow()
{
    InitializeComponent();

    // Dodawanie pojedynczych elementów na start:
    lstZadania.Items.Add("Przygotować bazę danych");
    lstZadania.Items.Add("Zaprojektować widok XAML");

    // Lub podpięcie całej tablicy na raz za pomocą ItemsSource:
    string[] stanowiska = { "Kierownik", "Starszy programista", "Tester" };
    cbStanowisko.ItemsSource = stanowiska;
    cbStanowisko.SelectedIndex = 0; // Domyślnie wybierz pierwszy element (indeks 0)
}

3. Jak odczytać to, co wybrał użytkownik?

Do badania stanu listy służą trzy właściwości oraz jedno kluczowe zdarzenie:

⚠️ Uważaj na pułapkę ComboBoxItem na egzaminie!

Jeśli dodałeś elementy w XAML za pomocą <ComboBoxItem Content="Tester"/>, wywołanie cbStanowisko.SelectedItem.ToString() zwróci brzydki napis:
"System.Windows.Controls.ComboBoxItem: Tester".
Rozwiązanie: W przypadku ComboBoxa najprościej odczytać po prostu właściwość Text:

string wybraneStanowisko = cbStanowisko.Text; // Zwróci czyste "Tester"!

4. Zobaczmy to w akcji: Dodawanie i usuwanie z ListBox

Zobacz, jak w kilku linijkach C# stworzyć menedżer listy pracowników (motyw z egzaminu INF.04):

// Dodawanie nowego pracownika z formularza na listę ListBox
private void btnDodaj_Click(object sender, RoutedEventArgs e)
{
    if (!string.IsNullOrWhiteSpace(txtImie.Text))
    {
        string wpis = $"{txtImie.Text} - {cbStanowisko.Text}";
        lstPracownicy.Items.Add(wpis);
        txtImie.Clear();
    }
}

// Usuwanie zaznaczonego elementu z listy ListBox
private void btnUsun_Click(object sender, RoutedEventArgs e)
{
    // Sprawdzamy, czy użytkownik cokolwiek zaznaczył na liście!
    if (lstPracownicy.SelectedIndex != -1)
    {
        lstPracownicy.Items.RemoveAt(lstPracownicy.SelectedIndex);
    }
    else
    {
        MessageBox.Show("Najpierw zaznacz element do usunięcia!", "Uwaga");
    }
}