0

2つのフォームがあるとしましょう。最初のボタンには開始ボタンが含まれ、もう 1 つのボタンには停止ボタンが含まれます。スタートボタンとストップボタンを押してから2番目のフォームで表示するまでの経過時間を判断する方法はありますか?

私はこれをやってみましたが、これらのコードにたどり着きました

フォーム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

4 に答える 4

5

開始時刻を 2 番目のフォームに渡す

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

これらのフォームが同じアプリケーション内に存在するかどうかに応じて、最初のフォームへの参照を 2 番目のフォームに渡すことができます。そして、(starttime1 DateTimeオブジェクトは公開されているため、2 番目のフォームからアクセスできます。

于 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 に答える