-1

私は00:00:00から始まり、毎秒インクリメントする単純なカウンターであるカウンターを作成しました。そのためのコードを提供します

フォームロードイベントで私はこれを書きました

 private DateTime startTime; 
        private void Form7_Load(object sender, EventArgs e)
        {
            startTime = DateTime.Now; 
            timer1.Start();

        }

 private void timer1_Tick(object sender, System.EventArgs e)
            {

                counter_label.Text = (DateTime.Now - startTime)
.ToString(@"hh\:mm\:ss");
            }

タイマーは1000に設定されているため、タイマーは正常に動作しますが、label.textをproperties.settings.defaultにあるwinformの設定に保存したいので、テキストを保存しました

private void Form7_FormClosing(object sender, FormClosingEventArgs e)
        {

            DateTime st;
            DateTime end;
            st = Convert.ToDateTime(Properties.Settings.Default.datetime);
            end = Convert.ToDateTime(counter_label.Text);

            Properties.Settings.Default.datetime = counter_label.Text;
          total_label.Text = (st + end ).ToString(@"hh\:mm\:ss");// this is not happening

          Properties.Settings.Default.datetime = total_label.Text;
            Properties.Settings.Default.Save();
        }

エラーはオペランド + を system.datetime および system.datetime に適用できません 私の意図は. テキストをシステムプロパティに保存すると。フォームを閉じるイベントで、新しく更新された結果を保存する必要があります。system.properties からの古いテキストと counter_label からの新しいテキスト。どのようにそれを行うことができますか?

4

4 に答える 4

2

2 つの日時オブジェクトを追加することはできません。その形式は であるため、値counter_labelがあると思います。それを解析して、 DateTime 型オブジェクトに追加できます。TimeSpan00:00:00TimeSpanst

TimeSpan ts = TimeSpan.Parse(counter_label.Text);
total_label.Text = st.Add(ts).ToString(@"hh\:mm\:ss");
于 2013-01-29T12:42:53.760 に答える
1

stringオブジェクトを格納するために型の設定を使用しないでくださいTimeSpan(Habib が既に述べたように、DateTimeオブジェクトの減算または加算は を生成しますTimeSpan)。System.TimeSpanファイル内のタイプの設定を作成する必要がありSettings.settingsます (たとえば、TotalTime という名前で)。

保存:

Properties.Settings.Default.TotalTime = (DateTime.Now - startTime);
Properties.Settings.Default.Save();

読み込み中 (ここにトリックがあります - 現在の時刻から残った時間を差し引いています。したがって、残り 2 分がある場合、開始時刻はアプリケーションを開始する 2 分前に設定されます)。

startTime = DateTime.Now.Subtract(Properties.Settings.Default.TotalTime);

したがって、文字列を解析する必要はありません。DateTime と TimeSpan を操作し、.NET にすべての永続的な作業を任せます。


更新 (すべてのコード):

DateTime startTime;

private void timer1_Tick(object sender, EventArgs e)
{
    label1.Text = (DateTime.Now - startTime).ToString(@"hh\:mm\:ss");
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    timer1.Stop();
    Properties.Settings.Default.TotalTime = (DateTime.Now - startTime);
    Properties.Settings.Default.Save();
}

private void Form1_Load(object sender, EventArgs e)
{
    startTime = DateTime.Now.Subtract(Properties.Settings.Default.TotalTime);
    timer1.Start();
}

アプリケーションの最初の実行である場合は、Properties.Settings.Default.TotalTimeデフォルト値のTimeSpan(ゼロ時間スパン) が返されます。したがって、現在の時刻からそれを引くと、現在の時刻と同じ値が返されます。

于 2013-01-29T13:55:19.487 に答える
1

演算子 + は次のように定義します:

public static DateTime operator +(
    DateTime d,
    TimeSpan t
)

指定された日付と時刻に指定された時間間隔を追加して、新しい日付と時刻を生成します。 * timeSpand を dateTime にのみ追加できます!!!! * 修正コード:

TimeSpan sp = TimeSpan.Parse(counter_label.Text);
total_label.Text = (st+sp).ToString(@"hh\:mm\:ss");
于 2013-01-29T12:42:33.533 に答える
0

2 つの違いDateTimeは別のものではDateTimeなく、TimeSpan. したがって、保持したいのは、ある瞬間ではなく、総実行時間であり、TimeSpan.

于 2013-01-29T12:42:39.843 に答える