Пытаюсь выбрать и вывести данные из списка Предметов, но получить это вместо имени, которое я хочу - PullRequest
0 голосов
/ 17 апреля 2020

System.Linq.Enumerable + WhereSelectListIterator`2 [ShopApp_Sem2_Project.Item, System.String]

public class Item
{
    #region Properties

    public int ItemID { get; set; }
    public string ProductName { get; set; }
    public string Manufacturer { get; set; }
    public string Category { get; set; }
    public double Price { get; set; }
    public string Info { get; set; }
    public string Image { get; set; }

    #endregion Properties

    #region Constructors
    public Item(int itemID, string product, string manufacturer, string category, double price, string info, string image)
    {
        ItemID = itemID;
        Manufacturer = manufacturer;
        Category = category;
        ProductName = product;
        Price = price;
        Info = info;
        Image = image;
    }
    #endregion Constructors
}

Так что это мой класс с некоторыми свойствами и конструкторами, которые я используя для создания магазина. Я заполняю список под названием lbxCategories, но при попытке получить какую-либо информацию после выбора из списка и использования оператора linq я вижу эту ошибку, показанную выше.

public partial class shopHome : Page
{
    string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Owner\Desktop\College Work\OOD\ShopApp_Sem2_Project\items.mdf;Integrated Security=True;";

    List<Item> allItems = new List<Item>();

    public shopHome()
    {
        InitializeComponent();
    }

    private void LbxCategories_Loaded(object sender, RoutedEventArgs e)
    {
        using (SqlConnection sqlCon = new SqlConnection(connectionString))
        {
            string query = "SELECT * FROM items ORDER BY itemID";

            sqlCon.Open();

            SqlCommand sqlCmd = new SqlCommand(query, sqlCon);

            SqlDataReader dr = sqlCmd.ExecuteReader();

            if(dr.HasRows)
            {
                while(dr.Read())
                {
                    Item newItem = new Item(Convert.ToInt32(dr[0]), dr[1].ToString(), dr[2].ToString(), dr[3].ToString(), Convert.ToDouble(dr[4]), dr[5].ToString(), dr[6].ToString());

                    allItems.Add(newItem);
                }

                if(allItems != null)
                {
                    var results = allItems.Select(x => x.Category).Distinct();

                    lbxCategories.ItemsSource = results;
                }
            }
            sqlCon.Close();
        }
    }

    private void LbxCategories_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        string selectedItem = lbxCategories.SelectedItem as string;

        var results = allItems.Select(x => x.ProductName).ToString();

        test.Text = results; // this is just to test and see if I can get any input which isn't gibberish

    }

Поэтому, когда я запускаю код, все идет гладко, пока Я нажимаю на элемент в списке, который дает мне

В середине я просто вставил текстовое поле, чтобы вывести ProductName на

Любая помощь очень ценится, поскольку я есть проекты, которые должны быть выполнены в течение нескольких дней, и вам нужно это убрать

1 Ответ

0 голосов
/ 17 апреля 2020

Я буду честен, было немного сложно понять, что вы пытались сделать с вашим кодом, но я думаю, что у меня есть. Взгляните на это:

private void LbxCategories_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems != null && e.AddedItems.Count > 0)
    {
        string selected = (string)e.AddedItems[0];
        string productName = (from i in allItems where i.Category == selected select i.ProductName).FirstOrDefault();
    }
}

Это даст вам ProductName первого Item, который имеет выбранную категорию. Если вы действительно хотите всех продуктов, соответствующих этой категории, то вы можете снять FirstOrDefault с конца, и это даст вам IEnumerable<String> всех соответствующих названий продуктов.

...