Автозаполнение TextBox и кнопки по умолчанию

У меня есть .NET TextBox с функцией автозаполнения в форме. В форме также определены AcceptButton и CancelButton. Если я попытаюсь зафиксировать предложение с помощью клавиши Enter или закрыть раскрывающийся список с помощью Esc, моя форма закроется. Как я могу предотвратить такое поведение?


person Zhenya    schedule 01.07.2009    source источник


Ответы (4)


Не назначайте свойства формы AcceptButton и CancelButton. Установите DialogResult в событии OnClick кнопок.

person arbiter    schedule 01.07.2009

Простой способ - удалить свойства AcceptButton и CancelButton, пока вы находитесь в текстовом поле автозаполнения:

    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;
    }
person TheVillageIdiot    schedule 03.07.2009

вместо кнопок Принять и Отменить вы можете использовать следующий подход:

  1. Задайте для свойства KeyPreview формы значение true.
  2. Обработайте событие KeyDown формы, в методе обработчика вы можете иметь что-то похожее на приведенный ниже код

    switch (e.KeyCode)
    {
        case Keys.Enter:
        {
            if (!txtAuto.Focused)
            {
                Save();
            }
            break;
        }
        case Keys.Escape:
        {
            if (!txtAuto.Focused)
            {
                Close();
            }
            break;
        }
    }
    
person Eros    schedule 01.07.2009
comment
Событие KeyDown формы не будет запущено. - person Zhenya; 02.07.2009

Другой вариант - создать свой собственный класс TextBox, который выполняет проверку при нажатии Enture / Return:

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;
    }
}
person Eric    schedule 03.07.2009