Buon giorno a tutti.
Sto provando ad utilizzare la preziosa funzione offerta dal DataGridView per effettuare il Binding dei dati da una BindingList; ho però un problema nella gestione delle eccezioni
Nella proprietà della classe della BindingList, vorrei generare un'eccezione se il valore impostato dall'utente, non soddisfa alcune condizioni.
Con mio grande stupore, ho notato che se viene generata un'eccezione nella proprietà della classe, questa viene gestita dall'evento "DataGridView_DataError" che è proprio quello che vorrei fare; il problema è che si presentano due comportamenti strani:
-Se sto eseguendo il Debug mediante VisualStudio, l'esecuzione del codice, si interrompe sulla riga dove alzo l'eccezione ma, ripremendo "play", l'esecuzione riprende normalmente passando per l'evento "DataGridView_DataError". Come mai si interrompe se sono in debug, mentre non c'è alcun arresto se eseguo direttamente l'exe? Probabilmente perchè non gestisco direttamente l'eccezione...ma come fare a gestirla?
-Una volta alzata l'eccezione, si scatena l'evento "DataGridView_DataError" e nella variabile "e.Exception", mi trovo correttamente il mio testo dell'eccezione specificato; quando però continuo l'esecuzione del codice, mi si scatena nuovamente l'evento "DataGridView_DataError" ma la variabile "e.Exception" è Nothing. Come mai si scatena due volte l'eccezione? (Ho notato che la prima volta, la variabile "e.Context", è valorizzata a "Commit", la seconda volta, a "Parsing Or Commit"). Quando, invece, l'evento "DataGridView_DataError" viene scatenato automaticamente dal "DataGridView" (ad esempio se viene digitata una stringa in un campo numerico), l'evento scatta solo una volta.
Posto un po' di codice di esempio
codice:
Public Class frmMain
'Collezione di oggetti "clsOrganization"
Private LOrganization As BindingList(Of clsOrganization)
Public Sub New()
' Chiamata richiesta dalla finestra di progettazione.
InitializeComponent()
LOrganization = New BindingList(Of clsOrganization)
LOrganization.AllowNew = True
dgvOrg.DataSource = LOrganization
End Sub
Private Sub dgvOrg_DataError(sender As Object, e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles dgvOrg.DataError
--> QUI PASSA DUE VOLTE QUANDO GENERO IO L'ECCEZIONE NELLA CLASSE clsOrganization E UNA VOLTA QUANDO VIENE SCATENATO DAL dgvOrg STESSO
e.Cancel = True
MsgBox(e.Exception.Message, MsgBoxStyle.Exclamation)
End Sub
End Class
Public Class clsOrganization
'Org. Number (Integer max 999)
Private iOrgNumber As Integer
<System.ComponentModel.DisplayName("Org. number")> _
Public Property OrgNumber() As Integer
Get
Return iOrgNumber
End Get
Set(ByVal value As Integer)
If value < 0 Or value > 999 Then
--> QUI ALZO IO L'ECCEZIONE CHE VORREI GESTIRE NELL'EVENTO "dgvOrg_DataError"; L'ESECUZIONE DEL CODICE SI FERMA SULL'ELSE SUCCESSIVO MA, PREMENDO "PLAY", PROSEGUE, SCATENANDOMI DUE EVENTI "dgvOrg_DataError": UNO CON IL TESTO DELLA MIA ECCEZIONE E UNO CON ECCEZIONE A NOTHING
Throw New Exception("Organization No. in use by other organization or invalid" & vbCrLf &
"Valid value must be between 0 and 999")
Else
iOrgNumber = value
End If
End Set
End Property
End Class
Grazie mille e buon fine seetimana