С# checkbox/Radiobutton + textbox

116
22 августа 2021, 05:00

Нужно сделать так, чтобы пользователь выбирал товар и вводил количество, а ему выводилось сколько это будет стоить. Сделать это нужно с помощью checkbox/Radiobutton + textbox, язык только начала изучать, не могу сообразить как это сделать.

Answer 1

Допустим, что текущая строка перечня с товарами представлена следующими графическими элементами: label1 - наименование товара, textBox1 - цена, textBox2 - количество, textBox3 - стоимость, checkBox1 - для выбора этого товара. Добавим ниже перечня кнопку button1 (button1.Text = "Расчет стоимости покупки"). Для нажатой кнопки создадим обработчик события button1_Click:

private void button1_Click(object sender, EventArgs e) { 
   if (checkBox1.Checked) { 
      textBox3.Text = (Convert.ToInt32(textBox1.Text) * Convert.ToInt32(textBox2.Text)).ToString(); 
   } 
}

Теперь после нажатия кнопки button1 элемент textBox3 будет содержать расчетную стоимость покупки. Добавьте цикл по строкам перечня товаров для вычисления итоговой суммы по всем выбранным товарам.

Answer 2

Начнем с абстракции

public interface IProduct
{
    //наименование товара
    string Name { get; }
    //цена за 1 кг.
    decimal PricePerKg { get; }
    //вес товара в корзине
    double Weight { get; set; }
    //цена в корзине
    decimal PriceInCart { get; }
    //получение экземпляра для добавления в корзину
    IProduct GetProductToCart();
}

Теперь реализуем в классе Товара

public class Product : IProduct
{
    public string Name { get; }
    public decimal PricePerKg { get; }
    public decimal PriceInCart { get; private set; }
    public double Weight { get; set; }
    //ctor
    public Product(string name, decimal price)
    {
        if (string.IsNullOrEmpty(name))
            throw new ArgumentException(nameof(name));
        if (price <= 0)
            throw new ArgumentOutOfRangeException(nameof(price));
        Name = name;
        PricePerKg = price;
    }
    public IProduct GetProductToCart()
    {
        //создаем экземпляр с подобными свойствами
        var result = new Product(this.Name, this.PricePerKg);
        result.Weight = this.Weight;
        //вычисляем конечную цену
        result.PriceInCart = (decimal)Weight * PricePerKg;
        return result;
    }
}

Далее создадим форму и такой код в ней

public partial class MainForm : Form
{
    //Товары на прилавке
    Dictionary<string, IProduct> _products;
    public MainForm()
    {
        InitializeComponent();
        //Данные по товарам
        LoadProducts();
        //установка привязок
        SetBindings();
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Text = "Пример";
        //кнопки
        _buttonCalc.Click += ButtonCalc_Click;
        _buttonReset.Click += ButtonReset_Click;
    }
    //Создание коллекции продуктов
    private void LoadProducts()
    {
        _products = new Dictionary<string, IProduct>
        {
            { "apples", new Product("Яблоки", 76.25m) },
            { "plums", new Product("Сливы", 35.30m) },
            { "mandarins", new Product("Мандарины", 85.30m) },
            { "oranges", new Product("Апельсины", 105.40m) },
        };
    }
    //Установка привязок
    private void SetBindings()
    {
        //Яблоки
        //--надпись у чекбокса привязываем к названию товара
        _checkBoxApples.DataBindings.Add(nameof(CheckBox.Text), _products["apples"], nameof(IProduct.Name));
        //--текст лейбла привязываем к цене товара за кг.
        _labelApplePrice.DataBindings.Add(nameof(Label.Text), _products["apples"], nameof(IProduct.PricePerKg));
        //--текст текстбокса привязываем к весу товара
        _textBoxApples.DataBindings.Add(nameof(TextBox.Text), _products["apples"],
            nameof(IProduct.Weight), true, DataSourceUpdateMode.OnPropertyChanged);
        //--доступность текстбокса привязываем к включ. чекбокса
        _textBoxApples.DataBindings.Add(nameof(TextBox.Enabled), _checkBoxApples, nameof(CheckBox.Checked));
        //Сливы
        _checkBoxPlums.DataBindings.Add(nameof(CheckBox.Text), _products["plums"], nameof(IProduct.Name));
        _labelPlumsPrice.DataBindings.Add(nameof(Label.Text), _products["plums"], nameof(IProduct.PricePerKg));
        _textBoxPlums.DataBindings.Add(nameof(TextBox.Text), _products["plums"],
            nameof(IProduct.Weight), true, DataSourceUpdateMode.OnPropertyChanged);
        _textBoxPlums.DataBindings.Add(nameof(TextBox.Enabled), _checkBoxPlums, nameof(CheckBox.Checked));
        //Мандарины
        _checkBoxMandarins.DataBindings.Add(nameof(CheckBox.Text), _products["mandarins"], nameof(IProduct.Name));
        _labelMandarinsPrice.DataBindings.Add(nameof(Label.Text), _products["mandarins"], nameof(IProduct.PricePerKg));
        _textBoxMandarins.DataBindings.Add(nameof(TextBox.Text), _products["mandarins"],
            nameof(IProduct.Weight), true, DataSourceUpdateMode.OnPropertyChanged);
        _textBoxMandarins.DataBindings.Add(nameof(TextBox.Enabled), _checkBoxMandarins, nameof(CheckBox.Checked));
        //Апельсины
        _checkBoxOranges.DataBindings.Add(nameof(CheckBox.Text), _products["oranges"], nameof(IProduct.Name));
        _labelOrangesPrice.DataBindings.Add(nameof(Label.Text), _products["oranges"], nameof(IProduct.PricePerKg));
        _textBoxOranges.DataBindings.Add(nameof(TextBox.Text), _products["oranges"],
            nameof(IProduct.Weight), true, DataSourceUpdateMode.OnPropertyChanged);
        _textBoxOranges.DataBindings.Add(nameof(TextBox.Enabled), _checkBoxOranges, nameof(CheckBox.Checked));
    }
    //Кнопка "Итого"
    private void ButtonCalc_Click(object sender, EventArgs e)
    {
        //формируем список покупок
        List<IProduct> selectedProds = _products.Values
                                            .Where(p => p.Weight > 0)
                                            .Select(p => p.GetProductToCart())
                                            .ToList();
        //вычисляем итоговую стоимость
        decimal sum = selectedProds.Aggregate(0m, (acc, p) => acc + p.PriceInCart);
        //отображаем результаты
        ShowCart(selectedProds, sum);
    }
    //Кнопка "Сбросить"
    private void ButtonReset_Click(object sender, EventArgs e)
    {
        //итог
        _labelCartProducts.Text = String.Empty;
        //обнуляем вес у всех товаров
        _groupBoxProducts.Controls
                                .OfType<TextBox>()
                                .ToList()
                                .ForEach(tb => tb.Text = "0");
        //выключаем чекбоксы
        _groupBoxProducts.Controls
                                .OfType<CheckBox>()
                                .ToList()
                                .ForEach(c => c.Checked = false);
    }
    //Отображение итога
    private void ShowCart(List<IProduct> selectedProds, decimal sum)
    {
        var sb = new StringBuilder();
        sb.AppendLine("Ваши покупки:");
        sb.AppendLine();
        //товары
        int count = 0;
        selectedProds.ForEach(p =>
            sb.AppendLine($"{++count}) {p.Name} ({p.Weight} кг.) {p.PriceInCart}"));
        //сумма
        sb.AppendLine();
        sb.AppendLine($"Итого: {sum}");
        _labelCartProducts.Text = sb.ToString();
    }
}

Пример целиком находится здесь

READ ALSO
Перестарался с исключениями

Перестарался с исключениями

Всё работало, а теперь перестало, как добавил try

82
Отслеживание вызова функций C#

Отслеживание вызова функций C#

При вызове функций необходимо выполнять запись в базу действияФункции все разнородные, т

80
Подключение к базе Oracle через C#

Подключение к базе Oracle через C#

Совсем еще новичокДелаю программу по туториалу

98