Per utilizzare convalidare i gestori come il 'txtIPAddress_Validating()' handler di seguito pur essendo in grado di chiudere il modulo senza dover inserire voci valide per farlo, faccio quanto segue:
1) Initate gestori di convalida: Dalle proprietà di controllo del controllo che si desidera attivare la convalida per il doppio clic sull'evento 'Validating' da questo elenco di eventi di controllo. È possibile accedere a un elenco di eventi di controllo facendo clic sul pulsante della barra degli strumenti evento della finestra delle proprietà di questo controllo (simile a un fulmine). È quindi possibile immettere il codice nel gestore generato automaticamente con un nome che combina sia il nome del controllo sia '_Validating'. La parte di questo gestore in cui qualcosa viene stabilito come non valido può forzare voci valide aggiungendo l'istruzione 'e.Cancel = true'.
Per tali esempi di metodi di convalida, vedere il codice 'txtIPAddress_Validating()' e 'txtMaskBits_Validating()' di seguito. Non distrarti dal meccanismo di convalida completo di questi esempi specifici. Tutto ciò che serve per vedere e riprodurre nel proprio codice al fine di costringere la convalida è quello di aggiungere la 'e.Cancel = true' istruzioni al posto giusto di un proprio metodo di convalida. Questo è quando il valore è identificato come non valido.
A questo punto la convalida dovrebbe funzionare bene, ma ogni tentativo di chiudere il modulo attiverà convalida che si fermerà e insistere per i valori validi prima di poter chiudere il modulo. Questo non è sempre quello che vuoi. Quando non è così, io continuo con il seguente.
2) pulsante annulla anche (disabilita 'Cancel') tutte le convalide: metodo
a) un pulsante di regolare 'Cancel' sulla forma che è associato ad un metodo come il 'btnCancel_Click()' sotto.
b) Prima del normale 'this.close();' istruzione, aggiungere "AutoValidate = AutoValidate.Disable;" istruzioni. Questa istruzione disabilita tutti i trigger "di convalida". Tieni presente che l'evento "btnCancel_Click" viene attivato prima che venga eseguita qualsiasi convalida. Non è così per gli eventi di chiusura del modulo che verranno eseguiti tutti dopo la convalida degli eventi. Questo è il motivo per cui tale convalida non può essere disabilitata da nessuno di questi eventi di chiusura moduli.
c) Per far funzionare correttamente questo pulsante "Annulla", è necessario impostare la proprietà "CausesValidation" di questo pulsante "Annulla" su "falso". Questo è necessario, altrimenti cliccando su questo pulsante si attiverà la convalida prima che la convalida possa essere disabilitata dal precedente 'AutoValidate = AutoValidate.Disable;' istruzioni.
A questo punto, dovresti essere in grado di uscire facendo clic sul pulsante "Annulla" senza dover prima inserire valori validi. Tuttavia, facendo clic sul pulsante "X" in alto a destra della finestra del modulo, verrà comunque forzata la convalida.
3) rendere il pulsante in alto a destra "X" anche annullare la convalida:
La sfida è quella di intrappolare tale "X" cliccato evento prima che venga eseguita la convalida. Qualsiasi tentativo di farlo tramite un gestore di chiusura del modulo non funzionerà perché è troppo tardi una volta che l'esecuzione raggiunge tale gestore. Tuttavia, il clic del pulsante "X" può essere acquisito prontamente tramite l'override del metodo WndProc() e il test per una condizione 'm.Msg == 0x10'. Quando questa condizione è vera, è stato introdotto in precedenza "AutoValidate = AutoValidate.Disable;" l'istruzione può essere nuovamente utilizzata per disabilitare la convalida generale anche in quel caso. Vedere il metodo WndProc() di seguito per un esempio di codice di tale metodo. Dovresti essere in grado di copiare e incollare quel metodo così com'è nella classe del tuo form.
A questo punto, entrambi i pulsanti "Annulla" e "X" devono annullare le valdazioni. Tuttavia, la chiave di escape che può essere utilizzata per chiudere un modulo non lo fa. Tale chiave di escape viene attivata quando la proprietà 'CancelButton' del modulo viene utilizzata per collegare questa chiave di escape al pulsante 'Annulla' del modulo.
4) Fai il tasto Esc anche annullare la convalida:
Simile al pulsante "X", la chiave di fuga può essere catturato sovrascrivendo un existingmethod. Questo è il metodo ProcessDialogKey(). Ancora una volta, "AutoValidate = AutoValidate.Disable" precedentemente introdotto; l'istruzione può essere utilizzata per disabilitare la convalida complessiva anche per la chiave di escape. Vedere il metodo sottoposto a override 'ProcessDialogKey()' nel codice qui sotto per vedere come questo può essere fatto. Anche in questo caso, dovresti essere in grado di copiare e incollare quel metodo come è nella classe del tuo modulo.
A questo punto si dovrebbe fare!
Ulteriori considerazioni:
E 'bene notare che i seguenti due altri modi per chiudere la finestra dovrebbe anche funzionare bene, a questo punto. Questi due modi sono:
- L'opzione 'Chiudi' del pulsante icona della finestra in alto a sinistra.
- Premendo Alt + F4 che attiva la stessa azione di chiusura dell'opzione 'Chiudi' sopra.
Questi due metodi di chiusura della finestra hanno iniziato a annullare anche la convalida dopo aver introdotto il meccanismo di cattura del pulsante "X" descritto al punto 3 sopra.
Questo è tutto per me finora. Sperando che questo aiuti!
codice di mio esempio riportato di seguito:
public partial class frmMyIP : Form
{
public frmMyIP()
{
InitializeComponent();
}
// To capture the Upper right "X" click
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x10) // The upper right "X" was clicked
{
AutoValidate = AutoValidate.Disable; //Deactivate all validations
}
base.WndProc(ref m);
}
// To capture the "Esc" key
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Escape)
{
AutoValidate = AutoValidate.Disable;
btnCancel.PerformClick();
return true;
}
return base.ProcessDialogKey(keyData);
}
public bool IsValidIP(string ipaddr)
{
string pattern = @"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"+
@"(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$";
Regex check = new Regex(pattern);
bool valid = false;
if (ipaddr == "")
{
valid = false;
}
else
{
valid = check.IsMatch(ipaddr, 0);
}
return valid;
}
private void txtIPAddress_Validating(object sender, CancelEventArgs e)
{
string address = txtIPAddress.Text;
if (!IsValidIP(address))
{
MessageBox.Show("Invalid IP address!");
e.Cancel = true;
}
}
private void cmbMaskBits_Validating(object sender, CancelEventArgs e)
{
int MaskBitsValue = Convert.ToInt32(cmbMaskBits.Text);
if (MaskBitsValue<1 || MaskBitsValue>30)
{
MessageBox.Show("Please select a 'Mask Bits' value between 1 and 30!");
e.Cancel = true;
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
// Stop the validation of any controls so the form can close.
// Note: The CausesValidation property of this <Cancel> button
// must also be set to false.
AutoValidate = AutoValidate.Disable;
this.Close();
}
Forse questa risposta: http://stackoverflow.com/a/25479010/1586914 potrebbe essere d'aiuto? – Adiono