回答編集履歴
2
見直しキャンペーン中
test
CHANGED
@@ -1,265 +1,133 @@
|
|
1
1
|
使っていない`BackgroundWorker bw;`があるあたり、
|
2
|
-
|
3
2
|
[【C#】簡単なストップウォッチを作ろう その2 - HeyCHのブログ](https://heych.hatenablog.com/entry/2020/03/28/004304)
|
4
|
-
|
5
3
|
[【C#】簡単なストップウォッチを作ろう その3 - HeyCHのブログ](https://heych.hatenablog.com/entry/2020/03/29/011712)
|
6
|
-
|
7
4
|
こちらを参考にした(もしそうであれば**質問に明記**してください)ふしがありますが、行を追加するだけにしては少し冗長ですね。
|
8
5
|
|
9
|
-
|
10
|
-
|
11
6
|
`DataGridView.Rows.Add`には、`params`で`Object`配列をとるものがあります。
|
12
|
-
|
13
7
|
そのためカンマで並べて渡せば、割合良しなにやってくれます。
|
14
|
-
|
15
8
|
[DataGridViewRowCollection.Add メソッド (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datagridviewrowcollection.add#System_Windows_Forms_DataGridViewRowCollection_Add_System_Object___)
|
16
|
-
|
17
|
-
|
18
9
|
|
19
10
|
ラップ時間は、今の経過時間から前回の経過時間を引けばいいですね。
|
20
11
|
|
12
|
+
---
|
21
13
|
|
14
|
+
提示コードから下記のコントロールがフォームにあるとします。
|
15
|
+
* `Timer timer1` 時計用
|
16
|
+
* `Timer timer2` ストップウォッチ用
|
17
|
+
* `Label label1` 時計表示
|
18
|
+
* `Label label2` ストップウォッチ表示
|
19
|
+
* `Button button1` [スタート/ストップ]
|
20
|
+
* `Button button2` [リセット]
|
21
|
+
* `Button button3` [ラップ]
|
22
|
+
* `DataGridView dataGridView1` ラップ表示
|
23
|
+
|
24
|
+
```cs
|
25
|
+
using System;
|
26
|
+
using System.Diagnostics;
|
27
|
+
using System.Windows.Forms;
|
28
|
+
|
29
|
+
namespace Questions317361
|
30
|
+
{
|
31
|
+
public partial class Form1 : Form
|
32
|
+
{
|
33
|
+
private Stopwatch stopWatch = new Stopwatch();
|
34
|
+
|
35
|
+
//bool sw = false; // stopWatch.IsRunningを見ればいいのでいらない
|
36
|
+
|
37
|
+
private TimeSpan ts; // 前回の経過時間
|
38
|
+
|
39
|
+
public Form1()
|
40
|
+
{
|
41
|
+
InitializeComponent();
|
42
|
+
timer1.Start();
|
43
|
+
|
44
|
+
label2.Text = stopWatch.Elapsed.ToString();
|
45
|
+
button3.Enabled = false;
|
46
|
+
|
47
|
+
// DataGridViewの設定(デザイナでやってもよい)
|
48
|
+
dataGridView1.AllowUserToAddRows = false; // ユーザーによる行の追加禁止
|
49
|
+
dataGridView1.ReadOnly = true; // ユーザーによる編集の禁止
|
50
|
+
dataGridView1.ColumnCount = 3;
|
51
|
+
dataGridView1.Columns[0].HeaderText = "#"; // ラップ数
|
52
|
+
dataGridView1.Columns[1].HeaderText = "ラップ";
|
53
|
+
dataGridView1.Columns[2].HeaderText = "スプリット";
|
54
|
+
}
|
55
|
+
|
56
|
+
private void timer1_Tick(object sender, EventArgs e)
|
57
|
+
{
|
58
|
+
label1.Text = DateTime.Now.ToLongTimeString();
|
59
|
+
}
|
60
|
+
|
61
|
+
private void timer2_Tick(object sender, EventArgs e)
|
62
|
+
{
|
63
|
+
label2.Text = stopWatch.Elapsed.ToString();
|
64
|
+
}
|
65
|
+
|
66
|
+
private void button1_Click(object sender, EventArgs e)
|
67
|
+
{
|
68
|
+
if (stopWatch.IsRunning) // もしくは if (timer2.Enabled)
|
69
|
+
{
|
70
|
+
stopWatch.Stop();
|
71
|
+
timer2.Stop();
|
72
|
+
button1.Text = "スタート";
|
73
|
+
button2.Enabled = true;
|
74
|
+
button3.Enabled = false;
|
75
|
+
|
76
|
+
// 雑いw
|
77
|
+
// ストップウォッチに詳しくないのですが、ストップでラップも入るんですよね?
|
78
|
+
button3_Click(null, null);
|
79
|
+
}
|
80
|
+
else
|
81
|
+
{
|
82
|
+
stopWatch.Start();
|
83
|
+
timer2.Start();
|
84
|
+
button1.Text = "ストップ";
|
85
|
+
button2.Enabled = false;
|
86
|
+
button3.Enabled = true;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
private void button2_Click(object sender, EventArgs e)
|
91
|
+
{
|
92
|
+
stopWatch.Reset();
|
93
|
+
label2.Text = stopWatch.Elapsed.ToString();
|
94
|
+
|
95
|
+
dataGridView1.Rows.Clear(); // 行のクリア
|
96
|
+
ts = stopWatch.Elapsed; // 経過時間リセット ts=TimeSpan.Zeroと同じ
|
97
|
+
}
|
98
|
+
|
99
|
+
private void button3_Click(object sender, EventArgs e)
|
100
|
+
{
|
101
|
+
int number = dataGridView1.Rows.Count + 1; // ラップ数 DataGridViewの行数+1
|
102
|
+
TimeSpan split = stopWatch.Elapsed; // (初めのスタートからの)今の経過時間
|
103
|
+
TimeSpan lap = split - ts; // 今の経過時間-前回の経過時間=ラップ時間
|
104
|
+
ts = split; // 次のために今の経過時間を取っておく
|
105
|
+
|
106
|
+
dataGridView1.Rows.Add("ラップ" + number, lap, split); // 行の追加
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
```
|
22
111
|
|
23
112
|
---
|
24
113
|
|
25
|
-
|
26
|
-
|
27
|
-
提示コードから下記のコントロールがフォームにあるとします。
|
28
|
-
|
29
|
-
* `Timer timer1` 時計用
|
30
|
-
|
31
|
-
* `Timer timer2` ストップウォッチ用
|
32
|
-
|
33
|
-
* `Label label1` 時計表示
|
34
|
-
|
35
|
-
* `Label label2` ストップウォッチ表示
|
36
|
-
|
37
|
-
* `Button button1` [スタート/ストップ]
|
38
|
-
|
39
|
-
* `Button button2` [リセット]
|
40
|
-
|
41
|
-
* `Button button3` [ラップ]
|
42
|
-
|
43
|
-
* `DataGridView dataGridView1` ラップ表示
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
```C#
|
48
|
-
|
49
|
-
using System;
|
50
|
-
|
51
|
-
using System.Diagnostics;
|
52
|
-
|
53
|
-
using System.Windows.Forms;
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
namespace Questions317361
|
58
|
-
|
59
|
-
{
|
60
|
-
|
61
|
-
public partial class Form1 : Form
|
62
|
-
|
63
|
-
{
|
64
|
-
|
65
|
-
private Stopwatch stopWatch = new Stopwatch();
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
//bool sw = false; // stopWatch.IsRunningを見ればいいのでいらない
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
private TimeSpan ts; // 前回の経過時間
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
public Form1()
|
78
|
-
|
79
|
-
{
|
80
|
-
|
81
|
-
InitializeComponent();
|
82
|
-
|
83
|
-
timer1.Start();
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
label2.Text = stopWatch.Elapsed.ToString();
|
88
|
-
|
89
|
-
button3.Enabled = false;
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
// DataGridViewの設定(デザイナでやってもよい)
|
94
|
-
|
95
|
-
dataGridView1.AllowUserToAddRows = false; // ユーザーによる行の追加禁止
|
96
|
-
|
97
|
-
dataGridView1.ReadOnly = true; // ユーザーによる編集の禁止
|
98
|
-
|
99
|
-
dataGridView1.ColumnCount = 3;
|
100
|
-
|
101
|
-
dataGridView1.Columns[0].HeaderText = "#"; // ラップ数
|
102
|
-
|
103
|
-
dataGridView1.Columns[1].HeaderText = "ラップ";
|
104
|
-
|
105
|
-
dataGridView1.Columns[2].HeaderText = "スプリット";
|
106
|
-
|
107
|
-
}
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
private void timer1_Tick(object sender, EventArgs e)
|
112
|
-
|
113
|
-
{
|
114
|
-
|
115
|
-
label1.Text = DateTime.Now.ToLongTimeString();
|
116
|
-
|
117
|
-
}
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
private void timer2_Tick(object sender, EventArgs e)
|
122
|
-
|
123
|
-
{
|
124
|
-
|
125
|
-
label2.Text = stopWatch.Elapsed.ToString();
|
126
|
-
|
127
|
-
}
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
private void button1_Click(object sender, EventArgs e)
|
132
|
-
|
133
|
-
{
|
134
|
-
|
135
|
-
if (stopWatch.IsRunning) // もしくは if (timer2.Enabled)
|
136
|
-
|
137
|
-
{
|
138
|
-
|
139
|
-
stopWatch.Stop();
|
140
|
-
|
141
|
-
timer2.Stop();
|
142
|
-
|
143
|
-
button1.Text = "スタート";
|
144
|
-
|
145
|
-
button2.Enabled = true;
|
146
|
-
|
147
|
-
button3.Enabled = false;
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
// 雑いw
|
152
|
-
|
153
|
-
// ストップウォッチに詳しくないのですが、ストップでラップも入るんですよね?
|
154
|
-
|
155
|
-
button3_Click(null, null);
|
156
|
-
|
157
|
-
}
|
158
|
-
|
159
|
-
else
|
160
|
-
|
161
|
-
{
|
162
|
-
|
163
|
-
stopWatch.Start();
|
164
|
-
|
165
|
-
timer2.Start();
|
166
|
-
|
167
|
-
button1.Text = "ストップ";
|
168
|
-
|
169
|
-
button2.Enabled = false;
|
170
|
-
|
171
|
-
button3.Enabled = true;
|
172
|
-
|
173
|
-
}
|
174
|
-
|
175
|
-
}
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
private void button2_Click(object sender, EventArgs e)
|
180
|
-
|
181
|
-
{
|
182
|
-
|
183
|
-
stopWatch.Reset();
|
184
|
-
|
185
|
-
label2.Text = stopWatch.Elapsed.ToString();
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
dataGridView1.Rows.Clear(); // 行のクリア
|
190
|
-
|
191
|
-
ts = stopWatch.Elapsed; // 経過時間リセット ts=TimeSpan.Zeroと同じ
|
192
|
-
|
193
|
-
}
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
private void button3_Click(object sender, EventArgs e)
|
198
|
-
|
199
|
-
{
|
200
|
-
|
201
|
-
int number = dataGridView1.Rows.Count + 1; // ラップ数 DataGridViewの行数+1
|
202
|
-
|
203
|
-
TimeSpan split = stopWatch.Elapsed; // (初めのスタートからの)今の経過時間
|
204
|
-
|
205
|
-
TimeSpan lap = split - ts; // 今の経過時間-前回の経過時間=ラップ時間
|
206
|
-
|
207
|
-
ts = split; // 次のために今の経過時間を取っておく
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
dataGridView1.Rows.Add("ラップ" + number, lap, split); // 行の追加
|
212
|
-
|
213
|
-
}
|
214
|
-
|
215
|
-
}
|
216
|
-
|
217
|
-
}
|
218
|
-
|
219
|
-
```
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
---
|
224
|
-
|
225
|
-
|
226
|
-
|
227
114
|
> コード自体が全く分からない状態です。ネットをあさってはみたのですがなかなか見つからず困っています。なので、皆さんが何かをプログラムしたいと思った時に参考にしているサイトや本などでも構いませんので教えていただきたいです。
|
228
115
|
|
229
|
-
|
230
|
-
|
231
116
|
C#でフォームプログラミングであれば、環境としては最強レベルです。
|
232
|
-
|
233
117
|
強力なIDE(Visual Studio)と、日本語でも豊富に情報があります。
|
234
118
|
|
235
|
-
|
236
|
-
|
237
119
|
問題はコピペプログラミングからの脱却です。
|
238
|
-
|
239
120
|
いくら情報があったとしても要望通りのものはさすがにないでしょうから、改造したり組み合わせしたりすることになります。
|
240
121
|
|
241
|
-
|
242
|
-
|
243
122
|
例えば`DataGridView`であれば、今回は列の設定方法と行の追加が分かればいいでしょう。
|
244
|
-
|
245
123
|
「datagridview 行追加」で検索し、トップに出たここを見てみますか。
|
246
|
-
|
247
124
|
[【C#入門】DataGridViewの使い方(行の追加・削除、ソートも解説) | 侍エンジニアブログ](https://www.sejuku.net/blog/58436)
|
248
125
|
|
249
|
-
|
250
|
-
|
251
126
|
初めに出てきたコードで目標達成です。
|
252
|
-
|
253
127
|
さらに下に難しそうなこと(データ・バインド等)が書かれていますが、目標達成しているので気にしないことにします^^;
|
254
|
-
|
255
|
-
|
256
128
|
|
257
129
|
検証用のプロジェクトを新たに作り、動作確認をしてもいいでしょう(例えばボタンでRows.Addしてみる・入れる値をいじってみる等)
|
258
130
|
|
259
|
-
|
260
|
-
|
261
131
|
そういった積み重ねで、**理解しながら進めていく**ことになります(すべてを理解しようと思ってはいけません。必要な部分だけ「多分分かった」で十分です)
|
262
132
|
|
263
|
-
|
264
|
-
|
265
133
|
こういった完成までの試行錯誤や失敗談はあまりおもてに出てきませんが、裏ではみんなやっています^^
|
1
params
test
CHANGED
@@ -8,7 +8,9 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
|
-
`DataGridView.Rows.Add`には`Object`配列をとるものがあ
|
11
|
+
`DataGridView.Rows.Add`には、`params`で`Object`配列をとるものがあります。
|
12
|
+
|
13
|
+
そのためカンマで並べて渡せば、割合良しなにやってくれます。
|
12
14
|
|
13
15
|
[DataGridViewRowCollection.Add メソッド (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datagridviewrowcollection.add#System_Windows_Forms_DataGridViewRowCollection_Add_System_Object___)
|
14
16
|
|
@@ -138,12 +140,12 @@
|
|
138
140
|
|
139
141
|
timer2.Stop();
|
140
142
|
|
143
|
+
button1.Text = "スタート";
|
144
|
+
|
141
145
|
button2.Enabled = true;
|
142
146
|
|
143
147
|
button3.Enabled = false;
|
144
148
|
|
145
|
-
button1.Text = "スタート";
|
146
|
-
|
147
149
|
|
148
150
|
|
149
151
|
// 雑いw
|
@@ -162,12 +164,12 @@
|
|
162
164
|
|
163
165
|
timer2.Start();
|
164
166
|
|
167
|
+
button1.Text = "ストップ";
|
168
|
+
|
165
169
|
button2.Enabled = false;
|
166
170
|
|
167
171
|
button3.Enabled = true;
|
168
172
|
|
169
|
-
button1.Text = "ストップ";
|
170
|
-
|
171
173
|
}
|
172
174
|
|
173
175
|
}
|