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

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

詳細はこちら
C#

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

Q&A

解決済

2回答

4788閲覧

C# ラップ機能を実装したいです

sin0508

総合スコア2

C#

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

1グッド

0クリップ

投稿2021/01/20 15:48

編集2021/01/20 15:49

前提・実現したいこと

C#で多機能時計を作成しています。そこで機能の一つにラップ機能を実装したいと思いました。
ラップボタンを押すことでその時の時間がラップ1、ラップ2...と順にリストのように並べていきたいと考えています。イメージとしては、iosに標準装備されている時計についているものと同じようなものを想像していただければわかりやすいかと、、

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

コード自体が全く分からない状態です。ネットをあさってはみたのですがなかなか見つからず困っています。なので、皆さんが何かをプログラムしたいと思った時に参考にしているサイトや本などでも構いませんので教えていただきたいです。

該当のソースコード

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 12 13namespace 時計 14{ 15 public partial class Form1 : Form 16 { 17 //時間経過をはかるためのクラス 18 Stopwatch myStopWatch = new Stopwatch(); 19 //スタート・ストップボタン用 20 bool sw = false; 21 BackgroundWorker bw; 22 TimeSpan ts; 23 24 public Form1() 25 { 26 InitializeComponent(); 27 28 timer1.Start(); 29 } 30 31 private void timer1_Tick(object sender, EventArgs e) 32 { 33 DateTime d = DateTime.Now; 34 label1.Text = d.ToLongTimeString(); 35 } 36 37 private void button1_Click(object sender, EventArgs e) 38 { 39 if (sw == false) 40 { 41 //計測開始 42 myStopWatch.Start(); 43 //表示更新タイマー開始 44 timer2.Start(); 45 //スイッチon 46 sw = true; 47 //リセットボタン使用不可 48 button2.Enabled = false; 49 //「スタート」だったボタンの表示を「ストップ」に変更 50 button1.Text = "ストップ"; 51 } 52 else 53 { 54 //計測終了 55 myStopWatch.Stop(); 56 //表示固定 57 timer2.Stop(); 58 //スイッチoff 59 sw = false; 60 //リセットボタン使用可 61 button2.Enabled = true; 62 //「ストップ」だったボタンの表示を「スタート」に変更 63 button1.Text = "スタート"; 64 } 65 } 66 67 private void button2_Click(object sender, EventArgs e) 68 { 69 //ストップウォッチの内容をゼロにする 70 myStopWatch.Reset(); 71 //リセットした状態をlabelに表示する 72 label2.Text = myStopWatch.Elapsed.ToString(); 73 } 74 75 private void timer2_Tick(object sender, EventArgs e) 76 { 77 //label2にスタートから現在までの時間を表示させる 78 label2.Text = myStopWatch.Elapsed.ToString(); 79 } 80 81 private void button3_Click(object sender, EventArgs e) 82 { 83 84 } 85 } 86} 87

試したこと

dateGridViewを使用してラップ時間を表示しようと思っていますが、ここから先がどのようなコードを参考にすればよいかわからず行き詰っています。。

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

visualstudio2019を使用しています。

TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

質問したい点がわからんけど

ラップボタンを押すことでその時の時間がラップ1、ラップ2...と順にリストのように並べていきたいと考えています。
dateGridViewを使用してラップ時間を表示しようと思っていますが

ということなら要するにDataGridViewの使い方がわからない、という内容だと解釈すると

DataGridView クラス - Microsoft

と、ここからリンクで色々辿れる利用方法のドキュメントとか

DataGridView編メニュー - DOBON.NET

とかの解説記事とか読めば良いんじゃないの。

正直「あなたが何をわからないのか説明しないと、読んだ人間にも何がわからないのかわからない」ので、これ以上の回答はできないと思うけど。

投稿2021/01/20 17:22

gentaro

総合スコア8947

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

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

sin0508

2021/01/21 23:20

そうですね、、 投げやりな質問でした。 意図としては、普段自分は初心者で完全オリジナルのコードを書くことが難しいので真似して繋げてという状態でして、今回は実装したい機能のコードが探しても出てこなかったので例として書いて頂いたり、皆さんが普段勉強の際に参考にしたりしているものがあればそれを教えていただこうというものでした。 回答者の皆さんに伝わる質問をするようにします。。
guest

0

ベストアンサー

使っていないBackgroundWorker bw;があるあたり、
【C#】簡単なストップウォッチを作ろう その2 - HeyCHのブログ
【C#】簡単なストップウォッチを作ろう その3 - HeyCHのブログ
こちらを参考にした(もしそうであれば質問に明記してください)ふしがありますが、行を追加するだけにしては少し冗長ですね。

DataGridView.Rows.Addには、paramsObject配列をとるものがあります。
そのためカンマで並べて渡せば、割合良しなにやってくれます。
DataGridViewRowCollection.Add メソッド (System.Windows.Forms) | Microsoft Docs

ラップ時間は、今の経過時間から前回の経過時間を引けばいいですね。


提示コードから下記のコントロールがフォームにあるとします。

  • Timer timer1 時計用
  • Timer timer2 ストップウォッチ用
  • Label label1 時計表示
  • Label label2 ストップウォッチ表示
  • Button button1 [スタート/ストップ]
  • Button button2 [リセット]
  • Button button3 [ラップ]
  • DataGridView dataGridView1 ラップ表示

cs

1using System; 2using System.Diagnostics; 3using System.Windows.Forms; 4 5namespace Questions317361 6{ 7 public partial class Form1 : Form 8 { 9 private Stopwatch stopWatch = new Stopwatch(); 10 11 //bool sw = false; // stopWatch.IsRunningを見ればいいのでいらない 12 13 private TimeSpan ts; // 前回の経過時間 14 15 public Form1() 16 { 17 InitializeComponent(); 18 timer1.Start(); 19 20 label2.Text = stopWatch.Elapsed.ToString(); 21 button3.Enabled = false; 22 23 // DataGridViewの設定(デザイナでやってもよい) 24 dataGridView1.AllowUserToAddRows = false; // ユーザーによる行の追加禁止 25 dataGridView1.ReadOnly = true; // ユーザーによる編集の禁止 26 dataGridView1.ColumnCount = 3; 27 dataGridView1.Columns[0].HeaderText = "#"; // ラップ数 28 dataGridView1.Columns[1].HeaderText = "ラップ"; 29 dataGridView1.Columns[2].HeaderText = "スプリット"; 30 } 31 32 private void timer1_Tick(object sender, EventArgs e) 33 { 34 label1.Text = DateTime.Now.ToLongTimeString(); 35 } 36 37 private void timer2_Tick(object sender, EventArgs e) 38 { 39 label2.Text = stopWatch.Elapsed.ToString(); 40 } 41 42 private void button1_Click(object sender, EventArgs e) 43 { 44 if (stopWatch.IsRunning) // もしくは if (timer2.Enabled) 45 { 46 stopWatch.Stop(); 47 timer2.Stop(); 48 button1.Text = "スタート"; 49 button2.Enabled = true; 50 button3.Enabled = false; 51 52 // 雑いw 53 // ストップウォッチに詳しくないのですが、ストップでラップも入るんですよね? 54 button3_Click(null, null); 55 } 56 else 57 { 58 stopWatch.Start(); 59 timer2.Start(); 60 button1.Text = "ストップ"; 61 button2.Enabled = false; 62 button3.Enabled = true; 63 } 64 } 65 66 private void button2_Click(object sender, EventArgs e) 67 { 68 stopWatch.Reset(); 69 label2.Text = stopWatch.Elapsed.ToString(); 70 71 dataGridView1.Rows.Clear(); // 行のクリア 72 ts = stopWatch.Elapsed; // 経過時間リセット ts=TimeSpan.Zeroと同じ 73 } 74 75 private void button3_Click(object sender, EventArgs e) 76 { 77 int number = dataGridView1.Rows.Count + 1; // ラップ数 DataGridViewの行数+1 78 TimeSpan split = stopWatch.Elapsed; // (初めのスタートからの)今の経過時間 79 TimeSpan lap = split - ts; // 今の経過時間-前回の経過時間=ラップ時間 80 ts = split; // 次のために今の経過時間を取っておく 81 82 dataGridView1.Rows.Add("ラップ" + number, lap, split); // 行の追加 83 } 84 } 85}

コード自体が全く分からない状態です。ネットをあさってはみたのですがなかなか見つからず困っています。なので、皆さんが何かをプログラムしたいと思った時に参考にしているサイトや本などでも構いませんので教えていただきたいです。

C#でフォームプログラミングであれば、環境としては最強レベルです。
強力なIDE(Visual Studio)と、日本語でも豊富に情報があります。

問題はコピペプログラミングからの脱却です。
いくら情報があったとしても要望通りのものはさすがにないでしょうから、改造したり組み合わせしたりすることになります。

例えばDataGridViewであれば、今回は列の設定方法と行の追加が分かればいいでしょう。
「datagridview 行追加」で検索し、トップに出たここを見てみますか。
【C#入門】DataGridViewの使い方(行の追加・削除、ソートも解説) | 侍エンジニアブログ

初めに出てきたコードで目標達成です。
さらに下に難しそうなこと(データ・バインド等)が書かれていますが、目標達成しているので気にしないことにします^^;

検証用のプロジェクトを新たに作り、動作確認をしてもいいでしょう(例えばボタンでRows.Addしてみる・入れる値をいじってみる等)

そういった積み重ねで、理解しながら進めていくことになります(すべてを理解しようと思ってはいけません。必要な部分だけ「多分分かった」で十分です)

こういった完成までの試行錯誤や失敗談はあまりおもてに出てきませんが、裏ではみんなやっています^^

投稿2021/01/20 22:22

編集2023/07/26 13:22
TN8001

総合スコア9855

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

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

sin0508

2021/01/21 23:13

丁寧なアドバイスありがとうございます。 ご指摘通り、現状自分の創りたいと思ったもののコードをネットで探して真似して繋げてという状態です。 まずは少しづつわかる範囲を理解しオリジナルのコードを書けるようにしようと思います。 時間がかかると思いますが、頂いたアドバイスを参考にラップ機能の実装に取り組みます。 時間のかかる作業なので機能自体は実装できていませんがひとまずベストアンサーとさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問