在窗体C#之间传递数据

本文关键字:数据 之间 窗体 | 更新日期: 2023-09-27 18:25:08

我有一个游戏,在三种不同的形式上有三个级别。我保存了每个级别的完成时间,并想在第4张表格上访问它。我已经这样做了:

public partial class Results : Form
{
    public int  time1, time2, time3;
    FormLevel1 rez1 = new FormLevel1();
    FormLevel2 rez2 = new FormLevel2();
    FormLevel3 rez3 = new FormLevel3();
    public Results()
    {
        InitializeComponent();

    }
    void Calculations()
    {
        time1 = rez1.levelTime;
        time2 = rez2.levelTime;
        time3 = rez3.levelTime;
        MessageBox.Show(time1.ToString());
        MessageBox.Show(time2.ToString());
        MessageBox.Show(time3.ToString());
    }
}

我得到全零。我想我做错了什么。我怎样才能正确地解决这个问题?谢谢

在窗体C#之间传递数据

使用

FormLevel1 rez1 = new FormLevel1();
FormLevel2 rez2 = new FormLevel2();
FormLevel3 rez3 = new FormLevel3();

您正在创建这三个表单的新实例,而不是使用要使用的"以前"实例。

您需要(例如)公共属性来传递Form4的实例的3个"前一个"形式(或任何实现此目的的方法)。

但实际上,考虑一下你真正需要传递给表单的是什么结果:从你的代码来看,你似乎只需要传递3个整数(每个表单levelTime

[编辑]现在只需意识到您的time1、time3和time3成员变量是公共的。因此,在调用代码中,您可以执行以下操作:

Result resForm = new Result();
resForm.time1 = ... // have you saved result of form1 in a variable? use it here!
resForm.time2 = ... // same for form2
resForm.time3 = ... // same for form3
resForm.ShowDialog();

让我试着解释一下你在这里做错了什么(基于我对你在哪里做Calculations()的假设。如果我错了,请原谅。)

public partial class Results : Form // (0)
{
    public int  time1, time2, time3;
    FormLevel1 rez1 = new FormLevel1(); //(1)
    ...
    public Results()
    {
        InitializeComponent(); 
        Calculations(); // (2) Assuming you call Calculations() here
    }
    void Calculations()
    {
        time1 = rez1.levelTime;
        MessageBox.Show(time1.ToString()); //(3)
        ...
    }
}

(0)在时间=0时,您创建了Results类实例

(1) 在Time=0时,您创建了FormLevel1类实例

(2) 在时间=0时,进行计算()

(3) 在时间=0时,显示FormLevel1的levelTime 的消息框

即(0)到(3)发生在(几乎)SAME时间!您的FormLevel1没有机会执行和完成它的Timer内容BEFOREResults执行其Calculation(),因此消息框显示0。

如果您不在这里详细解释您想要实现的目标,或者不向我们提供您的FormLevel代码,我们就无法为您提供更具体的解决方案。

一个可能的解决方案是在他们完成定时器工作后,从FormLevels呼叫Results.Calculation()

如何?

public partial class Results : Form 
{
    ...
    FormLevel1 rez1 = new FormLevel1(this); //pass this instance of Results into FormLevel1
    ...
    public void Calculations() //Add public keyword so that it is accessible from FormLevel1
    {
        ...
    }
}
public partial class FormLevel1: Form 
{
    Results resultForm;
    public FormLevel1(Results callingForm) //modify constructor to accept Results
    {
        resultForm = callingForm;  
    }
    void TimerCompleted() //Call this when Timer finish its stuff
    {
        resultForm.Calculations();
    }
    ...
}

请注意,这可能不是您想要的解决方案。但这通常是在表单之间传递数据的最简单方法,可以回答您的标题问题。(FormLevel1现在可以访问其调用Form的所有公共变量和方法)

希望它能帮助你理解。