我在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();
}
答案 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
}