2013-04-09 3 views
0

Я список создатель:Сортировка ListBox объектов по атрибутам

List<Song> SongList = new List<Song>(); 

населена кучей:

SongList.Add(new Song(songID, "Dirt", "Alice in Chains", "Rooster", "Rock", "02:32")); 

Подробности песен заполняются в ListBox по:

private void songTitle_TextChanged(object sender, EventArgs e) 
{ 
    i = 0; 

    for (; i < songTitle.Text.Length; i++) 
    { 
     songResultBox.Items.Clear(); 
     var songResult = from song in SongList 
     where song.SongTitle != null && song.SongTitle.Length >= songTitle.Text.Length 
      && songTitle.Text == song.SongTitle.Substring(0, i+1) 
     select new { sId = song.SongID, album = song.SongAlbum, artist = song.SongArtist, title = song.SongTitle, 
      genre = song.SongGenre, length = song.SongLength }; 

     foreach (var item in songResult) 
     { 
      songResultBox.Items.Add(new Song(item.sId, item.album, item.artist, item.title, item.genre, item.length)); 
       songResultBox.DisplayMember = "FullName"; 
       songResultBox.ValueMember = "songID"; 
     } 
    } 
} 

Вопрос: Как бы я создал кнопку (или 4 на самом деле), которая приняла содержимое ListBox 'songResultBox' и sor ted его содержание по названию, альбому, художнику, жанру и т. д.

+2

Думаю, вам действительно нужно отсортировать источник данных в списке и снова привязать список. таким образом, вы имеете дело только со своими исходными структурами данных, а не с самим элементом управления ListBox –

+0

источник данных из списка будет добавлен динамически во время выполнения. SongList.Add У меня есть только для целей тестирования. – mansonitefirefox

+0

самым простым способом будет реализация функции «Сравнить» и использование 'List.Sort()' –

ответ

1

Создайте кнопку, назовите ее в зависимости от того, какое свойство вы хотите сортировать, добавьте событие кнопки к кнопке, отсортируйте элементы (надеюсь, вы сохранили их список), а затем заселить ListBox:

private bool descendingSongTitleSort = false; 
private bool descendingArtistSort = false; 

// Artist button clicked event 
private void artistButtonClicked(object sender, EventArgs args) 
{ 
    Func<Song, IComparable> sortProp = (song => song.Artist); 
    sortListBox(songResultBox, descendingArtistSort, sortProp); 
    descendingSongTitleSort = false; 
    descendingArtistSort = !descendingArtistSort; 
} 

// Title button clicked event 
private void titleButtonClicked(object sender, EventArgs args) 
{ 
    Func<Song, IComparable> sortProp = (song => song.Title); 
    sortListBox(songResultBox, descendingSongTitleSort, sortProp); 
    descendingSongTitleSort = !descendingSongTitleSort; 
    descendingArtistSort = false; 
} 

// Sorting function 
private void sortListBox(
    ListBox box, 
    bool descending, 
    Func<Song, IComparable> sortProperty) 
{ 
    List<Song> items = new List<Song>(); 
    foreach (Object o in box.Items) 
    { 
     Song s = o as Song; 
     items.Add(s); 
    } 
    box.Items.Clear(); 
    if(descending) 
    { 
     items = items.OrderByDescending(sortProperty).ToList(); 
    } 
    else 
    { 
     items = items.OrderBy(sortProperty).ToList(); 
    } 
    foreach(Song s in items) 
    { 
     box.Items.Add(s); 
    } 
} 

Нисходящий Bools не нужен, если вы не хотите, чтобы беспокоиться о прибегнув в противоположном направлении.

+0

, который отлично работал. Любите свои вещи: D – mansonitefirefox

+0

@mansonitefirefox Я переместил функцию сортировки за пределы события нажатия кнопки, чтобы вы не повторяли код и меняли его так, чтобы он сортировал только элементы, которые находятся в фактическом списке. – NominSim