ASP.NET Listbox'ta çoklu eleman silme

Diyelimki bir Listbox'ınız var ve SelectionMode'u Multiple olarak ayarladınız.

Ctrl ve Shift tuşları ile birden fazla item seçebiliyorsunuz. Peki seçtiğiniz bu itemleri tek bir buton tıklaması ile nasıl silebilirsiniz?

Aklınıza hemen şöyle bir kod gelebilir:

for (int i = 0; i < lbSektorler.Items.Count; i++)
{
  if (lbSektorler.Items[i].Selected)
    lbSektorler.Items.RemoveAt(i);
}

Çalıştırın ve kodun düzgün iş görmediğini görün. Neden? Çünkü siz bir item sildiğinizde diğer itemların indexi değişiyor ve silmek istediğiniz değil başka itemlar etkileniyor.

Şöyle bir şey yapalım derseniz bu da çalışmayacaktır:

foreach (ListItem li in lbSektorler.Items)
{
  if (li.Selected)
    lbSektorler.Items.Remove(li);
}

Bu sefer de çalışma zamanı alacaksınız çünkü foreach iterasyona devam ederken birden çalıştığı küme değişiyor.

Bütün bu kodları bir tarafa atın, en güzel çözüm şu:

while (lbSektorler.SelectedItem != null)
  lbSektorler.Items.Remove(lbSektorler.SelectedItem);

SelectedItem özelliği, seçili en küçük indexli itemi döndürüyor. Null olana kadar sil deyince de bu yazının esas konusu olan çoklu silme işini rahatlıkla yapabiliyoruz.

Herkese kolay gelsin :)

Not: İndexlerle çalışırken RemoveAt metodunu, itemlarla çalışırken Remove metodunu kullandığımıza dikkat edin.