首页 > 解决方案 > 将新对象传递回主窗体时遇到问题 - C# .NET

问题描述

我是 C# 和 .NET 框架的新手。我正在尝试创建在主屏幕(MainNavigation)上显示为列表的巧克力订单数组。我有一个巧克力类和一个表单(form1),用户可以在其中选择哪种类型的巧克力和一个新的巧克力对象。我一直试图将新对象传递回主窗体,然后将其显示在主窗体的列表中。

MainNavigation 表单.... 我希望值是用户在 form1 中创建的订单。

using System;
using System.Windows.Forms;

namespace GatesCandyStore
{
    public partial class MainNavigation : Form
    {

        public MainNavigation()
        {
            InitializeComponent();
            Chocolate[] chocolates = new Chocolate[100];
            for (int runs = 0; runs < 100; runs++)
            {
                chocolates[runs] = value;
            }
        }

        private void btnProcessCandySelection_Click(object sender, EventArgs e)
        {
            string candy = comboBoxCandySelection.SelectedItem.ToString();
            Form1 aForm1 = new Form1(textBoxName.Text, candy);
            aForm1.ShowDialog();
        }
    }
}

用户创建新巧克力订单的 Form1.... Close(newChocolate); 不起作用。

using System;
using System.Windows.Forms;

namespace GatesCandyStore {
    public partial class Form1 : Form
    {
        Chocolate newChocolate = new Chocolate();
        public Form1(string name, string candy)
        {

            InitializeComponent();
            string str = name + " selected : ";
            label1.Text = str;
            Console.WriteLine(name + " selected : " + candy);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            newChocolate.Flavor = comboBoxChocolateSelection.SelectedItem.ToString();
            newChocolate.Cost = 12.5;
            newChocolate.GiftWrap = true;
            newChocolate.Quantity = 2;
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Close(newChocolate);
        }
    } }

巧克力班

namespace GatesCandyStore
{
    public class Chocolate
    {
        #region Fields
        public string flavor;
        public double cost;
        public bool giftWrap;
        public int quantity;

        #endregion End of Fields

        #region Constructors 
         public Chocolate(string flavor, double cost, bool giftWrap, int quantity)
         {
             Flavor = flavor;
             Cost = cost;
             GiftWrap = giftWrap;
             Quantity = quantity;
         }
         #endregion End of Constructors

         #region Properties
         public string Flavor { get; set; }
         public double Cost { get; set; }
         public bool GiftWrap { get; set; }
         public int Quantity { get; set; }
         #endregion End Properties


    }
}

标签: c#.netvisual-studio

解决方案


在您的问题中,我仍然不清楚您在做什么candy以及name在您Form1的构造函数中。

假设您知道自己在用它们做什么并主要关注“如何将新创建的对象传递回主窗体”,我建议您进行一些更正。

  • 创建模型类

        public delegate void ChocolateAddedEventHander(Chocolate newChocolate);
        public class Model
        {
            //An Event which will be raised when you add new chocolate
            public event ChocolateAddedEventHander ChocolateAdded;
    
            //If at any point of program you need whole list of added chocolates
            public List<Chocolate> ChocolateList = new List<Chocolate>();
            public void AddChocolateInList (Chocolate chocolate)
            {
                ChocolateList.Add(chocolate);
    
                if (ChocolateAdded != null)
                    ChocolateAdded(chocolate);
            }
        }
    

您的 Chocolate 课程将与您在此处显示的相同。

  • 进行以下更改Program.cs

    static void Main()
    {
        Model modelObj = new Model();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainNavigation(modelObj));
    }
    

正如您在上面的代码中看到的,现在MainNavigation正在接受一个Model类对象。

  • MainNavigation形式。

在您显示的代码中,您似乎在构造函数中做某事MainNavigation,如果数组Chocolate包含您可以m_modelObj.ChocolateList在那里使用的所有添加的巧克力。但因为我不清楚value那里有什么。我没有在我的答案中添加那部分。

        public partial class MainNavigation : Form
        {
            private Model m_modelObj;
            public MainNavigation(Model modelObj)
            {
                InitializeComponent();
                m_modelObj = modelObj;

                //subscribing an even of Model class, 
                //this will handle your logic what you want to perform on adding new Chocolate
                m_modelObj.ChocolateAdded += m_modelObj_ChocolateAdded;
            }

            void m_modelObj_ChocolateAdded(Chocolate newChocolate)
            {
                //perform your task what you want to do with newly added chocolate


                //if you want whole list of chocolates
                List<Chocolate> chocolateList = m_modelObj.ChocolateList;
            }

            private void btnProcessCandySelection_Click(object sender, EventArgs e)
            {
                string candy = comboBoxCandySelection.SelectedItem.ToString();
                Form1 aForm1 = new Form1(textBoxName.Text, candy, m_modelObj);
                aForm1.ShowDialog();
            }
        }

请注意,现在Form1将接受三个参数,第三个作为Model类的对象

  • Form1你在哪里添加巧克力。

    public partial class Form1 : Form
    {
        Model m_model;
        public Form1(string name, string candy, Model modelObj)
        {
            InitializeComponent();
    
            m_model = modelObj;
    
            //Not sure what you are doing here, but it will work
            string str = name + " selected : ";
            label1.Text = str;
            Console.WriteLine(name + " selected : " + candy);
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            //adding new chocolate to list;
            Chocolate newChocolate = new Chocolate(comboBoxChocolateSelection.SelectedItem.ToString(), 12.5, true, 2);
            m_model.AddChocolateInList(newChocolate);
            this.Close();
        }
    }
    

我还要建议一件事,类和成员的命名应该是正确的,这将有助于调试和代码审查。


推荐阅读