You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms数独游戏:列表无法添加新元素的问题排查

问题排查与修复方案

核心问题1:窗体引用被覆盖

Form2的Form2_Load事件中,你重新创建了一个新的Form1实例,这会覆盖Form1传递过来的主窗体引用。导致后续操作的是一个隐藏的新Form1,而非用户实际看到的主菜单窗体,因此listBox1不会更新。

核心问题2:排行榜列表添加逻辑错误

嵌套foreach循环会把每个玩家和所有分数进行组合,导致重复生成条目(比如2个玩家+2个分数会生成4条记录),正确逻辑应该是玩家与分数一一对应。

修复后的代码

Form1 修改后代码

public partial class Form1 : Form
{
    public Form2 frm2;
    
    public Form1()
    {
        InitializeComponent(); 
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // 避免添加空玩家名称
        if (!string.IsNullOrWhiteSpace(textBox1.Text))
        {
            frm2.players.Add(textBox1.Text);
            textBox1.Text = "";
            frm2.Show();
            this.Hide();
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {  
        frm2 = new Form2();
        frm2.frm1 = this;     
    }
}

Form2 修改后代码

public partial class Form2 : Form
{
    public Form1 frm1;
    int s;
    public List<string> players = new List<string>(5);
    public List<int> score = new List<int>(5);

    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        // 移除新建Form1的代码,保留Form1传递的原引用
        s = 0;
        timer1.Start();
        label1.Text = Convert.ToString(s);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        timer1.Stop();
        label1.Text = " ";
        MessageBox.Show("Верно!");
        score.Add(GetScoreForLevel());
        
        // 更新主窗体排行榜
        frm1.listBox1.BeginUpdate();
        frm1.listBox1.Items.Clear(); // 清空旧条目,避免重复显示
        // 玩家与分数一一对应添加
        foreach (var pair in players.Zip(score, (player, sc) => $"{player} {sc}"))
        {
            frm1.listBox1.Items.Add(pair);
        }
        frm1.listBox1.EndUpdate();
        
        this.Close();
        frm1.Show(); // 关闭游戏窗体后返回主菜单
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        s = s + 1;
        label1.Text = Convert.ToString(s);
    }

    private int GetScoreForLevel()
    {
        return s;
    }
}

额外优化点

  • 输入验证:避免添加空玩家名称,提升体验。
  • 排行榜清空:每次更新前清空列表,防止重复显示历史数据。
  • 窗体切换:关闭游戏窗体后自动显示主菜单,流程更顺畅。

内容的提问来源于stack exchange,提问作者nekzin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:05:22