Заполнить список на основе других вариантов списка? - PullRequest
0 голосов
/ 27 апреля 2018

Я столкнулся с дорожным блоком, пытаясь создать систему инвентаризации музыки. Итак, у меня есть два выпадающих списка (cb1 и cb2) и список (lb). Пользователь выбирает из cb1, искать ли музыкальный альбом по жанру или исполнителю. Затем cb2 заполняется либо списком исполнителей, либо списком жанров в зависимости от выбора cb1 с данными из базы данных SQL, которую я создал в конструкторе таблиц VS. Затем, наконец, 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;
    }

И затем это обработчик событий cb2 для заполнения lb:

    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, значение которой изменяется на "Genre" или "Artist" в классе обработчика событий для cb1. Где проблема в моем коде?

1 Ответ

0 голосов
/ 28 апреля 2018

Посмотрев на него пару часов, я понял, что моя ошибка заключалась в приведении выбранного элемента в cb2 в строку. Это обнаружилось как ошибка DataView, и поэтому я изменил это, чтобы использовать GetItemText();

...