首页 > 解决方案 > 我应该将变量放在 Windows 窗体应用程序中的什么位置,而不必使其成为全局变量?

问题描述

我有一个困境!我不知道应该将变量放在 C# Windows 窗体应用程序中的什么位置。例如,在我的 WFA 项目中,我有一个名为“Item”的我自己的数据类型对象列表,目前我不得不将其设为全局,但是,我知道全局并不是最佳实践。因为我来自 C++ 背景,所以我总是在 int main() 中创建我的变量并将它们传递给需要的函数。老实说,我在任何地方都找不到答案。非常感谢任何可以帮助我的人。

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

namespace Sales_Calculator
{
 
    public partial class Form1 : Form
    {
        //Should my list<Item> go here or is there a better place for it?
        List<Item> objItems = new List<Item>();
        public Form1()
        {
            InitializeComponent();
        }
        public class Item
        {
            private string m_sItemName;
            private double m_dItemPrice;
            private int m_iQuantitySold;

            public Item(string sItemName, double dItemPrice, int iQuantitySold)
            {
                m_sItemName = sItemName;
                m_dItemPrice = dItemPrice;
                m_iQuantitySold = iQuantitySold;
            }
            public string Name
            {
                get { return m_sItemName; }
                set { m_sItemName = value; }
            }
            public int QuantitySold
            {
                get { return m_iQuantitySold; }
                set { m_iQuantitySold = value; }
            }
            public double Price
            {
                get { return m_dItemPrice; }
                set { m_dItemPrice = value; }
            }
        }
        bool DoesItemNameExist(string sName)
        {
            return (objItems.Find(delegate (Item objItem){return sName == objItem.Name;}) != null) ? true : false;
        }
        private Item HighestSellingItem()
        {
            int MaxQuantitySold = objItems.Max(objItem => objItem.QuantitySold);
            return objItems.Find(delegate (Item objItem) {
                return objItem.QuantitySold == MaxQuantitySold;
            });
        }
        private double Average()
        {
            int iTotal = 0;
            objItems.ForEach(delegate (Item objItem)
            {
                iTotal += objItem.QuantitySold;
            });
            double dAverage = iTotal / objItems.Count;
            return dAverage;
        }
        private void label1_Click(object sender, EventArgs e)
        {

        }
        private void AddToDataGridView(object sender)
        {
            dgvItems.Rows.Add(objItems.Count, objItems.Last().Name, objItems.Last().QuantitySold, objItems.Last().Price);
        }
        void ClearTextBoxes()
        {
            txtItemName.Clear();
            txtItemPrice.Clear();
            txtQuantitySold.Clear();
        }
        void AddItemToList()
        {
            
            string sItemName = "";
            if (DoesItemNameExist(sItemName = Convert.ToString(txtItemName.Text)))
            {
                MessageBox.Show("You can't have that name, it already exists!");
                txtItemName.Clear();
                return;
            }
            double dItemPrice = Convert.ToDouble(txtItemPrice.Text);
            int iQuantitySold = Convert.ToInt32(txtQuantitySold.Text);
            Item objItem = new Item(sItemName, dItemPrice, iQuantitySold);
            objItems.Add(objItem);
            MessageBox.Show("You have added an item!");
            ClearTextBoxes();
                
            
           
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
            AddItemToList();
            AddToDataGridView(sender);
            lblAverageQuantitySold.Text = Average().ToString();
            lblExistingItems.Text = objItems.Count.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("You have inputted incorrectly!", "Invalid", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            dvgHighestSellingItem.Rows.Clear();
            dvgHighestSellingItem.Rows.Add(HighestSellingItem().Name);
        }

        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
           

        }
    }
}

标签: c#winforms

解决方案


推荐阅读