C# 向列表中添加新对象将替换列表中的所有其他对象
我正在用C#处理Windows窗体,我有一个Character对象,它是从一个窗体的用户输入生成的,然后通过自定义事件处理程序传递回主窗体 然后将新对象添加到主窗体上的列表中。但是,当一个新项目添加到主窗体的列表中时,它也会替换列表中的所有其他项目,因此我最终得到一个包含所有相同对象的列表 下面是我试图将新对象添加到列表中的代码C# 向列表中添加新对象将替换列表中的所有其他对象,c#,winforms,C#,Winforms,我正在用C#处理Windows窗体,我有一个Character对象,它是从一个窗体的用户输入生成的,然后通过自定义事件处理程序传递回主窗体 然后将新对象添加到主窗体上的列表中。但是,当一个新项目添加到主窗体的列表中时,它也会替换列表中的所有其他项目,因此我最终得到一个包含所有相同对象的列表 下面是我试图将新对象添加到列表中的代码 private void HandleCharacterCreated(object sender, EventArgs e) { CharCreatorFor
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();
}
如果有帮助,下面是输入表单中的代码块,然后将其传递回要添加到列表中的主表单
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();
}
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
}
public void CreateCharacter()
{
newCharacter=new Character();//newCharacter变量是全局变量吗?如果是,您正在覆盖引用变量,并且它不是错误,而是功能,请尝试创建新的“newCharacter”object就是这样!我简直不敢相信我错过了这么简单的东西。谢谢!@JohnMack:我怀疑与其按照这个答案添加构造函数调用,不如删除newCharacter
字段,而只是在CreateCharacter
方法中使用一个局部变量。