c# - WinForms Validating event prevents Escape key closing the form -


i have simple form single textbox, plus ok , cancel buttons. form's acceptbutton , cancelbutton set correctly, , ok , cancel buttons have dialogresult set 'ok' , 'cancel'.

i want add validation textbox prevent user ok-ing form when validation fails, allow them cancel usual.

the causesvalidation property true default on controls, have changed false on cancel button.

sure enough, clicking ok or pressing enter key run validating event wired textbox. pressing cancel button bypasses validating, perfect.

however, pressing escape cancel form not perform same pressing cancel button - raises validating event , prevents user exiting.

is there way of making escape key perform intended, i.e. not raise validating event, if cancel button had been pressed?

a complete worked solution is:

create new windows forms app. add second form project.

paste code form1's constructor, after initializecomponent():

messagebox.show((new form2()).showdialog().tostring()); 

this shows dialogresult passed our second form.

paste code form2's constructor, after 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 simplified example textbox not let proceed if there 3 characters input. can press cancel button or close form directly if there 3 characters present; pressing escape key not same - fires validating event whereas should doing same pressing cancel.

yes, awkward quirk of validatechildren method. doesn't know canceling intended. paste code fix problem:

    protected override void onformclosing(formclosingeventargs e) {         base.onformclosing(e);         e.cancel = false;     } 

to avoid having validate event handler running causes side-effects, message box, add statement top of method:

    private void txtname_validating(object sender, canceleventargs e)     {         if (this.dialogresult != dialogresult.none) return;         // etc..     } 

paste code form dialogresult set before tries validate form:

    protected override bool processdialogkey(keys keydata) {         if (keydata == keys.escape) this.dialogresult = dialogresult.cancel;         return base.processdialogkey(keydata);     } 

Comments

Popular posts from this blog

java - SNMP4J General Variable Binding Error -

sql server - python to mssql encoding problem -

windows - Python Service Installation - "Could not find PythonClass entry" -