在窗体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());
}
}
我得到全零。我想我做错了什么。我怎样才能正确地解决这个问题?谢谢
使用
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的所有公共变量和方法)
希望它能帮助你理解。