2013-04-09 92 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