我现在的工作是制作食谱书。食谱类具有名称和成分列表(Zutaten)作为属性。当我第一次创建配方并将其保存在配方列表中时,它具有正确的数据。 1)为什么当我进入下面的第二个代码部分来创建第二个配方时,第一个配方成分列表(Zutaten)被清空了? (我没有做任何改变食谱数据的事情) 2)为什么当我在配方列表中保存第二个配方时,第一个配方具有相同的第二个配方的成分列表?
public Rezept(String name, List<Zutaten> ingredient)
{
this.name = name;
this.ingredient = ingredient;
}
这是我的班级Rezept中的一个。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Verwaltung ve = new Verwaltung();
private List<Rezept> rezept = new List<Rezept>();
List<Zutaten> z = new List<Zutaten>();
String na;
Zutaten zutat;
int m;
private void buttonAdd_Click(object sender, EventArgs e)
{
z.Clear();
na = tBName.Text;
m = Convert.ToInt32(tBMenge.Text);
switch (comboBoxUnit.SelectedItem.ToString())
{
case ("Gramm"):
zutat = new Zutaten(na, m, Einheit.Gramm);
break;
case "Litre":
zutat = new Zutaten(na, m, Einheit.Litre);
break;
case "Stueck":
zutat = new Zutaten(na, m, Einheit.Stueck);
break;
}
z.Add(zutat);
ListViewItem item = new ListViewItem();
item.Text = na;
item.SubItems.Add(m.ToString());
switch (zutat.getEinheit)
{
case Einheit.Gramm:
item.SubItems.Add("Gramm");
break;
case Einheit.Litre:
item.SubItems.Add("Litre");
break;
case Einheit.Stueck:
item.SubItems.Add("Stueck");
break;
}
lVZutaten.Items.Add(item);
}
这就是我每次创建一个新的Zutaten列表的方法。并创建一个新的Rezept,我用这个方法
Rezept r = new Rezept(textBoxName.Text, z);
rezept.Add(r);
z是我在第二段代码中创建的Zutaten列表。
答案 0 :(得分:1)
因为您在两个实例中都使用相同的列表。
您有一个列表。每个配方中都会保存对该列表的引用。每次单击“添加”时,它都会清除列表并添加新项目。
根据您的评论,您有2个按钮,一个用于添加成分,另一个用于完成配方。你永远不应该清理(删除)成分列表。您应该在创建配方时创建新列表。
private List<Rezept> recipes = new List<Rezept>();
private List<Zutaten> ingredients = new List<Zutaten>();
private void AddIngredient()
{
var i = new Zutaten();
ingredients.Add(i);
}
private void AddRecipe()
{
var r = new Rezept("My Recipe", ingredients);
ingredients = new List<Zutaten>();
recipes.Add(r);
}
答案 1 :(得分:0)
您使Rezept的所有实例与z共享相同的引用。所以一旦你改变z,每个实例的成分也会改变。
在Rezept的构造函数中,尝试使用:
this.ingredient = ingredient.Clone();
而不是
this.ingredient = ingredient;
这可能会解决您的问题。