将变量(时间)从一种形式传递到另一种形式C#

时间:2013-08-19 10:09:13

标签: c# forms elapsedtime

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

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

表格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显示错误的经过时间值。有什么建议让我的代码有效吗?谢谢!

4 个答案:

答案 0 :(得分:5)

将开始时间传递给第二种形式

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

StartTime设置From1并回读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类。

答案 3 :(得分:0)

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