Как определить, какой контроль над формой имеет фокус?
В другом месте я читал, что для того, чтобы зафиксировать штрих клавиши "Enter" в текстовом поле и использовать его, как если бы нажав кнопку, я должен установить свойство KeyPreview формы в true и проверить значение KeyDown.
Я хочу использовать эту функцию для нескольких элементов управления TextBox, каждая из которых связана с другой кнопкой.
Мой вопрос: как узнать, какой элемент управления вызвал событие KeyPress?
Отправитель указан как сама форма.
С
Ответы
Ответ 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" и проверить, какой из наборов текстовых полей он принадлежит.
Вы спрашивали себя, какова должна быть кнопка по умолчанию, если она не является одним из этих текстовых полей?
Ответ 3
Вы пробовали Form.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