Попытка отобразить элементы из класса на основе ввода от пользователя - PullRequest
0 голосов
/ 02 февраля 2020

Продолжение Я заново добавляю разделы этого кода как I go, так как это позволяет мне работать и выявлять ошибки в блоках, что гораздо проще, чем смотреть на все это. Попытка заставить функцию выполняться на дисплее enter_click 2 не отображается и зависает. Таким образом, один дисплей menu показывает меню из класса Items, Disp интегрирован с клавиатурой в том смысле, что он показывает только нажатые цифры / кнопки. На дополнительном дисплее Disp2 должно отображаться имя элемента на основе нажатия кнопки (что enter image description here показано в текстовом поле) Использование MVS 2010 Вот код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace test
{
    public partial class Form1 : Form
    {
        List<Items> STOCK = new List<Items>();

        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, EventArgs e)
        {


            this.STOCK = new List<Items>
           {
            new Items{ id = 1, Name = "Bun", Price = 100},
            new Items{ id = 2, Name = "Soda", Price = 80},
            new Items{ id = 3, Name = "Cheese", Price =70},
            new Items{ id = 4, Name = "Tissue", Price = 50},
            new Items{ id = 5, Name = "Fabuloso", Price = 140},
            new Items{ id = 6, Name = "Grace Mackerel", Price = 90},
            new Items{ id = 7, Name = "Rice", Price = 50},
            new Items{ id = 8, Name = "Flour", Price = 40},
            new Items{ id = 9, Name = "Sugar", Price = 30},
           };
        }

        public class Items
        {
            public int id { get; set; }
            public string Name { get; set; }
            public decimal Price { get; set; }
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            StringBuilder strBuilder = new StringBuilder();
            STOCK.ForEach(x => strBuilder.Append(string.Format("ID {0} - Name: {1} Price: {2:C2}", x.id, x.Name, x.Price)));
            menu.Text = menu.Text + strBuilder.ToString();
        }

        private void button_Click(object sender, EventArgs e)
        {
            Button B = (Button)sender;
            Disp.Text = Disp.Text + B.Text;
        }


        private void Enter_Click(object sender, EventArgs e)
        {
         do
            {
                var STOCKDict = STOCK.ToDictionary(i => i.id);

                var selecteditems = new List<Items>();
                if (Disp.Text == "00")
                {
                    break;
                }
                int id;
                if (!int.TryParse(Disp.Text, out id))
                {
                    Disp2.Text = ("Enter number or '00' ");
                    continue;
                }
                if (STOCKDict.ContainsKey(id))
                {
                    var item = STOCKDict[id];
                    selecteditems.Add(item);
                    Disp2.Text = (item.Name);
                }
                else
                {
                    Disp2.Text = (id + " is not available");
                }
            } while (true);
        }
    }
}

1 Ответ

0 голосов
/ 02 февраля 2020

Проблема в вашем do {} while (true) l oop, особенно в следующем фрагменте:

if (!int.TryParse(Disp.Text, out id))
{
    Disp2.Text = ("Enter number or '00' ");
    continue;
}

В вашем l oop вы проверяете следующее условие:

int.TryParse(Disp.Text, out id)

Но внутри вашего l oop это условие никогда не меняется (Disp.Text всегда один и тот же), и поэтому существует по крайней мере один возможный случай, когда l oop никогда не останавливается.

Вы может заменить «продолжить» на «перерыв»:

if (!int.TryParse(Disp.Text, out id))
{
    Disp2.Text = ("Enter number or '00' ");
    break;
}

Я не совсем уверен, что на самом деле вы пытаетесь выполнить sh, но, похоже, вам также следует заменить:

{
    Disp2.Text = (id + " is not available");
}

with:

{
    Disp2.Text = (id + " is not available");
    break;
}

Однако, поскольку Disp.Text не изменяется и STOCKDict может иметь только одну запись с уникальным ключом do /, в то время как l oop не требуется вообще и следующий код будет делать работу, не сталкиваясь с бесконечным l oop:

List<Items>() selecteditems = new List<Items>();

private void Enter_Click(object sender, EventArgs e)
{
    var STOCKDict = STOCK.ToDictionary(x => x.id);
    int id;
    if (!int.TryParse(Disp.Text, out id))
    {
        Disp2.Text = ("Enter number or '00' ");
    }
    else
    {
        if (STOCKDict.ContainsKey(id))
        {
            var item = STOCKDict[id];
            selecteditems.Add(item);
            Disp2.Text = (item.Name);
        }
        else
        {
            Disp2.Text = (id + " is not available");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...