【问题标题】:How can I access variables of a class, which is in a form, from another form?如何从另一个表单访问一个表单中的类的变量?
【发布时间】:2018-08-12 21:09:25
【问题描述】:

第一个表单的代码(主菜单):

public partial class MainMenu : Form
{
    public class Player
    {
        public string name, curWeapon, wpn1, wpn2, wpn3, wpn4,  wpn5, curArmor, arm1,
                      arm2, arm3, arm4, arm5, activeQuest, curPlace, Gurgonauth = "Gurgonauth",
                      Klebbetoth, Shalthazaar, Khurx, dungeon, dunEnemy, dun1, dun2; 
        public int dmg, armor, maxArmor, strength, endurance, accuracy, luck, hp, maxHp,
                   xp, xpmax, lvl, gold, bank, monstersKilled;
    }

    private void Form1_Load(object sender, EventArgs e) => name.MaxLength = 15;

    public void button1_Click(object sender, EventArgs e)
    {
        var p       = new Player();
        p.name      = name.Text;
        p.hp        = 100;
        p.maxHp     = 100;
        p.gold      = 0;
        p.lvl       = 1;
        p.strength  = 0;
        p.luck      = 0;
        p.xp        = 0;
        p.xpmax     = 100;
        p.curWeapon = "Bare Hands";
        p.curPlace  = p.Gurgonauth;
        p.endurance = 0;
        p.dmg       = 5;
        p.curArmor  = "None";
        p.monstersKilled = 0;
        Overview ovr = new Overview(p);
        ovr.Show(this);
        this.Hide();
    }
}

第二种形式的代码(概述):

 public partial class Overview : Form
 {
     var p = new MainMenu.Player();
     public Overview(MainMenu.Player p)
     {
         InitializeComponent();
         name.Text   += p.name;
         hp.Text     += p.hp.ToString();
         xp.Text     += p.xp.ToString() + "/" + p.xpmax.ToString();
         level.Text  += p.lvl.ToString();
         curWpn.Text += p.curWeapon;
         curArm.Text += p.curArmor;
         gold.Text   += p.gold.ToString();          
    } // It does what I want it to do

    private void Overview_FormClosing(object sender, FormClosingEventArgs e) => Application.Exit();
    public void button1_Click(object sender, EventArgs e) => p.gold += 10; // Shouldn't this work?
}

问题在于第二种形式的代码(概述)。正如您从我的 cmets 中看到的那样,它完成了我想要它做的事情,但是 p.gold += 10 不起作用。为什么它不起作用?我不明白为什么它不起作用。我应该写什么才能让它发挥作用?

【问题讨论】:

  • 你的意思是不起作用?
  • “不起作用”必须是报告问题的最烦人和无益的方式。尝试指定预期和实际结果。
  • “不起作用”是什么意思?当你运行你的程序时会发生什么?你想让它做什么不同的事情?
  • “我预计它会增加金币的价值(在 Player 类中)。”不,不是。 gold 的值保存在类的 instance 中,也称为对象。也许问题在于您将两者混淆了。我向您保证'p.gold +=10“有效”,因为它确实会将p.gold 的值增加10,无论p 代表什么实例。

标签: c#


【解决方案1】:

这主要是因为p 这里是一个空实例,如下面的代码

MainMenu.Player p = new MainMenu.Player();

您可能只想像这样分配它

 MainMenu.Player p = null;
 public Overview(MainMenu.Player p)
 {
     InitializeComponent();
     this.p = p;           // initialize here
     name.Text += p.name;
     hp.Text += p.hp.ToString();
     xp.Text += p.xp.ToString() + "/" + p.xpmax.ToString();
     level.Text += p.lvl.ToString();
     curWpn.Text += p.curWeapon;
     curArm.Text += p.curArmor;
     gold.Text += p.gold.ToString();          
}

顺便说一句,您应该考虑将 Person 类重构为一个单独的文件,而不是在表单中定义它

【讨论】:

  • 嗯,我想你没有阅读我代码中的 cmets。这段代码完美运行。下段代码有问题。
  • @LoadGame 如果该作品完美运行,那么您不应该发布它。它让我们感到困惑,我们最终会阅读与问题无关的东西。您可以使用 sharplab.io 将代码编辑为尽可能少,以便我们可以复制问题并为您提供帮助。例如,您是否真的需要包含所有 40 个变量,或者您是否可以仅使用一个变量来重复问题? (你只需要一个)。此外,一个类的变量太多了。您应该重构为更小的类和结构。
  • @LoadGame 拉胡尔回答的重要内容是this.p = p; // initialize here。这将解决您的问题。原因很简单,var p = new MainMenu.Player(); 中的ppublic Overview(MainMenu.Player p) 中的p 没有关系,因此您必须将一个分配给另一个,以便它们都指向同一个实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2013-03-20
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2020-11-24
相关资源
最近更新 更多