質問編集履歴

4

誤字

2018/05/30 02:02

投稿

xlostdjx
xlostdjx

スコア39

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ```C#
2
2
 
3
- 答えのあったページからコピペをし、変数などを揃えてビルドしても適用されません。
3
+ 答えのあったページからコピペをし、変数などを揃えてビルドしても小数点が制御できません。
4
4
 
5
5
  エラーもないのでどこがわるいのかわからなく困っています。
6
6
 
@@ -18,6 +18,44 @@
18
18
 
19
19
 
20
20
 
21
+
22
+
23
+
24
+
25
+       //身長のテキストボックス入力時
26
+
27
+ private void textHeight_KeyPress(object sender, KeyPressEventArgs e)
28
+
29
+ {
30
+
31
+
32
+
33
+ //.KeyChar = 押されたキーに対応する文字を取得または設定します。
34
+
35
+ //数値と小数点とバックスペース以外の入力は不可
36
+
37
+ if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b' && e.KeyChar != '.')
38
+
39
+ {
40
+
41
+
42
+
43
+ //.Handled = 取得またはを示す値を設定するかどうか、 KeyPress イベントが処理します。
44
+
45
+ e.Handled = true;
46
+
47
+ //e.Handled = Trueと入れると、キャンセルできる。
48
+
49
+ }
50
+
51
+ }
52
+
53
+
54
+
55
+
56
+
57
+
58
+
21
59
  /*イベントが呼び出される順番が KeyDown→TextChanged→KeyUp なので
22
60
 
23
61
   KeyDownイベントを使用します。*/
@@ -52,13 +90,19 @@
52
90
 
53
91
 
54
92
 
93
+
94
+
95
+
96
+
97
+
98
+
55
99
  //整数部桁数
56
100
 
57
101
  private readonly int LENGTH_INT_PART = 7;
58
102
 
59
103
  //小数部桁数
60
104
 
61
- private readonly int LENGTH_DECIMAL_PLACES = 1;
105
+ private readonly int LENGTH_DECIMAL_PLACES = 2;
62
106
 
63
107
 
64
108
 

3

改善

2018/05/30 02:02

投稿

xlostdjx
xlostdjx

スコア39

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,8 @@
1
1
  ```C#
2
2
 
3
- テキストボックスを小数点第一位までしか入力をできなくする(小数点第二位からは入力させない)を指定したのですがわかりません。どうすればいいですか??**ボールドテキスト**
4
-
5
- 点も 例(123.1)と一度しか打てくする方法えていただきたいです。**ボールドテキスト**
3
+ 答えのあっページからコピペをし、変数なえてルドしても適用されません。
6
-
4
+
7
- よろしお願ます。
5
+ エラーもないのでどこがわるいのかわからな困っています。
8
6
 
9
7
 
10
8
 
@@ -12,306 +10,458 @@
12
10
 
13
11
 
14
12
 
15
- このようにはじめに入力不可を指定してここから
16
-
17
- 小数点第一位まで入力を可能にするという条件をいれたいのですが
18
-
19
- サイト等をみてもいまいちな感じで
20
-
21
- 答えをいてだけると それをもとに コードを訳していって覚えるのが自分のやり方なので
22
-
23
-  改善策を教えていただきたいです。 
24
-
25
-
26
-
27
-
28
-
29
- //身長テキストボックス入力
13
+ // 数値み小数点第一位まで入力が可能であること。
14
+
30
-
15
+ //----------------------------------------------------------------------------------------
16
+
17
+
18
+
19
+
20
+
21
+ /*イベントが呼び出される順番が KeyDown→TextChanged→KeyUp なので
22
+
23
+  KeyDownイベントを使用します。*/
24
+
25
+
26
+
27
+
28
+
29
+ //DeleteキーやBackSpaceが押されたかどうかを判断。
30
+
31
+ bool isDelete = false;
32
+
33
+
34
+
31
- private void textHeight_KeyPress(object sender, KeyPressEventArgs e)
35
+ private void textHeight_KeyDown(object sender, KeyEventArgs e)
32
36
 
33
37
  {
34
38
 
35
- //.KeyChar = 押されたキーに対応する文字を取得または設定します。
39
+ isDelete = (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back);
40
+
36
-
41
+ }
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
37
- //数値とバックスペース以外の入力は不可
55
+ //部桁数
56
+
38
-
57
+ private readonly int LENGTH_INT_PART = 7;
58
+
59
+ //小数部桁数
60
+
61
+ private readonly int LENGTH_DECIMAL_PLACES = 1;
62
+
63
+
64
+
39
- if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b' && e.KeyChar != '.')
65
+ private void textHeight_TextChanged(object sender, EventArgs e)
66
+
67
+ {
68
+
69
+ var txtBox = sender as TextBox;
70
+
71
+
72
+
73
+ txtBox.TextChanged -= textHeight_TextChanged;
74
+
75
+
76
+
77
+ try
40
78
 
41
79
  {
42
80
 
43
-
44
-
45
- //.Handled = 取得またはを示す値を設定するかどうか、 KeyPress イベントが処理します。
46
-
47
- e.Handled = true;
48
-
49
- //e.Handled = True入れと、キャンセルできる。
81
+ if (!string.IsNullOrWhiteSpace(txtBox.Text))
82
+
83
+ {
84
+
85
+ var value = txtBox.Text;
86
+
87
+ //整数小数を分割す
88
+
89
+ string[] values = value.Split('.');
90
+
91
+
92
+
93
+ int currentPoint = 0;
94
+
95
+ switch (values.Length)
96
+
97
+ {
98
+
99
+ case 1:
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+ //------------------------------
112
+
113
+ //整数部のみで構成されている場合
114
+
115
+ //------------------------------
116
+
117
+ //整数部の最大桁数を超えた場合、今回の入力値を無効にする
118
+
119
+ if (value.Length > LENGTH_INT_PART)
120
+
121
+ {
122
+
123
+ //DELETEやBackSpaceによる削除で桁あふれが発生しているなら
124
+
125
+ //小数点の削除によるものなので、先頭桁から削除する
126
+
127
+ if (isDelete)
128
+
129
+ {
130
+
131
+ txtBox.Text = value.Substring(value.Length - LENGTH_INT_PART);
132
+
133
+
134
+
135
+ //カーソル位置を移動
136
+
137
+ if (currentPoint - (values.Length - LENGTH_INT_PART) >= 0)
138
+
139
+ {
140
+
141
+ txtBox.SelectionStart = currentPoint -
142
+
143
+ (values.Length - LENGTH_INT_PART);
144
+
145
+ }
146
+
147
+ else
148
+
149
+ {
150
+
151
+ txtBox.SelectionStart = 0;
152
+
153
+ }
154
+
155
+ }
156
+
157
+ else
158
+
159
+ {
160
+
161
+ //入力後の現カーソル位置を取得
162
+
163
+ currentPoint = txtBox.SelectionStart;
164
+
165
+
166
+
167
+ //カーソル位置の前の1文字が今回入力された文字、
168
+
169
+ //よって、それを省いた文字列に編集する
170
+
171
+ var left = value.Substring(0
172
+
173
+ , currentPoint > LENGTH_INT_PART
174
+
175
+ ? LENGTH_INT_PART : currentPoint - 1);
176
+
177
+ var right = left.Length >= LENGTH_INT_PART
178
+
179
+ ? "" : value.Substring(currentPoint);
180
+
181
+ txtBox.Text = left + right;
182
+
183
+
184
+
185
+ //カーソル位置を入力前の位置に戻す
186
+
187
+ txtBox.SelectionStart = currentPoint - 1;
188
+
189
+ }
190
+
191
+ }
192
+
193
+ break;
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+ //--------------------------------------------------------------------------------------------------------------------------------------
208
+
209
+ case 2:
210
+
211
+
212
+
213
+ //----------------------------------
214
+
215
+ //整数部+小数部で構成されている場合
216
+
217
+ //----------------------------------
218
+
219
+ //入力後の現カーソル位置を取得
220
+
221
+ currentPoint = txtBox.SelectionStart;
222
+
223
+
224
+
225
+ //今回の入力値が"."の場合、小数点を基準点として桁あふれ分を除外する
226
+
227
+ if (value.Substring(currentPoint - 1, 1) == ".")
228
+
229
+ {
230
+
231
+ //=== 整数部の処理 ===
232
+
233
+ var intPart = values[0];
234
+
235
+ if (values[0].Length > LENGTH_INT_PART)
236
+
237
+ {
238
+
239
+ intPart = values[0].Substring(LENGTH_INT_PART - values[0].Length);
240
+
241
+ }
242
+
243
+
244
+
245
+ //=== 小数部の処理 ===
246
+
247
+ var decimalPart = values[1];
248
+
249
+ if (values[1].Length > LENGTH_DECIMAL_PLACES)
250
+
251
+ {
252
+
253
+ decimalPart = values[1].Substring(0, LENGTH_DECIMAL_PLACES);
254
+
255
+ }
256
+
257
+
258
+
259
+ //整数と小数を結合
260
+
261
+ if (values[0].Length > LENGTH_INT_PART || values[1].Length > LENGTH_DECIMAL_PLACES)
262
+
263
+ {
264
+
265
+ txtBox.Text = string.Format("{0}.{1}", intPart, decimalPart);
266
+
267
+
268
+
269
+ //小数点入力時なら小数点の後ろにカーソルをセット
270
+
271
+ txtBox.SelectionStart = value.IndexOf(".") + 1;
272
+
273
+ }
274
+
275
+ }
276
+
277
+ else
278
+
279
+ {
280
+
281
+ //=== 整数部の処理 ===
282
+
283
+ var intPart = values[0];
284
+
285
+ if (values[0].Length > LENGTH_INT_PART)
286
+
287
+ {
288
+
289
+ //カーソル位置の前の1文字が今回入力された文字、
290
+
291
+ //よって、それを省いた文字列に編集する
292
+
293
+ var left = values[0].Substring(0
294
+
295
+ , currentPoint > LENGTH_INT_PART
296
+
297
+ ? LENGTH_INT_PART : currentPoint - 1);
298
+
299
+ var right = left.Length >= LENGTH_INT_PART
300
+
301
+ ? "" : values[0].Substring(currentPoint);
302
+
303
+
304
+
305
+ //桁数調整後の整数部文字列
306
+
307
+ intPart = left + right;
308
+
309
+ }
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ //=== 小数部の処理 ===
326
+
327
+ var decimalPart = values[1];
328
+
329
+ if (values[1].Length > LENGTH_DECIMAL_PLACES)
330
+
331
+ {
332
+
333
+ //整数部と小数点を除いたときのカーソル位置を算出
334
+
335
+ var tempPoint = currentPoint - values[0].Length - 1;
336
+
337
+ //カーソル位置の前の1文字を除外する
338
+
339
+ var left = values[1].Substring(0
340
+
341
+ , tempPoint > LENGTH_DECIMAL_PLACES
342
+
343
+ ? LENGTH_DECIMAL_PLACES : tempPoint - 1);
344
+
345
+ var right = left.Length >= LENGTH_DECIMAL_PLACES
346
+
347
+ ? "" : values[1].Substring(tempPoint);
348
+
349
+
350
+
351
+ //桁数調整後の小数部文字列
352
+
353
+ decimalPart = left + right;
354
+
355
+ }
356
+
357
+
358
+
359
+ //整数と小数を結合
360
+
361
+ if (values[0].Length > LENGTH_INT_PART || values[1].Length > LENGTH_DECIMAL_PLACES)
362
+
363
+ {
364
+
365
+ txtBox.Text = string.Format("{0}.{1}", intPart, decimalPart);
366
+
367
+
368
+
369
+ //カーソル位置を入力前の位置に戻す
370
+
371
+ txtBox.SelectionStart = currentPoint - 1;
372
+
373
+ }
374
+
375
+ }
376
+
377
+
378
+
379
+ break;
380
+
381
+
382
+
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+ default:
392
+
393
+ //"."で文字列を分割したときに3以上になるのなら、
394
+
395
+ //既に"."が存在しているのに今回"."が入力されたことを示す
396
+
397
+ //よって、今回の入力を無効にしてしまう。
398
+
399
+ {
400
+
401
+ currentPoint = txtBox.SelectionStart;
402
+
403
+ var left = value.Substring(0, currentPoint - 1);
404
+
405
+ var right = value.Substring(currentPoint);
406
+
407
+ txtBox.Text = left + right;
408
+
409
+ txtBox.SelectionStart = currentPoint - 1;
410
+
411
+ }
412
+
413
+ break;
414
+
415
+ }
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+ //先頭が小数点なら先頭に 0 を入れる
426
+
427
+ if (txtBox.Text.StartsWith("."))
428
+
429
+ {
430
+
431
+ currentPoint = txtBox.SelectionStart;
432
+
433
+ txtBox.Text = "0" + txtBox.Text;
434
+
435
+ txtBox.SelectionStart = currentPoint + 1;
436
+
437
+ }
438
+
439
+ }
50
440
 
51
441
  }
52
442
 
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-     このように置き換えたのですが
90
-
91
- 数値とバックスペース以外の入力は不可にする事が反映されなくなりました。
92
-
93
- なにがおかしいのでしょうか?
94
-
95
-
96
-
97
- private void txtWeight_KeyPress_1(object sender, KeyPressEventArgs e)
98
-
99
- {
100
-
101
-
102
-
103
- string a = textWeight.Text;
443
+ catch (Exception ex)
104
-
105
- string[] b = a.Split('.'); //165.5
106
-
107
- if (b.Length > 1) //  aはbより大きい = 5(桁) > 1
108
444
 
109
445
  {
110
446
 
111
-
112
-
113
- //.KeyChar = 押されたキーに対応する文字を取得または設定します。
114
-
115
- //数値とバックスペース以外の入力は不可
116
-
117
- if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b')
118
-
119
- {
120
-
121
-
122
-
123
- //.Handled = 取得またはを示す値を設定するかどうか、 KeyPress イベントが処理します。
124
-
125
- e.Handled = true;
126
-
127
- //e.Handled = Trueと入れると、キャンセルできる。
128
-
129
-
130
-
131
- }
132
-
133
-
134
-
135
- /* .Length をつけると [] 配列の長さを習得する。
136
-
137
-       * 例 dg[0].Length = Textに165.5があるとして 
138
-
139
-    * [0]のなかには165がはいって その長さを習得するので 165 の 3桁 = 3 が習得される。
140
-
141
-   * [1] だと 5 なので 1桁 = 1 が習得される。 */
142
-
143
- else if (b[1].Length == 1)
447
+ Console.Error.WriteLine(ex);
144
-
145
- {
146
-
147
-
148
-
149
- //.Handled = 取得またはを示す値を設定するかどうか、 KeyPress イベントが処理します。
150
-
151
- e.Handled = false;
152
-
153
-
154
-
155
- }
156
-
157
-
158
448
 
159
449
  }
160
450
 
451
+ finally
452
+
453
+ {
454
+
455
+ txtBox.TextChanged += textHeight_TextChanged;
456
+
457
+ }
458
+
459
+
460
+
461
+
462
+
463
+
464
+
465
+
466
+
161
467
  }
162
-
163
-
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
178
-
179
-
180
-
181
-
182
-
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
199
-
200
-
201
-     /// <summary>
202
-
203
- /// 数字とバックスペース以外の入力を無効にしたTextBox
204
-
205
- /// </summary>
206
-
207
- //TextBox1のKeyPressイベントハンドラ
208
-
209
- private void TextHeight_KeyPress(object sender, KeyPressEventArgs e)
210
-
211
- {
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
- //KeyCharはタイプしたキーの値を保管するプロパティ
220
-
221
-
222
-
223
-
224
-
225
-
226
-
227
- //小数点使用可能とする
228
-
229
- if (e.KeyChar == '.')
230
-
231
- {
232
-
233
- return;
234
-
235
- }
236
-
237
-
238
-
239
- //0~9と、バックスペース以外のときは、イベントをキャンセルする。
240
-
241
- if ((e.KeyChar < '0' || '9' < e.KeyChar) && e.KeyChar != '\b')
242
-
243
- {
244
-
245
- e.Handled = true;
246
-
247
- }
248
-
249
-
250
-
251
-
252
-
253
-
254
-
255
- }
256
-
257
-
258
-
259
-
260
-
261
-
262
-
263
-
264
-
265
-
266
-
267
-
268
-
269
-
270
-
271
- /// <summary>
272
-
273
- /// 数字とバックスペース以外の入力を無効にしたTextBox
274
-
275
- /// </summary>
276
-
277
- //TextBox2のKeyPressイベントハンドラ
278
-
279
- private void TextWeight_KeyPress(object sender, KeyPressEventArgs e)
280
-
281
- {
282
-
283
-
284
-
285
- //小数点使用可能とする
286
-
287
- if (e.KeyChar == '.')
288
-
289
- {
290
-
291
- return;
292
-
293
- }
294
-
295
-
296
-
297
- //0~9と、バックスペース以外のときは、イベントをキャンセルする。
298
-
299
- if ((e.KeyChar < '0' || '9' < e.KeyChar) && e.KeyChar != '\b')
300
-
301
- {
302
-
303
- e.Handled = true;
304
-
305
- }
306
-
307
-
308
-
309
-
310
-
311
- }
312
-
313
-
314
-
315
-
316
-
317
- ```

2

改善

2018/05/30 01:40

投稿

xlostdjx
xlostdjx

スコア39

test CHANGED
File without changes
test CHANGED
@@ -12,6 +12,80 @@
12
12
 
13
13
 
14
14
 
15
+ このようにはじめに入力不可を指定してここから
16
+
17
+ 小数点第一位まで入力を可能にするという条件をいれたいのですが
18
+
19
+ サイト等をみてもいまいちな感じで
20
+
21
+ 答えをいてだけると それをもとに コードを訳していって覚えるのが自分のやり方なので
22
+
23
+  改善策を教えていただきたいです。 
24
+
25
+
26
+
27
+
28
+
29
+ //身長のテキストボックス入力時
30
+
31
+ private void textHeight_KeyPress(object sender, KeyPressEventArgs e)
32
+
33
+ {
34
+
35
+ //.KeyChar = 押されたキーに対応する文字を取得または設定します。
36
+
37
+ //数値とバックスペース以外の入力は不可
38
+
39
+ if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b' && e.KeyChar != '.')
40
+
41
+ {
42
+
43
+
44
+
45
+ //.Handled = 取得またはを示す値を設定するかどうか、 KeyPress イベントが処理します。
46
+
47
+ e.Handled = true;
48
+
49
+ //e.Handled = Trueと入れると、キャンセルできる。
50
+
51
+ }
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
15
89
      このように置き換えたのですが
16
90
 
17
91
  数値とバックスペース以外の入力は不可にする事が反映されなくなりました。

1

改善点

2018/05/29 08:46

投稿

xlostdjx
xlostdjx

スコア39

test CHANGED
File without changes
test CHANGED
@@ -12,6 +12,118 @@
12
12
 
13
13
 
14
14
 
15
+     このように置き換えたのですが
16
+
17
+ 数値とバックスペース以外の入力は不可にする事が反映されなくなりました。
18
+
19
+ なにがおかしいのでしょうか?
20
+
21
+
22
+
23
+ private void txtWeight_KeyPress_1(object sender, KeyPressEventArgs e)
24
+
25
+ {
26
+
27
+
28
+
29
+ string a = textWeight.Text;
30
+
31
+ string[] b = a.Split('.'); //165.5
32
+
33
+ if (b.Length > 1) //  aはbより大きい = 5(桁) > 1
34
+
35
+ {
36
+
37
+
38
+
39
+ //.KeyChar = 押されたキーに対応する文字を取得または設定します。
40
+
41
+ //数値とバックスペース以外の入力は不可
42
+
43
+ if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b')
44
+
45
+ {
46
+
47
+
48
+
49
+ //.Handled = 取得またはを示す値を設定するかどうか、 KeyPress イベントが処理します。
50
+
51
+ e.Handled = true;
52
+
53
+ //e.Handled = Trueと入れると、キャンセルできる。
54
+
55
+
56
+
57
+ }
58
+
59
+
60
+
61
+ /* .Length をつけると [] 配列の長さを習得する。
62
+
63
+       * 例 dg[0].Length = Textに165.5があるとして 
64
+
65
+    * [0]のなかには165がはいって その長さを習得するので 165 の 3桁 = 3 が習得される。
66
+
67
+   * [1] だと 5 なので 1桁 = 1 が習得される。 */
68
+
69
+ else if (b[1].Length == 1)
70
+
71
+ {
72
+
73
+
74
+
75
+ //.Handled = 取得またはを示す値を設定するかどうか、 KeyPress イベントが処理します。
76
+
77
+ e.Handled = false;
78
+
79
+
80
+
81
+ }
82
+
83
+
84
+
85
+ }
86
+
87
+ }
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
15
127
      /// <summary>
16
128
 
17
129
  /// 数字とバックスペース以外の入力を無効にしたTextBox