TextBox autocomplete and default buttons

2019-01-26 14:35发布

问题:

I have a .NET TextBox with AutoComplete feature on the form. The form has also AcceptButton and CancelButton defined. If I try to commit a suggestion with Enter key or close drop down with Esc, my form closes. How can I prevent this behavior?

回答1:

Do not assign AcceptButton and CancelButton form properties. Set DialogResult in the buttons OnClick event.



回答2:

Simple way is to remove AcceptButton and CancelButton properties while you are in auto-complete textbox:

    public Form1()
    {
        InitializeComponent();

        txtAuto.Enter +=txtAuto_Enter;
        txtAuto.Leave +=txtAuto_Leave;
    }

    private void txtAC_Enter(object sender, EventArgs e)
    {
        AcceptButton = null;
        CancelButton = null;
    }

    private void txtAC_Leave(object sender, EventArgs e)
    {
        AcceptButton = btnOk;
        CancelButton = btnCancel;
    }


回答3:

instead to Accept and Cancel buttons you can go for the following approach:

  1. Set KeyPreview property for the form to true.
  2. Handle the KeyDown event of the form, in the handler method you can have something similar to the below code

    switch (e.KeyCode)
    {
        case Keys.Enter:
        {
            if (!txtAuto.Focused)
            {
                Save();
            }
            break;
        }
        case Keys.Escape:
        {
            if (!txtAuto.Focused)
            {
                Close();
            }
            break;
        }
    }
    


回答4:

Another option is to derive your own custom TextBox class that performs validation when Enture/Return is pressed:

public class MyTextBox : TextBox
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Enter || keyData == Keys.Return)
        {
            // Perform validation here
            return true;
        }
        else
            return false;
    }
}