Io ho creato una soluzione basata su un "controllo utente" dove basta impostare la colonna e i tasti accettati dalle rispettive celle tramite le "proprietà" del controllo, esempio:
codice:
Public Class dgv_modificato
Inherits System.Windows.Forms.DataGridView
Dim colonna As Integer
Dim lista_tasti As New List(Of Keys)
Dim colonna_controllata As Integer
Sub New()
'tasti da 0 a 9
lista_tasti.Add(Keys.D0)
'eccetera
'tasti del tastierino da 0 a 9
lista_tasti.Add(Keys.NumPad0)
'eccetera
'varie
lista_tasti.Add(Keys.Delete) 'CANC
lista_tasti.Add(Keys.Back) 'DELETE
lista_tasti.Add(Keys.Oemcomma) 'VIRGOLA (188)
lista_tasti.Add(Keys.OemPeriod) 'PUNTO (190)
lista_tasti.Add(Keys.Decimal) 'PUNTO TASTIERINO(110)
lista_tasti.Add(Keys.Left) 'FRECCIA SINISTRA
lista_tasti.Add(Keys.Right) 'FRECCIA DESTRA
lista_tasti.Add(131139) 'CONTROL C (COPIA)
lista_tasti.Add(131158) 'CONTROL V (INCOLLA)
lista_tasti.Add(131162) 'CONTROL Z (TAGLIA)
End Sub
'da impostare nel form
'è il numero di colonna sulla quale effettuare
'il controllo
Public Property ColonnaControllata As Integer
Get
Return colonna_controllata
End Get
Set(value As Integer)
colonna_controllata = value
End Set
End Property
'in "Sub New" vengono preimpostati una serie di tasti
Public Property ListaTasti As List(Of Keys)
Get
Return lista_tasti
End Get
Set(value As List(Of Keys))
lista_tasti = value
End Set
End Property
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
'*************************************************************************
'DA COMMENTARE IN RELEASE
'questo:
Console.WriteLine(keyData & " " & keyData.ToString)
'in fase di debug scrive nell'output le informazioni sul tasto premuto,
'serve per identificare il valore "keydata" da inserire nella lista.
'*************************************************************************
If colonna_controllata = colonna Then
If lista_tasti.Contains(keyData) = False Then
msg = Nothing
End If
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
'al doppio clic su una cella riporta la colonna
Private Sub ME_CellBeginEdit(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs) Handles Me.CellBeginEdit
colonna = e.ColumnIndex
End Sub
End Class
Vedete voi se può esservi utile...
ciao