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:

-
ListBox(Lista przewijana): Używaj go, gdy użytkownik ma widzieć wiele elementów naraz, przeglądać je, dodawać nowe pozycje lub usuwać istniejące (np. lista dopisanych pracowników, lista zadań do wykonania). -
ComboBox(Lista rozwijana): Używaj go, gdy chcesz zaoszczędzić miejsce w oknie, a użytkownik wybiera jedną wartość z zamkniętego katalogu (np. wybór stanowiska pracy w arkuszu CKE: Kierownik, Starszy programista, Młodszy programista, Tester).
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:
SelectedIndex- zwraca numer wybranej pozycji (licząc od0!). Jeśli nic nie jest wybrane, zwraca-1.SelectedItem- zwraca zaznaczony obiekt.SelectionChanged- zdarzenie odpalane natychmiast, gdy użytkownik zmieni wybór na liście.
⚠️ Uważaj na pułapkę
ComboBoxItemna egzaminie!Jeśli dodałeś elementy w XAML za pomocą
<ComboBoxItem Content="Tester"/>, wywołaniecbStanowisko.SelectedItem.ToString()zwróci brzydki napis:"System.Windows.Controls.ComboBoxItem: Tester".
Rozwiązanie: W przypadkuComboBoxanajproś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");
}
}