c# - 将新对象传递回主窗体时遇到问题 - 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
}
}
解决方案
在您的问题中,我仍然不清楚您在做什么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(); } }
我还要建议一件事,类和成员的命名应该是正确的,这将有助于调试和代码审查。
推荐阅读
- postgresql - PostrgreSql 数据库写/读统计
- excel - 使用excel在Word文档中添加表格
- bootstrap-4 - Bootstrap4 手风琴不工作。请检查我的代码
- java - FreeMarker 模板错误:JSONArray 包装到 febStringModel
- c++ - 无法在头文件中包含标头,但可以包含在 cpp 中
- r - 在 stargazer 中混合和匹配来自 multinom 模型的协变量
- postgresql - postgres 的默认密码
- angular - Angular如何正确获取类元素?
- python - 分配变量 Python 时出现语法错误
- css - 全局导入 scss 变量,可用于所有角度组件