首页 > 解决方案 > 将新对象添加到列表会替换列表中的所有其他对象

问题描述

我正在使用 C# 中的 Windows 窗体,并且我有一个 Character 对象,该对象是从一个窗体的用户输入生成的,然后通过自定义事件处理程序传递回主窗体。

然后将新对象添加到主窗体上的列表中。然而,当一个新项目被添加到主窗体的列表中时,它也会替换列表中的所有其他项目,所以我最终得到了一个包含所有相同对象的列表。

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

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();
}

标签: c#winforms

解决方案


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
}

推荐阅读