2011年1月21日金曜日

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

今回はDataGridViewについてです。

DataGridView は通常文字数での入力制限です。
しかし、対してデータベースはバイト数の桁数となっていますので、
バイト数の入力制限がDataGridViewにも必要です。

その場合、以下のコードでバイト数制限が可能です。

  1. #Region "バイト数文字制限"  
  2.     ''' <summary>  
  3.     ''' テキスト変更時のイベントハンドラを追加  
  4.     ''' </summary>  
  5.     ''' <param name="sender">''' <param name="e">''' <remarks>EditingControlが表示された時の処理</remarks>  
  6.     Private Sub CommonDataGridView_EditingControlShowing(ByVal sender As ObjectByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles Me.EditingControlShowing  
  7.         Select Case True  
  8.             Case TypeOf e.Control Is DataGridViewTextBoxEditingControl, TypeOf e.Control Is DataGridViewComboBoxEditingControl  
  9.                 'TextChangedイベントハンドラを追加  
  10.                 AddHandler EditingControl.TextChanged, AddressOf EditingControl_TextChanged  
  11.   
  12.   
  13.         End Select  
  14.     End Sub  
  15.   
  16.     Private Sub EditingControl_TextChanged(ByVal sender As ObjectByVal e As System.EventArgs)  
  17.   
  18.         Select Case True  
  19.             ' TextBox  
  20.             Case TypeOf Me.FindForm.ActiveControl Is DataGridViewTextBoxEditingControl  
  21.                 Dim EditingControl As DataGridViewTextBoxEditingControl  
  22.                 EditingControl = DirectCast(Me.FindForm.ActiveControl, DataGridViewTextBoxEditingControl)  
  23.                 Dim CurrentCell As DataGridViewTextBoxCell  
  24.                 CurrentCell = DirectCast(Me.CurrentCell, DataGridViewTextBoxCell)  
  25.                 Dim ValueByteCount As Integer  
  26.   
  27.                 ValueByteCount = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(EditingControl.Text)  
  28.                 If ValueByteCount > CurrentCell.MaxInputLength Then  
  29.                     EditingControl.Text = LeftB(EditingControl.Text, CurrentCell.MaxInputLength)  
  30.                     EditingControl.SelectionStart = EditingControl.TextLength  
  31.                 End If  
  32.   
  33.                 ' ComboBox  
  34.             Case TypeOf Me.FindForm.ActiveControl Is DataGridViewComboBoxEditingControl  
  35.                 ' 必要の都度、型ごとに増やしていく  
  36.         End Select  
  37.   
  38.     End Sub  
  39.   
  40.     ' 左からバイト数で文字列を取得 これは他の共通クラスで持たせてください。  
  41.     Private Function LeftB(ByVal value As StringByVal length As IntegerAs String  
  42.         Dim enc As System.Text.Encoding  
  43.         enc = System.Text.Encoding.GetEncoding("Shift_JIS")  
  44.         Dim bytes As Byte()  
  45.         bytes = enc.GetBytes(value.PadRight(length))  
  46.         Return enc.GetString(bytes, 0, length)  
  47.     End Function  
  48. #End Region  

動きとしては、DataGridViewで、編集状態に入った時に
EditingControl が生成(?)されます。
その時のイベントでEditingControlにテキストチェンジのイベントを与えます。
そこで入力制限をすれば各セルにバイト制限持たせられます。

0 件のコメント:

コメントを投稿