ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: VB.net : キーイベント
名前: lightbox
処理選択
パスワード

件名 VB.net : キーイベント
名前 lightbox
コメント
  [[キー イベントは次の順序で発生します]]
@DIV
1.KeyDown

2.KeyPress

3.KeyUp
@END

KeyPress イベントは、文字以外のキーによっては発生しませんが、
文字以外のキーは KeyDown イベントと KeyUp イベントを発生させます。
※ 例えば、Delete は KeyPress では通知されません


  [[以下、基本的なキーの受け方]]
@DIV
Public Class Form1

	Private Sub TextBox1_KeyDown(ByVal sender As System.Object, _
	   ByVal e As System.Windows.Forms.KeyEventArgs) _
	   Handles TextBox1.KeyDown

		Console.WriteLine("KeyDown:" + e.KeyCode.ToString())

		' Enter
		If e.KeyCode = Keys.Enter Then
			Console.WriteLine("Enter")
		End If

		' Delete
		If e.KeyCode = Keys.Delete Then
			Console.WriteLine("Delete")
		End If

	End Sub

	Private Sub TextBox1_KeyPress(ByVal sender As System.Object, _
	   ByVal e As System.Windows.Forms.KeyPressEventArgs) _
	   Handles TextBox1.KeyPress

		Dim b As Byte() = System.Text.Encoding.Unicode.GetBytes(e.KeyChar)
		Console.WriteLine("KeyPress:" + b(0).ToString("X"))

		' Enter
		If e.KeyChar = ControlChars.Cr Then
			Console.WriteLine("Enter")
		End If


	End Sub

	Private Sub TextBox1_KeyUp(ByVal sender As System.Object, _
	   ByVal e As System.Windows.Forms.KeyEventArgs) _
	   Handles TextBox1.KeyUp

		Console.WriteLine("KeyUp:" + e.KeyCode.ToString())

		' Enter
		If e.KeyCode = Keys.Enter Then
			Console.WriteLine("Enter")
		End If

		' Delete
		If e.KeyCode = Keys.Delete Then
			Console.WriteLine("Delete")
		End If

		Console.WriteLine("---------------------")

	End Sub

End Class
@END

@DIV
Tab は、画面内の移動キーに使用されているので特殊です
他のフィールドから Tab で移って来た時のみ KeyUp で通知されます
@END

@C:red(
e.Handled = True 
)
を KeyPress イベントで設定すると、入力した値がフィールドに表示されなくなります
以下は、イベントの順序を利用して、KeyDown で表示しない文字を決定しています

@DIV
@C:red(Private bCancel As Boolean = False)

Private Sub TextBox1_KeyDown(ByVal sender As System.Object, _
   ByVal e As System.Windows.Forms.KeyEventArgs) _
   Handles TextBox1.KeyDown

	' Aを入力できないようにするフラグを設定する
	If e.KeyCode = Keys.A Then
		@C:red(bCancel) = True
	End If


End Sub

Private Sub TextBox1_KeyPress(ByVal sender As System.Object, _
   ByVal e As System.Windows.Forms.KeyPressEventArgs) _
   Handles TextBox1.KeyPress

	If @C:red(bCancel) Then
		@C:red(e.Handled = True)
		@C:red(bCancel) = False
	End If

End Sub
@END


@C:red(
フォームの KeyPreview プロパティを True にすると、各フィールドへ通知
する前にフォームにイベントが送られるようになるので、一括でコントロール
が可能になります 
)

  [[以下はフォーム上のすべての入力フィールドで A が入力できなくなります]]
@DIV
Private Sub @C:red(Form1_Load)|(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles MyBase.Load

	Me.@C:red(KeyPreview) = True

End Sub

Private Sub @C:red(Form1_KeyDown)|(ByVal sender As System.Object, _
   ByVal e As System.Windows.Forms.KeyEventArgs) _
   Handles MyBase.KeyDown

	Console.WriteLine("FormKeyDown:" + e.KeyCode.ToString())

	' Aを全てのフィールドで入力できないようにするフラグを設定する
	If e.KeyCode = Keys.A Then
		bCancel = True
	End If

End Sub

Private Sub @C:red(Form1_KeyPress)|(ByVal sender As System.Object, _
   ByVal e As System.Windows.Forms.KeyPressEventArgs) _
   Handles MyBase.KeyPress

	Dim b As Byte() = System.Text.Encoding.Unicode.GetBytes(e.KeyChar)
	Console.WriteLine("FormKeyPress:" + b(0).ToString("X"))

	If bCancel Then
		e.Handled = True
		bCancel = False
	End If

End Sub
@END


  [[ユーザーコントロールを作成しての実装例]]
@DIV
' ****************************************************** 
' 対象文字列以外は入力不可にする
' ****************************************************** 
Private Sub LboxText_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress

	' YYYY/MM/DD と先行ゼロは仕様的に数字入力
	If Me._DataType = 1 Or Me._DataType = 2 Then
		If (ControlChars.Back + _
		 "0123456789").IndexOf(e.KeyChar.ToString()) < 0 Then
			e.Handled = True
		Else
			Return
		End If
	End If

	' 正の数以外が仕様に加わった時の為に処理を分ける
	If Me._DataType = 3 Then
		If (ControlChars.Back + _
		 "0123456789").IndexOf(e.KeyChar.ToString()) < 0 Then
			e.Handled = True
		Else
			Return
		End If
	End If

	If Me._AllowChar <> "" Then
		If (ControlChars.Back + _
		 Me._AllowChar).IndexOf(e.KeyChar.ToString()) < 0 Then
			e.Handled = True
		End If
	End If

End Sub
@END

  [[以下は DataType プロパティの定義]]
@DIV
Private _DataType As Integer = 0
<System.ComponentModel.Description( _
 "DataTypeの値がデフォルトの場合のみ" & Chr(10) & _
 " DataTypeJで変更できます" & Chr(10) & _
 "0:文字列" & Chr(10) & _
 "1:YYYY/MM/DD" & Chr(10) & _
 "2:先行ゼロ文字列(長さはMaxLengthで指定)" & Chr(10) & _
 "3:カンマ編集(String.Formatで使用する文字列を EditFormat で指定)" _
 ), _
 System.ComponentModel.DefaultValue(0)> _
  Public Property DataType() As Integer
	Get
		Return _DataType
	End Get
	Set(ByVal value As Integer)
		_DataType = value
	End Set
End Property
@END

  [[文字列の場合の入力制限プロパティ]]
@DIV
' ****************************************************** 
' カスタム入力制限
' ****************************************************** 
Private _AllowChar As String = ""
<System.ComponentModel.Description("セットした文字列のみ入力可能とする"), _
  System.ComponentModel.DefaultValue("")> _
 Public Property AllowChar() As String
	Get
		Return _AllowChar
	End Get
	Set(ByVal value As String)
		_AllowChar = value
	End Set
End Property
@END