0

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

我试过这样做并得到这些代码

形式一:开始按钮

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

4 回答 4

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();
    }     
}
于 2013-08-19T10:13:21.120 回答
1

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

于 2013-08-19T10:12:46.843 回答
0

如果将数据存储在可以从两种形式访问的地方,它将更清洁和更易于维护。例如一个静态类。(您也可以使用数据库或文本文件)

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

设置并StartTimeFrom1回差异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

于 2013-08-19T10:12:42.700 回答
0

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

于 2013-08-19T10:22:46.973 回答