On Oct 16, 7:00*am, nano2k <adrian.rot...@ikonsoft.ro> wrote:
> On 15 Oct, 18:46, Sin Jeong-hun <typing...@gmail.com> wrote:
>
>
>
>
>
> > I have a dialog form which pops up from the main window using the
> > ShowDialog() method. this dialog has no [OK] or [Cancel] button, and
> > it has quite a lot of controls on it. Now, I want to close this dialog
> > form when the user presses the escape key, but that's only when no
> > control on the form is responsible for the escape key. For example, it
> > has a ComboBox control, and a user can press the escape key just to
> > close the drop down list that is being dropped down, not the dialog
> > form.
>
> > I added some code like the following at the dialog form's KeyDown
> > event handler:
> > * * * * * * * * * * * * if (e.KeyCode == Keys.Escape)
> > * * * * * * * * * * * * {
> > * * * * * * * * * * * * * * * * this.DialogResult = DialogResult.Cancel;
> > * * * * * * * * * * * * * * * * this.Close();
> > * * * * * * * * * * * * }
>
> > The problem is, this close the form, even if when the user pressed the
> > escape key to close the drop down list, not the form. Of course I
> > might check if the ComboBox is open like:
> > * * * * if(!ComboBox1.DroppedDown)
> > * * * * {
> > * * * * * * * * * * * * if (e.KeyCode == Keys.Escape)
> > * * * * * * * * * * * * {
> > * * * * * * * * * * * * * * * * this.DialogResult = DialogResult.Cancel;
> > * * * * * * * * * * * * * * * * this.Close();
> > * * * * * * * * * * * * }
> > * * * * }
>
> > But this seems to be only a makeshift, because there can be other
> > controls responsible for the escape key or that kind of controls can
> > be added later. What would you recommand in this situation? Is there
> > any cleaner way for the form to receive only orphaned (not consumed by
> > any other controls on the form) escape key presses?
>
> Not a tested solution, but you may try this:
>
> 1. Make sure the form's KeyPreview property is set to false. You don't
> want to give to the form the chance to process the Keydown event
> before its child controls.
> 2. For each type of control, create a KeyDown event handler.
> For example, for comboboxes, you may use the code you wrote above with
> a slight change:
>
> * * * * *if(!ComboBox1.DroppedDown)
> * * * * *{
> * * * * * * * * * * * * *if (e.KeyCode == Keys.Escape)
> * * * * * * * * * * * * *{
> * * * * * * * * * * * * * * * * *this.DialogResult =
> DialogResult.Cancel;
> * * * * * * * * * * * * * * * * *this.Close();
> * * * * * * * * * * * * *}
> * * * * * * * * * * * * *else{
> * * * * * * * * * * * * * * * * *e.Handled = true; //prevent the event
> to propagate and close your form
> * * * * * * * * * * * * *}
> * * * * *}
>
> And make all comboboxes' KeyDown event be handled by this handler.
> And so on, for textboxes, etc.
>
> You may also want to create your own controls that inherit from
> combobox / textbox, etc that internally deal with Escape key.
> This is a more elegant approach because you will not be forced to
> create handlers every time you put the controls on another form.
Thank you for your detailed answer. But the solution seems to be
complicated for a simple task like just closing the form. I think I
can just put a dummy "Cancel" button to the invisible location of the
form. Like the other reply said, that could simply solve the problem,
though not so clean.
|