2013-04-09 151 views
0

對象的列表框我有一個列表中創建排序按屬性

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

歌曲的細節由被填充到一個列表框:

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特德其內容的標題,專輯,藝術家,流派等

+2

我想你應該真正排序列表框的數據源,並再次綁定列表框。這樣你只處理自己的原始數據結構,而不是與ListBox控件本身 – 2013-04-09 13:54:04

+0

列表框的數據源將在運行時動態添加。我在那裏的SongList.Add僅用於測試目的。 – mansonitefirefox 2013-04-09 13:55:28

+0

最簡單的方法將是實現'Compare'功能和使用'List.Sort()' – 2013-04-09 13:59:13

回答

1

創建按鈕,這取決於你要排序什麼屬性標記它,一個點擊事件添加到按鈕,排列項目(希望你保持它們的列表),然後重新填充列表框:

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); 
    } 
} 

的下降布爾變量是沒有必要的,如果你不想擔心相反的方向訴諸。

+0

,完美的工作。愛你的東西:d – mansonitefirefox 2013-04-09 14:09:43

+0

@mansonitefirefox我感動按鈕點擊事件以外的排序功能,使你不重複的代碼,並改變它,使它只排序是在實際列表框中的項目。 – NominSim 2013-04-09 14:42:07