【问题标题】:Populating listbox based on other combobox selections?根据其他组合框选择填充列表框?
【发布时间】:2018-04-27 18:48:33
【问题描述】:

我在尝试创建音乐库存系统时遇到了障碍。所以我有两个组合框(cb1 和 cb2)和一个列表框(lb)。用户从 cb1 中选择搜索音乐专辑是流派还是艺术家。然后 cb2 使用我在 VS 表设计器中创建的 SQL 数据库中的数据填充艺术家列表或流派列表,具体取决于 cb1 选择。最后,lb 会根据 cb2 中的选择填充数据,例如,如果 cb2 说“Pop”,则 lb 会填充“Pop”流派下的专辑。我有 cb1 和 cb2 下来,但我似乎无法用这些数据的组合填充 lb 。我手动完成了 cb2,因为只有“流派”和“艺术家”,但我有 7 个流派和 37 位艺术家,所以手动执行的冗余代码太多了。

到目前为止,我有一个转换 GenreToAlbums 和 ArtistToAlbums 的类:

    public List<string> GenreToAlbums(String genre)
    {
        List<string> albums = new List<string>();
        String s = "select name from Albums where genre = '" + genre + "'";

        SqlConnection c = new SqlConnection(@"Data Source=ALYSSAUSF\SQLEXPRESS;Initial Catalog=UserData;Integrated Security=True");
        SqlCommand cmd = new SqlCommand(s, c);
        c.Open();
        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read()) 
        {
            albums.Add((string)reader["name"]);
        }

        return albums;
    }

    public List<string> ArtistToAlbums(String artist)
    {
        List<string> albums = new List<string>();
        String s = "select name from Albums where artist = '" + artist + "'";

        SqlConnection c = new SqlConnection(@"Data Source=ALYSSAUSF\SQLEXPRESS;Initial Catalog=UserData;Integrated Security=True");
        SqlCommand cmd = new SqlCommand(s, c);
        c.Open();
        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            albums.Add((string)reader["name"]);
        }

        return albums;
    }

然后这是填充 lb 的 cb2 事件处理程序:

    private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ClassItems.selectedItem == "Genre")
        {
            String selectedGenre = comboBox2.SelectedItem.ToString();

            List<string> albums = GenreToAlbums(selectedGenre);
            listBox1.DataSource = albums;
            listBox1.DisplayMember = "name";
        }
        else if (ClassItems.selectedItem == "Artist")
        {
            String selectedArtist = comboBox2.SelectedItem.ToString();

            List<string> albums = ArtistToAlbums(selectedArtist);
            listBox1.DataSource = albums;
            listBox1.DisplayMember = "name";
        }
    }

我有一个公共类ClassItems,它处理全局变量SelectedItem,它的值在cb1 的事件处理程序类中更改为“流派”或“艺术家”。我的代码哪里出了问题?

【问题讨论】:

  • 我不明白这个问题。什么不工作?
  • 花 15 分钟了解如何使用参数化语句和 SQL 参数正确创建查询。您的 SelectedIndex 无法知道用户是否还会从其他用户中进行选择,或者他们将按什么顺序选择它们。您需要一个按钮,以便他们可以告诉您 - '我已完成过滤器,这就是我想要的'
  • @DanWilson 填充列表框 lb 无法使用我拥有的任何代码
  • @Plutonix 在用户从第一个组合框中进行选择之前,第二个组合框不会启用,所以我确实拥有该控件
  • 好吧,“它不起作用”的标准补救措施是 debug your code 并阅读 How to Ask 并获取 tour 以提供更有用的问题描述

标签: c# sql winforms windows-forms-designer


【解决方案1】:

盯着它看了几个小时后,我意识到我的错误是将 cb2 中的选定项目转换为字符串。它显示为 DataView 错误,因此我将其更改为使用 GetItemText();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多