0

我目前有 2 个列表框(lstbox1 和 lstbox2)。两个列表框都包含通过 StreamReaders 输入的数据,ArrayLists 保存文件中的所有数据。

目前,我的 lstbox1 包括:Genre、GenreDesc、AgeRange(这些只是我给它们的变量名,实际文件如下所示):

  • 动作, 描述这里, 12+
  • 恐怖,描述在这里,18+
  • 喜剧, DescriptionHere, 12+

这只是通过 SR 放入我的 lstbox1 的文本文件的示例。

我想做的是,当我从 lstbox1 中选择一个项目时,它会过滤掉 lstbox2 中与我选择的流派匹配的电影,并将其显示在列表框中。

我的第二个文本文件被输入到 lstBox2 中,看起来像这样(movieTitle,movieGenre,movieDesc,movieRating:

  • 变形金刚, 动作, 描述在这里, 77/100
  • 宿醉, 喜剧, DescriptionHere, 52/100
  • 黑暗骑士, 动作, 描述在这里, 85/100
  • 矩阵, 行动, 描述在这里, 74/100

由于两个列表框都包含多个变量,我希望我的 lstbox1 指定流派,并忽略其中的其他值,这样当我从 lstBox1 中选择一个值时,它将搜索细节。

if (lstBox1.Genre == lstBox2.movieGenre)
{
    lstbox2.items.clear();
    //Add Genre Name as header (Based upon your selected item)
    //Add movieTitle + movieDesc + movieRating
}

& 循环这个直到所有的电影都被搜索到。

我制作了 2 个类(1 个用于流派,1 个用于电影)并且我不确定如何从 lstBox1 中选择“流派”部分用作过滤器。

4

1 回答 1

0

我想你已经加载了lisBox1with 类型的对象Genre

lisBox1.Datasource = this.GetAllGenresFromTextFiles();
lisBox1.DisplayMember = "Genre";

将事件添加到SelectionChanged您的lstBox1

lstBox1.SelectionChanged += lstBox1_SelectionChanged;

然后在这种情况下,过滤 listbox2 的数据:

void lstBox1_SelectionChanged(object sender, EventArgs e)
{
    var movies = m_allMovies;
    var genre = lstBox1.SelectedItem as Genre;
    if(genre != null)
    {
        movies = movies.Where(m => m.Genre == genre.Genre).ToList();
    }
    lstbox2.Datasource = movies;
}

m_allMovies是您从文本文件中加载的所有电影的列表。
您还可以在用户每次单击不同类型时读取文本文件,这将消耗更少的内存但更多的 CPU:

void lstBox1_SelectionChanged(object sender, EventArgs e)
{
    var movies = this.GetAllMoviesFromTextFiles();
    var genre = lstBox1.SelectedItem as Genre;
    if(genre != null)
    {
        movies = movies.Where(m => m.Genre == genre.Genre).ToList();
    }
    lstbox2.Datasource = movies;
}

这里的关键点不是从Listbox. 您必须将其视为您Listbox包含所有电影的子集。
并且每次您想从 a 中添加或删除行时Listbox,实际上您正在使用适当的数据重新加载它。

于 2013-04-09T12:51:42.760 回答