Подтвердить что ты не робот

Как определить, какой контроль над формой имеет фокус?

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

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

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

С

4b9b3361

Ответ 1

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

    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();
        }
    }

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

Ответ 2

Каждая форма имеет свойство для кнопки "Принять" и "Отмена", это кнопки, которые получают "щелкнуть", когда пользователь нажимает кнопку "Enter" и "escape" соответственно.

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

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

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

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

Ответ 4

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

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