DataGridViewにて、列ごとに入力制御を設けるために作成しました。
DataGridには、ボタンやコンボボックスの列があるため、イベントをとる
列を指定しています。
Private TextEditCtrl As DataGridViewTextBoxEditingControl 'DataGridViewのTextBoxセルを宣言
Private Sub DataGridView1_CellEnter(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles DataGrid.CellEnter
Dim columnIndex As Integer = Me.DataGrid.CurrentCell.ColumnIndex
Select Case Me.DataGrid.Columns(columnIndex).Name
Case "日本語" '日本語入力ONにする列
DataGrid.ImeMode = Windows.Forms.ImeMode.Hiragana
Case Else 'IME無効(半角英数のみ)
DataGrid.ImeMode = Windows.Forms.ImeMode.Disable
End Select
End Sub
Private Sub DataGrid_EditingControlShowing( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGrid.EditingControlShowing
Dim columnIndex As Integer = Me.DataGrid.CurrentCell.ColumnIndex
'テキストボックス列のみ適用
Select Case Me.DataGrid.Columns(columnIndex).Name
Case "日本語", "重さ", "数字", "秒"
TextEditCtrl = CType(e.Control, DataGridViewTextBoxEditingControl)
AddHandler TextEditCtrl.KeyPress, AddressOf TextEditCtrl_KeyPress
Case Else
End Select
End Sub
Private Sub TextEditCtrl_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
Dim columnIndex As Integer = Me.請求明細DataGridCommon.CurrentCell.ColumnIndex
Select Case Me.請求明細DataGridCommon.Columns(columnIndex).Name
Case "数字" '数値のみ許可
Select Case e.KeyChar
Case Chr(Keys.Back) 'BackSpace
Case Chr(Keys.D0) To Chr(Keys.D9) '数値キー
Case Else
'上記キー以外は処理しないようにする
e.Handled = True
End Select
Case "重さ" '数値とマイナスを許可
Select Case e.KeyChar
Case Chr(Keys.Back) 'BackSpace
Case Chr(Keys.D0) To Chr(Keys.D9) '数値キー
'Case Chr(Keys.NumPad0) To Chr(Keys.NumPad9)
Case "-"c
Case Else
'上記キー以外は処理しないようにする
e.Handled = True
End Select
Case "秒" '数値と小数点を許可
Select Case e.KeyChar
Case Chr(Keys.Back) 'BackSpace
Case Chr(Keys.D0) To Chr(Keys.D9) '数値キー
Case Chr(Keys.Decimal)
Case Chr(Keys.Oemcomma)
Case Chr(Keys.OemPeriod)
Case "."c
Case Else
'上記キー以外は処理しないようにする
e.Handled = True
End Select
End Select
End Sub
最後に、CellEndEditイベントにて、RemoveHandler TextEditCtrl.KeyPress, AddressOf TextEditCtrl_KeyPress、
(これもテキストボックス列のみを指定)で終わりです。
このロジックの影響か定かではないのですが、空白が入力できない行や、確定できない
コンボボックスなどが出来てしまい、困っています。
もし修正箇所ありましたら、アドバイスお願いします。
No.1ベストアンサー
- 回答日時:
ハンドラを設定しているグリッドと KeyPressイベントで見ているグリッドは違っていますがこれでいいのですか?
KeyPressイベントはもう少し簡潔に書けると思いますよ
dim ss as String = 請求明細DataGridCommon.Columns(columnIndex).Name
Select Case e.KeyChar
case chr( Keys.Back )
case chr( Keys.D0 ) to chr(Keys.D9)
case "-"
if ss<>"重さ" then
e.handled = True
end if
case ".",Chr(Keys.Decimal), Chr(Keys.Oemcomma), Chr(Keys.OemPeriod)
if ss <> "秒" then
e.handled = True
end if
case else
if ss<>"日本語" then
e.handled = True
end if
End Select
と言った具合です ・・・
私なら WithEventsでオブジェクトを宣言しておき
EditingControlShowingで オブジェクトを代入
CellEndEditで オブジェクトをNothing
オブジェクトのEnterイベントで オブジェクトのImeModeを設定
KeyPressイベントは上記の内容 と言った具合にします
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- Visual Basic(VBA) 先ほど、回答者様によって教えていただいたのですがどうしたらいいか分かりません。 ユーザーフォーム上に 2 2023/02/21 22:25
- Visual Basic(VBA) エクセル VBAについて 2 2022/05/16 16:33
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAでマウスの左クリック...
-
VBA エンターキーでイベントに...
-
アクセスVBAのMe!と[ ]
-
Excel2007 でのチェックボック...
-
ユーザーフォームのインポート...
-
エクセルVBAでセル番地を指定し...
-
日本語の文字化けを直す方法
-
文字列で小数点以下の0を削除し...
-
「SHDocVw」の意味
-
Access からオブジェクトとして...
-
生成AI画像について
-
メルカリのメルカードで買い物...
-
画像をループさせるうまい方法...
-
リストボックスの選択解除
-
VBAでループ内で使う変数名を可...
-
Pythonでgif画像が上手く作れない
-
エクセルVBAで、MsgBox やInput...
-
switch の範囲指定
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アクセスVBAのMe!と[ ]
-
VBA エンターキーでイベントに...
-
【エクセルのマクロ】クリップ...
-
エクセルVBAでセル番地を指定し...
-
Excel2007 でのチェックボック...
-
文字列で小数点以下の0を削除し...
-
日本語の文字化けを直す方法
-
Excel VBAでマウスの左クリック...
-
エクセルのデータをwebフォーム...
-
Access からオブジェクトとして...
-
コードでオブジェクトを最前面に
-
Accessのフォーム上にエクセル...
-
構造体の静的な初期化
-
【エクセル】複数のTextBoxに共...
-
ユーザーフォームのインポート...
-
PowerpointVBAで指定のShapeオ...
-
現在アクティブになっているオ...
-
[C#] DataGridViewの項目名
-
Excel VBA でPictureBoxオブジ...
-
Excelを閉じるときVBAプロジェ...
おすすめ情報