🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2933閲覧

c# 今の経過時間から前回の経過時間を引く方法を知りたいです。

sin0508

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/02/04 13:34

前提・実現したいこと

c#で多機能デジタル時計を作成しています。
機能の一つにラップタイムの測定機能を付けたいです。
ラップタイム測定のために、今の経過時間から前回(ボタンを押したとき)の経過時間を引きたいと思っています。その際のコードに苦戦しています。

発生している問題・エラーメッセージ

上記の"(今の経過時間)―(前回の経過時間)= ラップタイム" のコードをどう書けばよいかが分かりません。
dataGridviewを使用して記入しようと考えています。
下記のコードはラップ機能実装のために用意した実験ソース用のファイルに記入しているものです。

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.Diagnostics; 11 12namespace 時計_実験コード 13{ 14 public partial class Form1 : Form 15 { 16 //時間経過をはかるためのクラス 17 Stopwatch myStopWatch = new Stopwatch(); 18 //スタート・ストップボタン用 19 bool sw = false; 20 public Form1() 21 { 22 InitializeComponent(); 23 timer1.Start(); 24 } 25 26 private void Form1_Load(object sender, EventArgs e) 27 { 28 //カラム数を指定 29 dataGridView1.ColumnCount = 2; 30 31 //カラム名を指定 32 dataGridView1.Columns[0].HeaderText = "時間"; 33 dataGridView1.Columns[1].HeaderText = "ラップ"; 34 35 } 36 37 private void rap_bt_Click(object sender, EventArgs e) 38 { 39 //データを追加 40 dataGridView1.Rows.Add(label2.Text) ; //ラップボタンを押したときの"時間"の入力には成功 41 dataGridView1.Rows.Add(); //ラップタイムを表示したい 42 } 43 44 private void timer1_Tick(object sender, EventArgs e) 45 { 46 DateTime d = DateTime.Now; 47 label1.Text = d.ToLongTimeString(); 48 } 49 50 private void start_stop_bt_Click(object sender, EventArgs e) 51 { 52 if (sw == false) 53 { 54 //計測開始 55 myStopWatch.Start(); 56 //表示更新タイマー開始 57 timer2.Start(); 58 //スイッチon 59 sw = true; 60 //リセットボタン使用不可 61 reset_bt.Enabled = false; 62 //「スタート」だったボタンの表示を「ストップ」に変更 63 start_stop_bt.Text = "ストップ"; 64 } 65 else 66 { 67 //計測終了 68 myStopWatch.Stop(); 69 //表示固定 70 timer2.Stop(); 71 //スイッチoff 72 sw = false; 73 //リセットボタン使用可 74 reset_bt.Enabled = true; 75 //「ストップ」だったボタンの表示を「スタート」に変更 76 start_stop_bt.Text = "スタート"; 77 } 78 } 79 80 private void timer2_Tick(object sender, EventArgs e) 81 { 82 //label2にスタートから現在までの時間を表示させる 83 label2.Text = myStopWatch.Elapsed.ToString(); 84 } 85 86 private void reset_bt_Click(object sender, EventArgs e) 87 { 88 //ストップウォッチの内容をゼロにする 89 myStopWatch.Reset(); 90 //リセットした状態をlabelに表示する 91 label2.Text = myStopWatch.Elapsed.ToString(); 92 } 93 } 94}

試したこと

実装のために試したものがdataGridviewのセルの特定です。
セル項目に“時間(ラップボタンを押したときのラベルに表示されている時間)”、“ラップタイム”を用意しました。
この二つのうち、“時間”項目の表示はストップウォッチの時間表示に使用しているlabel2のテキストを代入する形で実装してみました。
次に“ラップタイム”項目は今回の“時間”セルに入っている時間から前回の“時間”セルに入っている時間を引いて表示しようと思い、セルの特定を行おうとしていますがその特定の仕方が分からない状態です。
ラップタイムの出し方の考え方としてあっているかもわかりませんが、その点も含めて
・セルの特定の仕方
・そもそもこの出し方で正常にラップタイムは表示されるのか、されないのであればどういった捉え方(ソースの書き方)をすればよいのか
を教えていただきたいです。

補足情報(FW/ツールのバージョンなど)

visualstudio2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2021/02/04 14:00

[C# - C# ラップ機能を実装したいです|teratail](https://teratail.com/questions/317361 と、何が違うのでしょうか?(というか実験用だからか退化してますよね。。。 私の回答をベストアンサーしていただけましたが、試してもいないし全く理解できていないということでしょうか?
sin0508

2021/02/04 15:33

大変失礼しました!! 前回頂いた回答でTN8001さんが書いてくださったコードの記載部分を、私のコードとその下の、「コードがわからないので教えてくれ~」という文言を引用し、こういうコードの書き方は良くない~という意味でサイトや今後のコードの書き方を教えてくださったのだと勘違いし、コード部分を下まで開いていませんでした。その状態でひとまずdataGridviewの使い方を理解しようとコードを試していました。 すぐに確認したところとても丁寧に書いてくださっていたのに確認を怠ってしまい、不快な思いをさせてしまったことと思います。本当に申し訳ありませんでした。 これからコードをまた書き直しますので今回はその作業をしっかり終えてからベストアンサーをつけさせていただきます。。 私の勘違いと確認を怠ったせいで不快な思いをさせてしまい大変申し訳ありませんでした。。
TN8001

2021/02/04 15:42

いえ不快には思っていませんのでご心配なく。 あれを読んだうえで1ミリもわからないとなると、大変なことだなと思っていましたが、読んでないなら逆に良かったです^^; もしあちらをうまく動かせなかったら、Form1.Designer.csも追記しますので言ってください。
sin0508

2021/02/04 15:47

ありがとうございます。。! また少し時間がかかると思いますが、進みましたらこちらで追記させていただきます。 ご丁寧にありがとうございます(;_:)
sin0508

2021/02/06 15:38

こんばんは。一つお聞きしたい点があります。 button3_Click(null, null); というコードですが、このコードによりストップボタンを押すことでもラップタイム等が入ることは理解できました。null自体がどういったものなのかはしらべたのですが、この場合のnullはどういったものなのかを教えていただきたいです。何かを代入しているのでしょうか? 質問したい点がうまく言語化できておらず分かりづらいかもしれませんが。。
TN8001

2021/02/06 20:27

本来はbutton3_Clickの内容を別のメソッドにして、button1_Click・button3_Clickではそれを呼ぶようにします(これが「// 雑いw」という理由です^^; 別のメソッドが増えるとわかりにくいかな?・ストップでラップも入るのか自信がなかったためこのような形にしてしまいましたが、かえって混乱させてしまったようで申し訳ないです。 button3_Clickではsender・eどちらの引数も使っていません。 そのため何を入れて呼び出しても何の影響もないわけですが、こういったときに「無効値」として null を渡すことがあります。 あまり褒められたコードではないので、冒頭のようにするのが望ましいです。 ↓このあたりを見てもらえると読み物としては面白いと思います。 [null の取り扱い - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/rm_nullusage.html [nullが生まれた背景と現在のnullの問題点 ― null参照問題(前編) - Build Insider](https://www.buildinsider.net/column/iwanaga-nobuyuki/011
sin0508

2021/02/08 04:24

なるほど、そういうことでしたか! ^^) 理解できました。 おかげさまでひとまず想定通りのラップ機能が実装できました。細かなコードから解説までありがとうございました! 理解を深めるために教えていただいた記事も早速読んでみます。
guest

回答2

0

おそらくですがDatatime型の挙動がよくわかっておられないように思います。

単純にDatetime型からDatatime型を引くと差分の値がDatatime型で取れるのですが、
今の日時を日時スナップショットとしては

DateTime d = DateTime.Now;

みたいな構文で取れていると思いますので、

DateTime d_1 = DateTime.Now;

<なんか処理する>

DateTime d_2 = DateTime.Now;

DateTime d_split = d_2 - d_1;

みたいな感じの構文で日時差分の値は取れるように思います。
(ここらへんの考え方はMS系の開発環境は全部共通で、VBAとかからSQLServer上での日時計算についても全て、全く同じロジックで処理できるような気がします。)

あとは値のやりとりをちゃんとできれば処理できるかなと思います。
頑張ってみてください。

投稿2021/02/04 15:24

ditflame

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sin0508

2021/02/04 15:50

ありがとうございます! そうですね、、まだDateTime型の挙動もかなり曖昧な状態でコードをみようみまねで書いています。 こちらのアドバイスも参考にさせていただきます! ^^
退会済みユーザー

退会済みユーザー

2021/02/04 22:06

> 単純にDatetime型からDatatime型を引くと差分の値がDatatime型で取れるのですが TimeSpan 型になるのではなかったでしたっけ?
sin0508

2021/02/06 15:40

DataTime型からDataTime型を引くとTimeSpan型になるという理解でよろしかったでしょうか??
退会済みユーザー

退会済みユーザー

2021/02/06 22:05

そうです。
sin0508

2021/02/08 05:09

ありがとうございます。
guest

0

自己解決

[前回質問時のベストアンサーの方(TN8001さん)の回答により
解決しました。(http://teratail.com/questions/317361)

投稿2021/02/08 04:28

sin0508

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問