C # Как я могу нажать кнопку, нажав Enter, когда текстовое поле имеет фокус? - PullRequest
62 голосов
/ 18 ноября 2008

Я работаю с приложением WinForm в C #, после того, как я что-то набираю в текстовом поле, я хочу нажать клавишу Enter, но текстовое поле все еще имеет фокус (мигающий курсор все еще находится в текстовом поле), как мне этого добиться?

Ответы [ 12 ]

79 голосов
/ 18 ноября 2008

Простой вариант - просто установить AcceptButton формы на кнопку, которую вы хотите нажать (обычно «ОК» и т. Д.):

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    Application.Run(new Form { AcceptButton = btn, Controls = { tb, btn } });

Если это не вариант, вы можете посмотреть на событие KeyDown и т. Д., Но это больше работы ...

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    tb.KeyDown += (sender,args) => {
        if (args.KeyCode == Keys.Return)
        {
            btn.PerformClick();
        }
    };
    Application.Run(new Form { Controls = { tb, btn } });
32 голосов
/ 25 июля 2013
private void textBox_KeyDown(object sender, KeyEventArgs e)
{
     if (e.KeyCode == Keys.Enter)
     {
         button.PerformClick();
         // these last two lines will stop the beep sound
         e.SuppressKeyPress = true;
         e.Handled = true;
     }
}

Свяжите это событие KeyDown с текстовым полем, затем при каждом нажатии клавиши это событие будет запущено. Внутри события мы проверяем, нажал ли пользователь «клавишу ввода», если это так, вы можете выполнить свое действие

32 голосов
/ 18 ноября 2008

Обычный способ сделать это - установить Form s AcceptButton на кнопку, которую вы хотите «нажать». Вы можете сделать это либо в конструкторе VS, либо в коде, и AcceptButton можно изменить в любое время.

Это может или не может быть применимо к вашей ситуации, но я использовал это вместе с GotFocus событиями для различных TextBox в моей форме, чтобы включить различное поведение в зависимости от того, где пользователь нажал Enter. Например:

void TextBox1_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox1;
}

void TextBox2_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox2;
}

При использовании этого метода следует соблюдать осторожность: вы не оставляете AcceptButton установленным на ProcessTextBox1, когда TextBox3 становится сфокусированным. Я бы порекомендовал использовать либо событие LostFocus на TextBox es, которое устанавливает AcceptButton, либо создать метод GotFocus, который используется всеми элементами управления, которые не используют определенный вызов AcceptButton.

11 голосов
/ 05 июня 2012

Я сам сталкивался с этим, когда искал ту же самую вещь, и я отмечаю, что ни один из перечисленных ответов на самом деле не дает решения, когда вы не хотите нажимать кнопку «AcceptButton» в форме при нажатии Enter.

Простой вариант использования - это текстовое поле поиска на экране, где нажатие клавиши ввода должно «нажать» кнопку «Поиск», а не выполнять поведение формы AcceptButton.

Этот маленький фрагмент сделает свое дело;

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        if (!textBox.AcceptsReturn)
        {
            button1.PerformClick();
        }
    }
}

В моем случае этот код является частью пользовательского элемента управления UserControl, полученного из TextBox, а элемент управления имеет свойство ClickThisButtonOnEnter. Но вышеупомянутое является более общим решением.

5 голосов
/ 26 января 2016

Просто установите форму " Кнопка" Принять "" Свойство для кнопки, которую вы хотите нажать клавишей Enter. Или в событии load напишите this.acceptbutton = btnName;

3 голосов
/ 13 февраля 2014

Самое удобное решение для начинающих:

  1. В вашем Designer, нажмите на текстовое поле, которое вы хотите, чтобы это произошло. В окне свойств (по умолчанию: справа внизу) нажмите на молнию (события). Этот значок находится рядом со значком сортировки по алфавиту и значком свойств.

  2. Прокрутите вниз до keyDown. Нажмите на поле раскрывающегося меню прямо к нему. Вы заметите, что там ничего нет, просто нажмите Enter. Visual Studio напишет вам следующий код:

    private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e)
    {
    
    }
    
  3. Затем просто вставьте это в скобки:

    if (e.KeyCode == Keys.Enter)
    {
         yourNameOfButton.PerformClick();
    }
    

Это будет действовать так, как вы бы щелкнули по нему.

2 голосов
/ 14 марта 2018

В Visual Studio 2017, используя c #, просто добавьте атрибут AcceptButton к своей кнопке, в моем примере «btnLogIn»:

this.btnLogIn = new System.Windows.Forms.Button();
//....other settings
this.AcceptButton = this.btnLogIn;
1 голос
/ 26 февраля 2016

Или вы можете просто использовать этот простой код 2 вкладыша:)

if (e.KeyCode == Keys.Enter)
            button1.PerformClick();
1 голос
/ 26 февраля 2016

Добавьте это к конструктору формы:

this.textboxName.KeyDown += (sender, args) => {
    if (args.KeyCode == Keys.Return)
    {
        buttonName.PerformClick();
    }
};
0 голосов
/ 04 октября 2018

TextBox в моей ситуации вообще не получал клавишу ввода. Первым делом я попытался заменить клавишу ввода на клавишу ввода, но я все еще получал звуковой сигнал при нажатии клавиши ввода. Итак, я переклассифицировал и переопределил метод ProcessDialogKey () и отправил свое собственное событие, с которым я мог бы связать обработчик кликов.

public class EnterTextBox : TextBox
{
    [Browsable(true), EditorBrowsable]
    public event EventHandler EnterKeyPressed;

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            EnterKeyPressed?.Invoke(this, EventArgs.Empty);
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...