Ho un semplice modulo con un singolo TextBox, oltre ai pulsanti OK e Annulla. AcceptButton e CancelButton del modulo sono impostati correttamente e i pulsanti OK e Annulla hanno il loro DialogResult impostato su "OK" e "Annulla".WinForms L'evento di convalida impedisce la chiave di escape che chiude il modulo
Voglio aggiungere la convalida al TextBox che impedirà all'utente di inviare il modulo quando la convalida fallisce, ma che permetterà anche a loro di cancellare come al solito.
La proprietà CausesValidation è True per impostazione predefinita su tutti i controlli, ma l'ho modificata su False sul pulsante Annulla.
Abbastanza sicuro, facendo clic su OK o premendo il tasto Invio verrà eseguito l'evento di convalida che ho collegato al TextBox. Premendo il pulsante Annulla si ignora Convalida, che è perfetto.
Tuttavia, premendo Esc per annullare il modulo, lo non ha lo stesso effetto della pressione del pulsante Annulla: solleva l'evento Convalida e impedisce all'utente di uscire.
Esiste un modo per far funzionare il tasto Escape come previsto, vale a dire non sollevare l'evento Validazione, proprio come se fosse stato premuto il pulsante Annulla?
Una soluzione ha funzionato completo è:
Creare un nuovo Windows Form app. Aggiungi un secondo modulo al progetto.
incollare questo codice in costruttore di Form1, dopo InitializeComponent():
MessageBox.Show((new Form2()).ShowDialog().ToString());
Questo mostra il DialogResult ripassato dal nostro secondo modulo.
incollare questo codice in costruttore di Form2, dopo InitializeComponent():
TextBox txtName = new TextBox();
txtName.Validating +=
new CancelEventHandler((sender, e) =>
{
if (txtName.Text.Length == 3)
{
MessageBox.Show("Validation failed.");
e.Cancel = true;
}
});
Button btnOk = new Button
{
Text = "OK",
DialogResult = DialogResult.OK
};
Button btnCancel = new Button
{
Text = "Cancel",
CausesValidation = false,
DialogResult = DialogResult.Cancel
};
FlowLayoutPanel panel = new FlowLayoutPanel();
panel.Controls.AddRange(new Control[]
{
txtName, btnOk, btnCancel
});
this.AcceptButton = btnOk;
this.CancelButton = btnCancel;
this.Controls.Add(panel);
In questo esempio semplificato la casella di testo non ti consente di procedere se ci sono 3 ingressi caratteri. È possibile premere il pulsante Annulla o chiudere direttamente il modulo anche se sono presenti 3 caratteri; tuttavia premendo il tasto Esc sarà non fare lo stesso - si attiva l'evento Validating mentre dovrebbe fare lo stesso di premere Cancel.
"validazione WinForms impedisce la fuga chiave di chiudere la forma" Ho lo stesso problema. –