2

Integerとして定義された 1+16 列を持つDataTableにバインドされたDataGridViewがあります。

デフォルトのセル スタイルは 16 進数 2 桁 ( .Format="X2") です。

セル編集に入るときに、ユーザーに提供したいのは、値を 10 進数または 16 進数で書き込む機能です。

  1. 16 進数は、たとえば、0x00、0X01、x02、XFF のように記述できます。
  2. 0、1、2、15 などの 10 進数

このため、EditingControlShowingでは、TextBox の値に「0x」を追加します。

Private Sub BankGrid_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs)

    Dim grid As DataGridView = DirectCast(sender, DataGridView)
    If Not TypeOf e.Control Is TextBox Then Return

    Dim tb As TextBox = DirectCast(e.Control, TextBox)
    tb.Text = "0x" & tb.Text

    RemoveHandler tb.KeyPress, AddressOf TextBox_KeyPress
    AddHandler tb.KeyPress, AddressOf TextBox_KeyPress

End Sub

TextBox_KeyPressサブでは、無効な入力を避けるためにすべての入力フィルタリングを実行します。

私が理解できないのは、編集が終了したときに検出するためにどのイベントに添付すればよいかということです。「0x」を削除できるように、 EditingControlShowingとは反対のものが欲しいのですが、見つかりませんでした。

4

2 に答える 2

1

TextBoxとDataGRidViewの両方で考えられるすべてのイベントを試した後、私はついに自分のケースに役立つイベントを見つけました。

CellParsing

私は自分のコードをコピーします多分それは他の誰かを助けるかもしれません:)

   Private Sub BankGrid_CellParsing(ByVal sender As Object, ByVal e As DataGridViewCellParsingEventArgs)

        Dim grid As DataGridView = DirectCast(sender, DataGridView)
        Dim cell As CustomCell = DirectCast(grid(e.ColumnIndex, e.RowIndex), CustomCell)

        If e.Value Is Nothing OrElse String.IsNullOrEmpty(e.Value.ToString) Then
            e.Value = cell.Value
        Else

            Dim iValue As Integer
            If TryParseNumeric(e.Value.ToString, iValue) Then

                If iValue >= 0 AndAlso iValue <= &HFF Then
                    e.Value = iValue  'value inside the range, accept it'
                Else
                    e.Value = cell.Value 'value outside the range, reload old value'
                End If

            Else                    
                e.Value = cell.Value 'invalid input, reload old value'
            End If

        End If

        e.ParsingApplied = True

    End Sub
于 2010-06-17T14:27:01.210 に答える
0

gridView actionevent CellValueChanged を使用します。それが遅すぎる場合は、CellValueChanging を使用します

于 2010-06-16T15:34:02.443 に答える