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