将变量(时间)从一种forms传递到另一种formsC#

假设我有两种forms。 第一个包含开始按钮,另一个是停止按钮。 有没有办法可以确定按下开始和停止按钮之间经过的时间,并以第二种forms显示。

我尝试这样做并得出这些代码

表格1:开始按钮

namespace WindowsFormsApplication1 { public partial class Form1 : Form { public DateTime startTime2; public DateTime endTime; public TimeSpan ts_timeElapsed; public string s_timeElapsed; public Form1() { InitializeComponent(); } private void StartButton_Click(object sender, EventArgs e) { startTime2 = DateTime.Now; Form2 frm = new Form2(); frm.Show(); this.Hide(); } private void Button2_Click(object sender, EventArgs e) { Instructions frm = new Instructions(); frm.Show(); this.Hide(); } } } 

表格2:停止按钮

 namespace WindowsFormsApplication1 { public partial class RoadSign1Meaning : Form { public DateTime startTime1; public DateTime endTime; public TimeSpan ts_timeElapsed; public string s_timeElapsed; public RoadSign1Meaning() { InitializeComponent(); } public string GetElapsedTimeString() { int days = ts_timeElapsed.Days; int hours = ts_timeElapsed.Hours; int mins = ts_timeElapsed.Minutes; int secs = ts_timeElapsed.Seconds; string x = ""; if (days != 0) { x += days.ToString() + ":"; } if (hours != 0) { x += hours.ToString() + ":"; } if (mins != 0) { x += mins.ToString() + ":"; } if (secs != 0) { x += secs.ToString(); } return x; } private void StopButton_Click(object sender, EventArgs e) { endTime = DateTime.Now; ts_timeElapsed = (endTime - startTime1); s_timeElapsed = GetElapsedTimeString(); ElapsedLabel.Text = "Time Elapsed: " + s_timeElapsed; Form3 frm = new Form3(); frm.Show(); } } } 

但是,问题是来自表格1的时间值未保存,因此表格2显示错误的经过时间值。 有什么建议使我的代码工作? 谢谢!

将开始时间传递给第二种forms

 private void StartButton_Click(object sender, EventArgs e) { Form2 frm = new Form2(DateTime.Now); frm.Show(); this.Hide(); } 

然后使用它

 public partial class Form2 : Form { private DateTime startTime; public Form2(DateTime startTime) { InitializeComponent(); this.startTime = startTime; } private void StopButton_Click(object sender, EventArgs e) { endTime = DateTime.Now; ts_timeElapsed = (endTime - startTime); s_timeElapsed = GetElapsedTimeString(); ElapsedLabel.Text = "Time Elapsed: " + s_timeElapsed; Form3 frm = new Form3(); frm.Show(); } } 

根据这些表单是否存在于同一个应用程序中,您可以将对第一个表单的引用传递给第二个表单。 然后(因为starttime1 DateTime对象是公共的,您可以从第二个表单访问它。

如果将数据存储在可从两种表单访问的位置,它将更清晰且更易于维护。 例如一个静态类。 (您也可以使用数据库或文本文件)

 public static TempStore { public DateTime StartTime { get; set; } } 

From1设置StartTime并回读Form2的差异

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void StartButton_Click(object sender, EventArgs e) { TempStore.StartTime = DateTime.Now; // ... } } 

表格2:

 public partial class RoadSign1Meaning : Form { public RoadSign1Meaning() { InitializeComponent(); } private void StopButton_Click(object sender, EventArgs e) { TimeSpan span = DateTime.Now - TempStore.StartTime; // ... } } 

这样,如果您决定向表单传递更多数据,则可以扩展此static类。

有几种解决方案,但也取决于您希望实现的复杂性。 在代码中修改较少的最简单的方法是在第二个窗体上声明一个构造函数,它接受DateTime类型的参数,并在创建Form2时从Form1传入startTime2,就像Form2 form2 = new Form2(startTime2)一样。 更优雅的方法是使用方法GetElapsedTime()定义一个接口,并创建一个具体的,它负责开始/结束时间,你可以像以前一样从Form1传递具体的实例到Form2。