You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动