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:
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...