DataGridView は通常文字数での入力制限です。
しかし、対してデータベースはバイト数の桁数となっていますので、
バイト数の入力制限がDataGridViewにも必要です。
その場合、以下のコードでバイト数制限が可能です。
- #Region "バイト数文字制限"
- ''' <summary>
- ''' テキスト変更時のイベントハンドラを追加
- ''' </summary>
- ''' <param name="sender">''' <param name="e">''' <remarks>EditingControlが表示された時の処理</remarks>
- 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 件のコメント:
コメントを投稿