1

谁能告诉我为什么这无济于事?pcNameLabel.Text应该在StatTransfer()被调用时更改为 bob FighterButtonClick。根据调试器,一切正常。

我已经取出了一些额外的变量和与手头问题无关的东西。

public partial class MainForm : Form
    {
        public static string VariableLabel1;
        public static string Variable2;

        Random _r = new Random();

        public MainForm()
        {
            InitializeComponent();          
        }

        void CLoop()
        {
            while(true)
            {
                SetInfo();
            }
        }

        public void SetInfo()
        {
            this.pcNameLabel.Text = VariableLabel1;
        }

        void ChClassButtClick(object sender, EventArgs e)
        {
            CharStats form = new CharStats();
            form.Show();
        }
    }

这是一个单独的窗口窗体窗口。

public partial class CharStats : Form
    {
        public CharStats()
        {
            InitializeComponent();
        }

        void StatTransfer()
        {
            MainForm Mform = new MainForm();
            MainForm.VariableLabel1 = "Bob";
            Mform.SetInfo();
        }

        void FighterButtonClick(object sender, EventArgs e)
        {
            Fighter();
            StatTransfer();
        }
    }
4

2 回答 2

3

在这些行中

void StatTransfer()
{
   // This is a new instance of MainForm, not the original one
   MainForm Mform = new MainForm();
   MainForm.VariableLabel1 = "Bob";
   Mform.SetInfo();
}

您创建 MainForm 的一个新实例,并且该实例永远不会显示。此隐藏实例包含您尝试更改的标签,但您看不到它。

该问题的最简单解决方法是在初始化时将调用实例传递MainForm给表单CharStats

void ChClassButtClick(object sender, EventArgs e)
{
     CharStats form = new CharStats(this);
     form.Show();
}

现在您应该更改构造函数CharStats以接收传递的实例并将其保存在 CharStats 类中的全局变量中

public partial class CharStats : Form
{
    private MainForm _callingForm;
    public CharStats(MainForm callingForm)
    {
        InitializeComponent();
        _callingForm = callingForm;
    }
    .....

并在需要的地方使用这个保存的实例

    void StatTransfer()
    {
        _callingForm.VariableLabel1 = "Bob";
        callingForm.SetInfo();
    }
}

编辑顺便说一句,你不需要使用静态变量来工作。只需更改方法 MainForm.SetInfo 以接收字符串并在调用时传递 Bob

 public void SetInfo(string newText)
 {
        this.pcNameLabel.Text = newText;
 }

来自 CharStats

void StatTransfer()
{
    callingForm.SetInfo("Bob");
}
于 2013-09-05T20:16:48.353 回答
0

MainForm is not set to display anywhere. I believe you want to add it to your CharStats form like so:

void StatTransfer()
{
    MainForm Mform = new MainForm();
    MainForm.VariableLabel1 = "Bob";
    Mform.SetInfo();
    this.Controls.Add(Mform);
}
于 2013-09-05T20:18:55.783 回答