向List添加新对象将替换List

时间:2018-05-08 22:36:47

标签: c# winforms

我在C#中使用Windows Forms,我有一个Character对象,它是从一个表单的用户输入生成的,然后通过自定义事件处理程序传回主表单。

然后将新对象添加到主窗体上的List中。但是,当新项目添加到主窗体上的列表中时,它还会替换列表中的所有其他项目,因此我最终会得到所有相同对象的列表。

这是我尝试将新对象添加到列表中的代码。

private void HandleCharacterCreated(object sender, EventArgs e)
{
    CharCreatorForm extractForm = sender as CharCreatorForm;
    characterList.Add(extractForm.NewCharacter);

    Debug.WriteLine("NEW LINE");
    foreach (Character character in characterList)
    {
        Debug.WriteLine(character);
    }

    SetCharacterCountValue();

    if (CharacterAdded != null)
    {
        CharacterAdded(this, new EventArgs());
    }
}

如果有帮助,这里是输入表单中的代码块,然后传回到主表单以添加到列表中。

public void CreateCharacter()
{
    newCharacter.Name = nameTextBox.Text;
    newCharacter.Level = levelPicker.Value;
    newCharacter.Race = racePicker.Text;
    newCharacter.Class = classPicker.Text;

    if (goodRadioBtn.Checked == true && evilRadioBtn.Checked == false)
    {
        newCharacter.Alignment = 1;
    }
    else if(evilRadioBtn.Checked == true && goodRadioBtn.Checked == false)
    {
        newCharacter.Alignment = 2;
    }

    newCharacter.ImageIndex = classPicker.SelectedIndex;

    if (CharacterCreated != null)
    {
        CharacterCreated(this, new EventArgs());
    }

    ClearFields();
}

1 个答案:

答案 0 :(得分:2)

CreateCharacter()并没有新建一个新角色,而只是在现有对象上设置新的属性值。

由于class个对象是引用对象,因此您要添加相同的"引用"一遍又一遍地对你的列表进行改变,并且每次改变(更改属性)指针所指向的内存中的单个对象。

简单的解决方法是在CreateCharacter()方法中创建一个新角色:

public void CreateCharacter()
{
    newCharacter = new Character();  //  <-- here.
    newCharacter.Name = nameTextBox.Text;
    newCharacter.Level = levelPicker.Value;
    newCharacter.Race = racePicker.Text;
    newCharacter.Class = classPicker.Text;

    // ... etc
}