没有错误,标签似乎应该更改为指示的文本,但事实并非如此

本文关键字:指示 文本 并非如此 事实 标签 有错误 | 更新日期: 2023-09-27 18:30:16

谁能告诉我为什么这什么都不做? 当StatTransfer()FighterButtonClick调用时,pcNameLabel.Text应该更改为鲍勃。根据调试器,一切正常。

我删除了一些额外的变量和与手头问题无关的东西。

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();
        }
    }

没有错误,标签似乎应该更改为指示的文本,但事实并非如此

在这些行中

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");
}
MainForm

设置为在任何地方显示。我相信您想像这样将其添加到您的CharStats表单中:

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