Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.net 2005] Validare testo in una cella di un DataGridView

Salve a tutti,
sto utilizzando un datagridview come oggetto per far inserire
all'utente dei valori di opzioni in campi di testo.
Ho necessità di validare questo dato durante la digitazione, e cioè
lasciar scrivere solo numeri e il separatore decimale. Già lo faccio
con le TexBox normali con l'evento KeyPress che però non c'è sulle
celle del DataGridView.
Qualcuno può gentilmente darmi qualche dritta su come fare?
Grazie
--Marco

news:1174603036.7...@l75g2000hse.googlegroups.com...

Ti crei un tuo tipo di colonna, derivato da quello che ti interessa (textbox 
nel tuo caso) e ti fai l'overrides del metodo che vuoi esporre come evento.
Ciao
Umbe

 ha scritto nel messaggio

Ciao Umbe,
grazie del consiglio ma non ho la più pallida idea di come fare.
Hai qualche esempio?
Grazie

>Hai qualche esempio?
mannaggia alla pappa pronta.....
Allora, nel tuo progetto inserisci un nuovo file e ci crei le due classi qui 
sotto:
Public Class GrigliaCellKeyDown
    Inherits DataGridViewTextBoxCell
    Event TastoPremuto(ByVal e As System.Windows.Forms.KeyEventArgs, ByVal 
rowIndex As Integer)
'overrides del metodo OnKeyDown
    Protected Overrides Sub OnKeyDown(ByVal e As 
System.Windows.Forms.KeyEventArgs, ByVal rowIndex As Integer)
        MyBase.OnKeyDown(e, rowIndex)' scateno comunque l'evento 
originale(classe mybase)
        RaiseEvent TastoPremuto(e, rowIndex)
    End Sub
End Class
Public Class GrigliaCellKeyDownColumn
    Inherits DataGridViewColumn
'il template per le nuove celle...
 Public Sub New()
        Me.CellTemplate = New GrigliaCellKeyDown()
  End Sub
End Class
Fatto ciò, generi il il progetto.
A questo punto nella tua griglia dovresti avere come tipo di colonna un tipo 
che si chiama GrigliaCellDownColumn.
Se scegli come tipo di colonna questo, verrà scatenato l'evento 
TastoPremuto.
Nota che eredito dal tipo cella TextBox, quindi tutto è identico a prima, 
con in più il tuo evento (io ho fatto l'overrides di OnKeyDown, ma tu puoi 
fare l'overrides di quello che vuoi.)
Saluti
Umbe 

 ha scritto nel messaggionews:1174939205.5...@d57g2000hsg.googlegroups.com...

Ciao Umbe,
grazie per l'aiuto.
Io arrivo da sviluppo VB6 e da circa 2 settimane ho bisogno di qualche
aiutino ma poi camminerò dasolo.
Dunque ho crato le 2 classi che mi hai suggerito, ma non riesco in
nessun modo a cambiare il tipo di colonna che si riesce a cambiare
solo dal design,
non riesco a capire come istanziare l'oggetto datagridview per
cambiargli il tipo di colonna.
Grazie 1000 per l'aiuto e la pazienza

 - Mostra testo tra virgolette -
Ciao Umbe,
allora uso questo codice per generare la DataGridView:
            Me.DataGridView1.Columns().Add("Nome", "# Nome")
            Me.DataGridView1.Columns().Add(New
GrigliaCellKeyDownColumn)
            Me.DataGridView1.Columns(1).Name = "Valore"
            Me.DataGridView1.Columns(1).HeaderText = "# Valore"
Non riesco a capire però come poi intercettare l'evento, perchè il
DataGrigView 1 non ha l'evento TastoPremuto gestibile prendendo
l'Handle da una sub.
Grazie Ancora

cambiargli il tipo di colonna.
Dò per scontato che tu abbia o inserito il file con le classi nel tuo 
progetto o quantomeno hai inserito un riferimento alla classe appena creata 
.
Parliamo per il momento a livello di designtime, non a runtime.
Fai una prova con una form vuota con solo la tua griglia trascinata di 
brutto e le 2 classi che ti ho suggerito.
Premesso cio, devi dichiarare nella form dove c'e' la griglia:
dim withevents mioeventopergriglia as GrigliaCellKeyDown
E' fondamentale il withevents, sennò gli eventi te li scordi.
Nella griglia, crei una colonna (anche non associata ai dati) e la imposti 
nella proprietà ColumType (ricorda:siamo a design time) come 
GrigliaCellKeyDownColumn.
Fatto cio, se visulizzi il codice,  trovi un oggetto mioeventopergriglia che 
, guarda caso, avrà un evento associato Tastopremuto.
Tale evento verrà scatenato quando premerai il tasto sulla cella della tua 
griglia che apparterrà ad una colonna di tipo GrigliaCellKeyDownColumn..
Funziona cosi'? Ti deve funzionare, io ci ho scritto un sacco di 
applicativi.
Se funziona, portare la cosa a runtime viene da sola.......
Ciao e fammi (facci!) sapere.
Umbe

 ha scritto nel messaggio 
news:4spOh.36326$J11.7...@twister1.libero.it...

Scordavo...
sull'evento cell_enter della griglia,ci devi mettere:
Private Sub griglia_CellEnter(ByVal sender As Object, ByVal e As 
System.Windows.Forms.DataGridViewCellEventArgs) Handles griglia.CellEnter
        If e.ColumnIndex = 0 Then
            MioEventoPerGriglia = griglia.CurrentCell
        End If
end sub
dove ovviamente columnindex corrisponde alla colonna che hai impostato come 
GrigliaCellKeyDownColumn.
Tra parentesi se guardi su MSDN c'e' un piccolo tutorial su come 
personalizzare le celle e colonne.Cerca nei tipi di colonna personalizzato 
nella datagridview.
Ciao
Umbe

 ha scritto nel messaggio

Ciao Umbe,
allora ho provato come segue ma ti anticipo già che non si scaturisce
l'evento TastoPremuto.
1) Ho inseito le classi nel progetto
2) Ho dichiarato l'evento:
    Private WithEvents mioeventopergriglia As GrigliaCellKeyDown
3) Ho trascinato il Datagrid nella form, ho aggiunto una colonna
sempre dal designer grafico e mi ha fatto vedere nel menù a tendina
dei tipi di colonne anche quello delle classi che mi hai mandato
4) Ho aggiunto l'evento sul Cell_Enter sulla colonna 0 che è l'unica
    Private Sub DataGridView1_CellEnter(ByVal sender As Object, ByVal
e As System.Windows.Forms.DataGridViewCellEventArgs) Handles
DataGridView1.CellEnter
        If e.ColumnIndex = 0 Then
            mioeventopergriglia = Me.DataGridView1.CurrentCell
        End If
    End Sub
5) Ho messo una msgbox nell'evento mioeventopergriglia_TastoPremuto
    Private Sub mioeventopergriglia_TastoPremuto(ByVal e As
System.Windows.Forms.KeyEventArgs, ByVal rowIndex As Integer) Handles
mioeventopergriglia.TastoPremuto
        MsgBox("Messaggio di Prova")
    End Sub
l risultato è che non mi compare mai il message box, e quindi suppongo
che l'evento non venga scaturito.
Dove sbaglio?
Grazie

Dove sbaglio?
Controlla queste 2 cose:
la prima è tratta da MSDN:
"L'esempio non funzionerà correttamente se si aggiungono righe vuote. Le 
righe vuote vengono create, ad esempio, quando si aggiungono righe al 
controllo mediante l'impostazione della proprietà RowCount. Poiché le righe 
aggiunte in questo modo vengono automaticamente condivise, non vengono 
create istanze degli oggetti DataGridViewRolloverCell finché non si 
selezionano le singole celle, rendendo di conseguenza le righe associate non 
più condivise. "
potrebbe essere questo....
a scanso di equivoci, popola la colonna con qualche dato, anche a caso...poi 
clicca sulla seconda o terza riga e quindi premi un tasto...
La seconda invece è che nelle mie classi ho fatto l'overrides del keydown, 
non del keypress!
Umbe

 ha scritto nel messaggionews:1175081884.3...@d57g2000hsg.googlegroups.com...

Ciao Umbe,
nel Datagridview ci sono 1 colonna e 4 righe popolate con dei dati.
Tu nelle classi hai fatto l'override del KeyDown e non del KeyPress.
MI sa che è questo.
Grazie

 - Mostra testo tra virgolette -
Ciao Umbe,
Ho modificato le classi così:
Public Class GrigliaCellKeyDown
    Inherits DataGridViewTextBoxCell
    Event TastoPremuto(ByVal e As
System.Windows.Forms.KeyPressEventArgs, ByVal rowIndex As Integer)
    'overrides del metodo OnKeyDown
    Protected Overrides Sub OnKeyPress(ByVal e As
System.Windows.Forms.KeyPressEventArgs, ByVal rowIndex As Integer)
        MyBase.OnKeyPress(e, rowIndex) ' scateno comunque l'evento
originale(classe mybase)
        RaiseEvent TastoPremuto(e, rowIndex)
    End Sub
End Class
Public Class GrigliaCellKeyDownColumn
    Inherits DataGridViewColumn
    'il template per le nuove celle...
    Public Sub New()
        Me.CellTemplate = New GrigliaCellKeyDown()
    End Sub
End Class
E le sub Così
Private WithEvents mioeventopergriglia As GrigliaCellKeyDown
    Private Sub DataGridView1_CellEnter(ByVal sender As Object, ByVal
e As System.Windows.Forms.DataGridViewCellEventArgs) Handles
DataGridView1.CellEnter
        If e.ColumnIndex = 0 Then
            mioeventopergriglia = Me.DataGridView1.CurrentCell
        End If
    End Sub
    Private Sub mioeventopergriglia_TastoPremuto(ByVal e As
System.Windows.Forms.KeyPressEventArgs, ByVal rowIndex As Integer)
Handles mioeventopergriglia.TastoPremuto
        MsgBox(e.ToString)
    End Sub
Ma continua a non funzionare.
Ciao

>continua a non funzionare
Ho dato un occhio al tuo codice.
Io ho copiato di sana pianta quello che hai scritto  ed effettivamente non 
funzionava.
Se però faccio l'overrides di OnKeyDown anzichè OnKeyPress (cambiando tutte 
le relative firme, ovvio) come hai fatto invece tu, la cosa funziona 
perfettamente.
Evidentemente sul key down bisogna guardarci meglio, ma la strada è questa. 
Dai un occhio a MSDN sui tipi di colonna personalizzata che puoi avere nella 
datagridview
Saluti
Umbe