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
相关产品推荐
相关产品推荐

