前提・実現したいこと
実現したいこと
- DataGridViewの列ごとに入力制限をかけたい。
- 現在は新規行の編集時に入力制限が期待通りに動かない。
前提
- DBから取得したレコードをListからDataTable型に変換し、DataSourceにバインド
- コンボボックスでテーブル名を選択すると、選択したテーブルのレコード一覧を表示する
- 主キーの値は編集不可、新規行のときは入力可能
- データを変更、追加後更新ボタンを押すことでDBのレコードを更新、追加を行う
- int型には数字のみ、decimal型は数字と小数点1つを入力可能とする
- 入力できない文字は入力を受け付けない
- テーブルは以下のイメージ
Table1
列1(主キー) | 列2 | 列3 |
---|---|---|
int | decimal | decimal |
Table2
列1(主キー) | 列2 | 列3 |
---|---|---|
String | int | decimal |
Table3
列1(主キー) | 列2 | 列3 |
---|---|---|
decimal | int | String |
発生している問題・エラーメッセージ
新規行に入力する際に入力制限がうまくいかない
該当のソースコード
現在手元にソースコードがないため大まかなものになります
c#
1private void dataGridView1_EditingControlShowing(object sender, 2 DataGridViewEditingControlShowingEventArgs e) 3{ 4 DataGridView dgv = (DataGridView)sender; 5 6 //編集のために表示されているコントロールを取得 7 DataGridViewTextBoxEditingControl tb = 8 (DataGridViewTextBoxEditingControl)e.Control; 9 10 //イベントハンドラを削除 11 tb.KeyPress -= 12 new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 13 14 15 if (コンボボックスのテキストが"Table1"の時) 16 { 17 //KeyPressイベントハンドラを追加 18 tb.KeyPress += 19 new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 20 } 21 22 if (コンボボックスのテキストが"Table2"の時) 23 { 24 if(列2、列3の時) 25 { 26 //KeyPressイベントハンドラを追加 27 tb.KeyPress += 28 new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 29 } 30 } 31 32 if (コンボボックスのテキストが"Table3"の時) 33 { 34 if(列1、列2の時) 35 { 36 //KeyPressイベントハンドラを追加 37 tb.KeyPress += 38 new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 39 } 40 } 41} 42 43//DataGridViewに表示されているテキストボックスのKeyPressイベントハンドラ 44private void textBox1_KeyPress( object sender, KeyPressEventArgs e ) { 45 // 制御文字は入力可 46 if ( char.IsControl(e.KeyChar) ) { 47 e.Handled = false; 48 return; 49 } 50 51 // 数字(0-9)は入力可 52 if ( char.IsDigit(e.KeyChar) ) { 53 e.Handled = false; 54 return; 55 } 56 if(現在のセルのタイプがdecimalだった場合){ 57 // 小数点は1つだけ入力可 58 if ( e.KeyChar == '.') { 59 TextBox target = sender as TextBox; 60 if ( target.Text.IndexOf('.') < 0 ) { 61 // 複数のピリオド入力はNG 62 e.Handled = false; 63 return; 64 } 65 } 66 } 67 68 // 上記以外は入力不可 69 e.Handled = true; 70} 71
試したこと
記載したコードだと、更新(変更)の際の入力制限は期待どおりですが
新規行の時に、数字のみしか入力ができません。
新規行のタイプがすべてInt32となっていました。
補足情報(FW/ツールのバージョンなど)
.NetFrameWork4.8
SQLServer 2017
VisualStudio
初心者で間違いや不足等あると思います。
追記すべきこと等ありましたら教えていただきたく思います。
よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー