C#中如何从另一个窗体访问同一个对象?
在另一个窗体中显示Player实例的字段值
下面提供几种简单直接的实现方式:
方法一:通过构造函数传递Player实例
给第二个窗体(比如命名为GameForm)添加接收Player参数的构造函数,打开窗体时直接传入实例:
- 修改第二个窗体的代码:
public partial class GameForm : Form { public GameForm(Player player1, Player player2) { InitializeComponent(); // 直接给标签赋值 labelPlayer1Name.Text = player1.Name; labelPlayer1Symbol.Text = player1.Symbol; labelPlayer2Name.Text = player2.Name; labelPlayer2Symbol.Text = player2.Symbol; } }
- 在
FormStart中打开第二个窗体的代码:
// 创建Player实例后 Player player1 = new Player(textBoxPlayer1.Text, labelChar1.Text); Player player2 = new Player(textBoxPlayer2.Text, labelChar2.Text); // 打开第二个窗体并传入实例 GameForm gameForm = new GameForm(player1, player2); gameForm.Show();
方法二:通过公共属性传递
如果需要在窗体创建完成后再设置Player实例,可以给第二个窗体添加公共属性:
- 第二个窗体代码:
public partial class GameForm : Form { // 定义公共属性 public Player Player1 { get; set; } public Player Player2 { get; set; } public GameForm() { InitializeComponent(); } // 在窗体加载事件中给标签赋值 private void GameForm_Load(object sender, EventArgs e) { if (Player1 != null) { labelPlayer1Name.Text = Player1.Name; labelPlayer1Symbol.Text = Player1.Symbol; } if (Player2 != null) { labelPlayer2Name.Text = Player2.Name; labelPlayer2Symbol.Text = Player2.Symbol; } } }
FormStart中的调用代码:
Player player1 = new Player(textBoxPlayer1.Text, labelChar1.Text); Player player2 = new Player(textBoxPlayer2.Text, labelChar2.Text); GameForm gameForm = new GameForm(); gameForm.Player1 = player1; gameForm.Player2 = player2; gameForm.Show();
方法三:通过静态类共享(适合全局场景)
如果多个窗体都需要访问这些Player实例,可以创建静态类来存储:
- 创建静态类:
public static class GameData { public static Player Player1 { get; set; } public static Player Player2 { get; set; } }
FormStart中赋值:
GameData.Player1 = new Player(textBoxPlayer1.Text, labelChar1.Text); GameData.Player2 = new Player(textBoxPlayer2.Text, labelChar2.Text);
- 第二个窗体中访问:
private void GameForm_Load(object sender, EventArgs e) { labelPlayer1Name.Text = GameData.Player1.Name; labelPlayer1Symbol.Text = GameData.Player1.Symbol; labelPlayer2Name.Text = GameData.Player2.Name; labelPlayer2Symbol.Text = GameData.Player2.Symbol; }
注意:静态类的方式适合小型场景,复杂项目中要注意线程安全和实例生命周期的问题。
内容的提问来源于stack exchange,提问作者zaraboy
相关产品推荐
相关产品推荐

