2010-06-16 8 views
2

I ont une DataGridView lié à un DataTable qui a 1 + 16 colonnes définies comme entier.DataGridView Cellule Volume de montage avec mise en forme décimale/hexadécimale

Le style de cellule par défaut est 2 chiffres hexadécimaux (.Format="X2").

En entrant dans l'édition de cellules, je voudrais fournir à l'utilisateur la possibilité d'écrire la valeur en décimal ou en hexadécimal.

  1. Hexadécimal pourrait être écrit comme, par exemple, 0x00, 0x01 x02, XFF
  2. décimal comme 0, 1, 2, 15

Pour cette raison, dans EditingControlShowing ajouter " 0x » à la valeur TextBox

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 

tandis que dans TextBox_KeyPress sous toutes les entrées je joue filteri ng pour éviter les entrées invalides. Ce que je n'arrive pas à comprendre est l'événement auquel je peux attacher pour détecter quand l'édition est terminée. Je voudrais quelque chose de contraire à EditingControlShowing afin que je puisse supprimer "0x" mais je ne l'ai pas trouvé.

Répondre

1

Après avoir essayé tous les événements possibles à la fois dans TextBox et dans DataGRidView j'ai finalement trouvé un utile pour mon cas.

CellParsing

je copie mon code peut-être qu'il pourrait aider quelqu'un d'autre :)

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 
0

J'utiliserais gridView actionevent CellValueChanged. Si cela est trop tard, utilisez CellValueChanging

+0

CellValueChanged arrivent trop tard dans mon cas, et il seemes que CellValueChanging n'existe pas – Drake

+0

@ marco.ragogna Désolé, je regardais la version DevExpress de datagridview. Je passerais par les actionlisteners possibles que vous pouvez utiliser avec le datagridview. Par exemple, il y a un "CellBeginEdit" et un "CellEndEdit" qui pourrait aider. – Kyra

+0

pas de problème, j'ai travaillé dans le passé avec DevExpress, très beau produit :) j'ai trouvé une solution, merci – Drake