ShowDialog e DialogResult, che coppia!

Siamo ormai quasi arrivati alla "partenza" della 2.0 ed io riesco ancora a trovare solo adesso il tempo per capire alcuni "atteggiamenti" curiosi della 1.1. Probabilmente sarò l'ultimo...

Visualizzare un form tramite .ShowDialog rende l'instanza di quel form particolarmente "sensibile" alla proprietà DialogResult. A dire il vero mi verrebbe da dire che "la fa quasi da padrone" viste le ultime provine ("provette" suona male...) che ho avuto incredibilmente tempo di fare stamattina.

Per chi, come il "soprascritto", non abbia avuto tempo (o non abbia avuto voglia) in passato di approfondire alcuni aspetti legati a questo "rapporto" riporto un paio di spunti.

Supponete di considerare come DialogResult.OK un form dopo che l'utente ha selezionato un certo valore da una combobox. Magari sull'evento SelectedIndexChanged volete indicare, appunto, la situazione attuale del "dialogo" come OK e impostate la proprietà Me.DialogResult = DialogResult.OK (in VB).

Sfzuummm!  Eh? Oh! Che è?

Per qualche motivo (a mio parere neanche troppo "lineare") la form decide che ha fatto il suo dovere e che può finalmente andare in pensione chiudendosi. Va bene, ma andiamo a vedere "come":

Ravana di qui, ravana di lì con Reflector mi sono imbattuto in questo interessante codice che viene richiamato sull'evento Closing:

Friend Function CheckCloseDialog() As Boolean
      If ((Me.dialogResult = DialogResult.None) AndAlso MyBase.Visible) Then
            Return False
      End If
      Try 
            Dim args1 As New CancelEventArgs(False)
            Me.OnClosing(args1)
            If args1.Cancel Then
                  Me.dialogResult = DialogResult.None
            End If
            If (Me.dialogResult <> DialogResult.None) Then
                  Me.OnClosed(EventArgs.Empty)
            End If
      Catch exception1 As  Exception
            Me.dialogResult = DialogResult.None
            Application.OnThreadException(exception1)
      End Try
      If (Me.dialogResult = DialogResult.None) Then
            Return Not MyBase.Visible
      End If
      Return True
End Function
Tutto questo involontariamente apre un'altra curiosità ed uno scenario:

1) Sembrerebbe che anche CancelEventArgs si basi su DialogResult (che a questo punto secondo me è prossimo alla conquista del titolo), quantomento nello ShowDialog;

2) Se noi riteniamo che l'utente non abbia il "diritto" di chiudere la form, dal momento che non ci ha espressamente fatto sapere se vuole "annullare" o "proseguire" la procedura, possiamo semplicemente impostare inizialmente a DialogResult.None la proprietà DialogResult del form e lui potrà tranquillamente accanirsi invano sul povero pulsantino con la X (sinceramente lo reputo un modo abbastanza ostico e "anti-windows" di "interfacciarsi" con l'utente, ma in alcuni casi magari potrebbe essere necessario).

Quando l'utente ci ha fatto sapere di che morte vuole morire (eh, eh...) possiamo assegnare lo stato DialogResult.OK ad una variabile locale provvisoria per poi "girarlo" al form nell'evento Closing.

(Ovviamente si potrebbe anche semplicemente togliere la controlbox, ma così sparirebbero anche i pulsantini Max e soprattutto Min)

Non ho invece ancora trovato il codice che richiama la chiusura del form impostando la proprietà DialogResult, ma come al solito quando cerchi una cosa, ne trovi 300 altre curiose tranne quella che stai cercando!

Tempo scaduto; sarà per la prossima...

Print | posted @ mercoledì 10 agosto 2005 19:15

Comments on this entry:

Gravatar # re: ShowDialog e DialogResult, che coppia!
by Mario Duzioni at 10/08/2005 20:07

Riguardo all'esempio:

inserendo questo codice nella form visualizzata con ShowDialog il form non si chiude più (o meglio: viene sempre annullata la chiusura):

Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.DialogResult = DialogResult.None
End Sub

...fino a quando la proprietà DialogResult della form non sia stata impostata ad un altro valore.

Ma se lo imposti direttamente, es:

Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOk.Click
'I dati vengono correttamente specificati dall'utente
Me.DialogResult = DialogResult.OK '<-- Questa assegnazione chiude la form (!)
End Sub

...a quel punto quando imposti la proprietà la form si chiude subito, ma potrebbe non essere la cosa che ti serve.
A quel punto puoi posticipare la chiusura del form semplicemente assegnando il result ad una variabile e solo nell'evento Closing assegnarla al form; es:

Private currentResult As DialogResult

Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.DialogResult = DialogResult.None
End Sub

Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOk.Click
'I dati vengono correttamente specificati dall'utente
currentResult = DialogResult.OK '<- Non chiude la form (ovviamente)
End Sub

Private Sub Form2_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
'Fa altro...
Me.DialogResult = currentResult
End Sub

Come dicevo non ho ancora avuto tempo di capire in che punto viene chiusa la form settando, per esempio, la proprietà Me.DialogResult = DialogResult.OK

Ciao!
Gravatar # re: ShowDialog e DialogResult, che coppia!
by Mario Duzioni at 10/08/2005 20:18

Uhia, uhia, qui la cosa si fa ancora più fitta!

Riprovando adesso _lo stesso progetto_ creato prima si comporta in modo differente...

A questo punto devo approfondire... dammi qualche minuto...
Gravatar # Re: ShowDialog e DialogResult, che coppia!
by Lorenzo Melato at 10/08/2005 20:22

Se tu dentro l'OnClosing setti Me.DialogResult = DialogResult.None hai lo stesso effetto che fare e.Cancel = true...
Gravatar # Re: ShowDialog e DialogResult, che coppia!
by Lorenzo Melato at 10/08/2005 20:41

Oh... mi hai intrippato con questa storia del DialogResult, non ne vengo fuori...
Gravatar # re: ShowDialog e DialogResult, che coppia!
by Mario Duzioni at 10/08/2005 20:43

"Oh... mi hai intrippato con questa storia del DialogResult, non ne vengo fuori... "

A chi lo dici!!! Oh, stanotte io non dormo!!! Arf, arf...
Comments have been closed on this topic.