请记住,这个问题可能是初学者错误的结果。
我的程序中有4个类与此问题相关。
主窗体:直接在类中声明并启动对象currentRecipe(使用类配方)和recipeMngr(使用类recipeManager)。 currentRecipe(Recipe)有几个从用户输入中收集的字段,这些字段包括从按下按钮时打开的另一种形式的属性中收集的数组成分[]。 currentRecipe稍后用于"添加配方按钮"按下并且因为它在这两种方法中使用,所以对象currentRecipe需要在我理解的这些方法之外进行初始化。
RecipeManager:保存一个存储配方的数组。以及管理将配方添加到数组中的方法。此方法将currentRecipe作为主窗体的属性。
食谱:保留食谱的模板。
FormIngredients:从用户收集成分并将其存储在财产中。
然而,问题。在recipeManager中的数组中存储配方时,最新存储的数组只是复制,因此列表中所有先前分配的项都将获得新值。结果
食谱[0] =华夫饼
食谱[1] =
...
添加新内容时会变为
食谱[0] =馅饼
食谱[1] =馅饼 ...
什么时候应该
食谱[0] =华夫饼
食谱[1] =馅饼
...
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitializeGUI();
}
private const int maxRecipe = 20;
private const int maxIngredients = 50;
private static Recipe currentRecipe = new Recipe(maxIngredients);
private static RecipeManager recipeMngr = new RecipeManager(maxRecipe);
private void btnAddIngredients_Click(object sender, EventArgs e)
{
FormIngredients FormI = new FormIngredients(currentRecipe);
var result = FormI.ShowDialog();//show ingredient form
if (result == DialogResult.OK) {
currentRecipe = FormI.recipe;
lblIngredAmount.Text = "Ingredients: " + currentRecipe.ingredientsAmounts().ToString();
}
}
private void AddRecipe(Recipe scurrentRecipe) {
scurrentRecipe.rName = tbxName.Text;
scurrentRecipe.rDescription = tbxDescription.Text;
scurrentRecipe.rCategory = (FoodCategories)cbxCategory.SelectedIndex;
bool valid = checkIfValid();
if (valid)
{
recipeMngr.Add(scurrentRecipe);
updateGUI();
SimpleInitializeGUI();
}
else
{
MessageBox.Show("Please fill all the fields (or add atleast one ingredient)", "Stop");
}
}
我已经从主要表单添加了最重要的部分,知道问题来自哪里。
我想补充一点,当将currentRecipe的初始化移动到" addRecipe click" -method时,问题就消失了。但是这会产生很多新问题,代码应该像这样构建。
我不使用任何循环来填充数组。
答案 0 :(得分:0)
说明: 类是引用类型。如果您查看已发布的原始代码,则currentRecipe仅实例化一次。每次更改scurrentRecipe / currentRecipe变量的值时,您只是更改该对象。如果您需要多个对象,则可以使用new关键字多次创建它们。
更新了代码,以便您明确:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitializeGUI();
}
private const int maxRecipe = 20;
private const int maxIngredients = 50;
private static Recipe currentRecipe = new Recipe(maxIngredients);
private static RecipeManager recipeMngr = new RecipeManager(maxRecipe);
private void btnAddIngredients_Click(object sender, EventArgs e)
{
FormIngredients FormI = new FormIngredients(currentRecipe);
var result = FormI.ShowDialog();//show ingredient form
if (result == DialogResult.OK) {
currentRecipe = FormI.recipe;
lblIngredAmount.Text = "Ingredients: " + currentRecipe.ingredientsAmounts().ToString();
}
}
private void AddRecipe() {
scurrentRecipe = new Recipe(maxIngredients);
scurrentRecipe.rName = tbxName.Text;
scurrentRecipe.rDescription = tbxDescription.Text;
scurrentRecipe.rCategory = (FoodCategories)cbxCategory.SelectedIndex;
bool valid = checkIfValid();
if (valid)
{
recipeMngr.Add(scurrentRecipe);
updateGUI();
SimpleInitializeGUI();
currentRecipe = scurrentRecipe();
}
else
{
MessageBox.Show("Please fill all the fields (or add atleast one ingredient)", "Stop");
}
}