Как определить, какой элемент управления формы имеет фокус? - PullRequest
13 голосов
/ 04 февраля 2009

Я читал в другом месте здесь, чтобы захватить нажатие клавиши «Ввод» в текстовом поле и использовать его, как если бы я нажимал кнопку, я должен установить для свойства KeyPreview формы значение true и проверить значение KeyDown.

Я хочу использовать эту функцию на нескольких элементах управления TextBox, каждый из которых связан с отдельной кнопкой.

Мой вопрос: как узнать, какой элемент управления вызвал событие KeyPress? Отправитель указан как форма.

G

Ответы [ 4 ]

5 голосов
/ 04 февраля 2009

У каждой формы есть свойство для кнопки «Принять» и «Отмена», это кнопки, которые «нажимаются», когда пользователь нажимает ввод и выход соответственно.

Вы можете изменить кнопку по умолчанию, когда каждый элемент управления получает фокус (вы можете получить один обработчик события фокуса на кнопку и поделиться им с набором текстовых полей)

Если вы сделаете это, то внешний вид кнопок изменится, давая пользователю визуальную подсказку, сообщающую ему, какая кнопка используется по умолчанию.

В качестве альтернативы, если вы не хотите этого делать, вы можете использовать свойство «ActiveControl» и проверить, к какому из наборов текстовых полей он принадлежит.

Вы спрашивали себя, какой должна быть кнопка по умолчанию, если это не одно из этих текстовых полей?

5 голосов
/ 04 февраля 2009

Я нашел решение, которое, кажется, работает.

    private void DeviceForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == 13 && tstxtDeviceFilter.Focused)
        {
            filterByDeviceSN();
        }
    }

Я не могу помочь, но думаю, что должен быть лучший способ!

- EDIT - EDIT - EDIT - EDIT - EDIT -

Ну, посмотрев на приведенные ниже предложения (спасибо), я нашел для меня «лучший» способ в этих обстоятельствах.

    this.tstxtDeviceFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tstxtDeviceFilter_KeyDown);

    private void tstxtDeviceFilter_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == 13)
        {
            filterByDeviceSN();
        }
    }

Очевидно, что захватывая событие в самом текстовом поле, а не в форме, мне не нужно беспокоиться о фокусе. Я снова чувствую себя глупо, что так долго не думал об этом!

4 голосов
/ 04 февраля 2009

Вы пробовали Form.ActiveControl ?

0 голосов
/ 06 февраля 2009

Вы можете использовать этот код в качестве отправной точки для захвата событий нажатия клавиш формы. ActiveControl это тот, который имеет фокус. В этом примере он гибок для добавления других действий при «Enter», когда вы находитесь в разных текстовых полях формы. Это VB.NET, но вы должны быть в состоянии легко конвертировать в C #.

Private Sub MyForm_KeyDown(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

    If e.KeyCode = Keys.Enter Then
        If Me.ActiveControl.Name = Me.TextBox1.Name Then
            ' This is the TextBox we want to be active to run filterByDeviceSN()
            filterByDeviceSN()
        ElseIf Me.ActiveControl.Name = Me.TextBox2.Name Then
            foo()
        End If
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...