2011年1月21日金曜日

【VB.NET】DataGridViewのTextBoxCellで入力バイト数制限をする

今回はDataGridViewについてです。

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 件のコメント:

コメントを投稿