C# Windows Forms向List添加新对象时覆盖所有已有对象问题求助
解决C# WinForms中添加Character对象到List时重复覆盖的问题
嘿,这问题我见太多了——十有八九是你重复使用了同一个Character对象实例,而不是每次创建新的!
问题根源
如果你的子表单里,Character对象是类级别的成员字段(比如在子表单类顶部声明了private Character _myCharacter;),每次用户输入后只是更新这个对象的属性,再通过事件传回主表单,那主表单的List里存的全是同一个对象的引用。因为类是引用类型,List里的每个元素都指向内存里的同一个对象,最后你看到的自然全是最后一次修改的那个对象。
快速解决方案
在子表单的提交逻辑里,每次都创建新的Character实例,而不是复用旧的。举个例子:
子表单的提交按钮事件代码
private void btnCreateCharacter_Click(object sender, EventArgs e) { // 关键:每次点击都new一个新的Character var newChar = new Character { Name = txtCharacterName.Text, Class = cboClass.SelectedItem.ToString(), Level = int.Parse(txtLevel.Text) // 其他属性根据输入赋值 }; // 触发自定义事件,把新对象传出去 OnCharacterCreated(new CharacterEventArgs(newChar)); } // 自定义事件(假设你已经定义了CharacterEventArgs) public event EventHandler<CharacterEventArgs> CharacterCreated; protected virtual void OnCharacterCreated(CharacterEventArgs e) { CharacterCreated?.Invoke(this, e); }
主表单的事件处理代码
private List<Character> _characterList = new List<Character>(); // 主表单初始化时绑定子表单的事件 private void OpenSubForm() { var subForm = new CharacterCreationForm(); subForm.CharacterCreated += SubForm_CharacterCreated; subForm.ShowDialog(); } private void SubForm_CharacterCreated(object sender, CharacterEventArgs e) { // 直接添加传来的新对象,现在每个元素都是独立的引用 _characterList.Add(e.NewCharacter); // 这里可以刷新UI,比如更新DataGridView或者ListBox }
额外检查项
- 确认你的
Character是类(引用类型),如果是struct值类型的话不会出现这个问题,但角色类一般都是class。 - 主表单里的List要确保是每次初始化新的实例,比如
_characterList = new List<Character>();,而不是复用其他地方的List引用。 - 检查子表单里有没有在其他地方复用同一个Character对象,比如在构造函数里初始化后就一直用它。
这样改完,你每次添加的都是独立的Character对象,List里就不会全是重复的内容啦!
内容的提问来源于stack exchange,提问作者John Mack




