views:

135

answers:

2

I have a DataGridView bound to a DataTable that has 1+16 columns defined as Integer.

The default cell style is hexadecimal 2 digits (.Format="X2").

When entering in cell editing I would like to provide to the user, the possibility to write the value in decimal or hexdacimal.

  1. Hexadecimal could be written like, for example, 0x00, 0X01, x02, XFF
  2. Decimal like 0, 1, 2, 15

For this reason in EditingControlShowing I add "0x" to the TextBox value

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

while in TextBox_KeyPress sub I perform all input filtering to avoid invalid inputs.

What I cannot understand is to which event may I attach to detect when the editing is finished. I would like something opposite to EditingControlShowing so that I can remove "0x" but I didn't found it.

A: 

I would use the gridView actionevent CellValueChanged. If that is too late then use CellValueChanging

Kyra
@Kyra CellValueChanged come too late in my case, and it seemes that CellValueChanging does not exist
marco.ragogna
@marco.ragogna Sorry I was looking at the DevExpress version of datagridview. I would go through the possible actionlisteners you can use with the datagridview. For instance there is a "CellBeginEdit" and a "CellEndEdit" that might help.
Kyra
@Kyra no problem, I have worked in the past with DevExpress, very nice product :) I found a solution, thank you
marco.ragogna
A: 

After try all possible events both in TextBox and in DataGRidView I finally found one useful for my case.

CellParsing

I copy my code maybe it could help someone else :)

   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
marco.ragogna