Попытка создать корзину в форме windows c#. В частности, добавление новой строки в datagridview нажатием кнопки в другой форме - PullRequest
0 голосов
/ 07 августа 2020

здесь супер новичок.

Я пытаюсь создать функцию корзины покупок в Windows форме C#

У меня есть форма под названием Shopping_Cart с именем datagridview cartlist.

, и у меня есть отдельная форма, содержащая мои продукты под названием Meat, которая содержит кнопку для добавления в корзину под каждым из продуктов с текстовым полем BeefQty для количества.

Кстати, страницы Shopping_Cart и Meat открываются с помощью кнопки на боковой панели и выводятся на передний план в назначенном месте в окне, поэтому мое приложение в основном работает в одном окне.

Я хочу сделать следующее: когда я нажимаю кнопку добавления, он добавляет строку в cartlist в другой форме без необходимости открывать Shopping_Cart в новом окне.

Все Решения, которые я искал до сих пор, включают открытие экземпляра другой формы нажатия кнопки, которую я не хочу делать.

То, что я пробовал.

В форме Meat

private void AddBeefBtn_Click(object sender, EventArgs e)
        {
            cartlist.ColumnCount = 3;
            cartlist.Columns[0].Name = "Item";
            cartlist.Columns[1].Name = "Quantity";
            cartlist.Columns[2].Name = "Price";

            string[] row = new string[] { "Beef", "BeefQty.text", "10*BeefQty.text" };
            cartlist.Rows.Add(row);
        }

Это дало мне ошибку, говоря, что CS0103 : The name 'cartlist' does not exist in the current context wh ich я не понимаю, так как список корзины существует в форме Shopping_Cart.

Обратите внимание, что у меня абсолютно нулевой опыт работы с формами C# и Windows, и что меня не волнует OOP концепции прямо сейчас, и я просто хочу, чтобы приложение работало так, как должно.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 07 августа 2020

Судя по вашей информации, причина того, что вы получаете CS0103 : The name 'cartlist' does not exist in the current, связана с тем, что cartlist существует в Shopping_Cart, но не в Meat. Они не разделяют cartlist, отсюда и ошибка.

Самый простой способ решить эту проблему - создать BindingList в общем классе и привязать этот список к источнику данных cartlist.

Учитывая

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace Test
{
    // Model to use to fill the rows of the DataGridView
    public class ItemModel : INotifyPropertyChanged
    {
        private string item;
        private decimal qty, price;

        public string Item
        {
            get => item;
            set { item = value; OnPropertyChanged(); }
        }

        public decimal Quantity
        {
            get => qty;
            set { qty = value; OnPropertyChanged(); }
        }

        public decimal Price
        {
            get => price;
            set { price = value; OnPropertyChanged(); }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        
        // This is to notify the grid if any of the properties are updated
        private void OnPropertyChanged([CallerMemberName] string name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

Мы можем создать общий класс, подобный этому, для хранения BindingList:

using System.ComponentModel;

namespace Test
{
    public static class SharedData
    {
        public static BindingList<ItemModel> Items { get; set; } = new BindingList<ItemModel>();
    }
}

Отсюда мы бы настройте форму с DataGridView вот так:

using System;
using System.Windows.Forms;

namespace Test
{
    public partial class ShoppingCart : Form
    {
        public ShoppingCart()
        {
            InitializeComponent();
            
            // Note how we are calling SharedData here
            ItemDataGridView.DataSource = SharedData.Items;
        }
    }
}

И мы можем добавить к BindingList как:

using System;
using System.Windows.Forms;

namespace Test
{
    public partial class Meat : Form
    {
        public Meat()
        {
            InitializeComponent();
        }

        private void AddBeefBtn_Click(object sender, EventArgs e)
        {
            ItemModel model = new ItemModel
            {
                Item = "Beef",
                Quantity = 10M,
                Price = 9.95M,
            };

            SharedData.Items.Add(model);
        }
    }
} 

Вывод

Windows Форма вывода кода выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...