DataGridView は通常文字数での入力制限です。
しかし、対してデータベースはバイト数の桁数となっていますので、
バイト数の入力制限がDataGridViewにも必要です。
その場合、以下のコードでバイト数制限が可能です。
#Region "バイト数文字制限"
'''
''' テキスト変更時のイベントハンドラを追加
'''
''' ''' ''' EditingControlが表示された時の処理
Private Sub CommonDataGridView_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles Me.EditingControlShowing
Select Case True
Case TypeOf e.Control Is DataGridViewTextBoxEditingControl, TypeOf e.Control Is DataGridViewComboBoxEditingControl
'TextChangedイベントハンドラを追加
AddHandler EditingControl.TextChanged, AddressOf EditingControl_TextChanged
End Select
End Sub
Private Sub EditingControl_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Select Case True
' TextBox
Case TypeOf Me.FindForm.ActiveControl Is DataGridViewTextBoxEditingControl
Dim EditingControl As DataGridViewTextBoxEditingControl
EditingControl = DirectCast(Me.FindForm.ActiveControl, DataGridViewTextBoxEditingControl)
Dim CurrentCell As DataGridViewTextBoxCell
CurrentCell = DirectCast(Me.CurrentCell, DataGridViewTextBoxCell)
Dim ValueByteCount As Integer
ValueByteCount = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(EditingControl.Text)
If ValueByteCount > CurrentCell.MaxInputLength Then
EditingControl.Text = LeftB(EditingControl.Text, CurrentCell.MaxInputLength)
EditingControl.SelectionStart = EditingControl.TextLength
End If
' ComboBox
Case TypeOf Me.FindForm.ActiveControl Is DataGridViewComboBoxEditingControl
' 必要の都度、型ごとに増やしていく
End Select
End Sub
' 左からバイト数で文字列を取得 これは他の共通クラスで持たせてください。
Private Function LeftB(ByVal value As String, ByVal length As Integer) As String
Dim enc As System.Text.Encoding
enc = System.Text.Encoding.GetEncoding("Shift_JIS")
Dim bytes As Byte()
bytes = enc.GetBytes(value.PadRight(length))
Return enc.GetString(bytes, 0, length)
End Function
#End Region
動きとしては、DataGridViewで、編集状態に入った時に
EditingControl が生成(?)されます。
その時のイベントでEditingControlにテキストチェンジのイベントを与えます。
そこで入力制限をすれば各セルにバイト制限持たせられます。
0 件のコメント:
コメントを投稿