Невозможно настроить фокус на текстовое поле Windows Forms
Я не могу получить фокус ввода в текстовом поле при первой странице вкладки (я использую Windows Forms, VB.NET 3.5).
У меня есть текстовое поле на панели на закладке, и я хочу, чтобы фокус находился в текстовом поле при появлении закладки. Я хочу, чтобы пользователь мог сразу вводить текст в сфокусированном текстовом поле, не нажимая на текстовое поле. У меня есть табуляторы, установленные в том порядке, в котором я хочу, и текстовое поле является первой вкладкой. Закладка табуляции работает, за исключением того, что когда появляется страница закладки, фокус не находится в текстовом поле, то есть тот, который первый в порядке табуляции.
В обработчике ввода Enter на закладке я вызываю метод Focus текстового поля, но он возвращает False и ничего не делает, никаких сообщений об ошибках. Я знаю, что могу получить доступ к текстовому полю, потому что
в той же точке кода я могу установить текст текстового поля.
Если это имеет значение, макет страницы вкладки немного сложнее:
frmFoo/TabControl1/TabPageX/Panel1/Panel2/TextBox1
Я хочу сосредоточиться на TextBox1.
- Каков наилучший способ сосредоточиться на желаемом текстовом поле?
- Если настройка фокуса - лучший способ, почему метод textbox.Focus() не работает?
Ответы
Ответ 1
Я предполагаю, что вы пытаетесь установить фокус в обработчике события загрузки формы? Если это так, вам нужно сделать Me.Show()
, чтобы фактически создать экранные элементы управления, прежде чем можно будет установить фокус. Что-то вроде:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.Show()
Application.DoEvents()
TextBox1.Focus()
End Sub
Если вы не выполняете Me.Show()
, форма НЕ отображается до завершения события загрузки.
Для элемента управления вкладкой обработайте событие _SelectedIndexChanged
:
Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As System.EventArgs) _
Handles TabControl1.SelectedIndexChanged
If TabControl1.SelectedTab.Name = "TabPage1" Then
TextBox2.Focus()
End If
If TabControl1.SelectedTab.Name = "TabPage2" Then
TextBox4.Focus()
End If
Вы все равно хотите установить начальную фокусировку в событии загрузки, как показано выше, если первое выбранное поле должно быть текстовым полем в элементе управления вкладкой.
Ответ 2
Попробуйте либо:
Me.ActiveControl = TextBox1
или
TextBox1.Select()
Ответ 3
Сделайте control.Focus()
в событии OnShown
. Вам не нужна никакая логика DoEvents, которая в любом случае не работала для меня.
Ответ 4
Вы должны использовать Selected
Событие TabControl
Private Sub TabControl1_Selected(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles TabControl1.Selected
If e.TabPage.Name = "TabPage1" Then
TextBox1.Select()
End If
End Sub
Как я проверил как в TabControl.Selected
, так и в TabPage.Enter
Событие может установить Select TextBox
. Я думаю, что есть некоторые другие элементы, крадущие фокус. пожалуйста, измените
Ответ 5
Любое из решений, которые я нашел в Интернете, не решает проблему, когда элемент управления находится на закладке.
Однако это работает:
(1) установите для TabIndex элемента управления значение 0.
(2) В коде, который обрабатывает событие tabpage, выполните следующие действия:
SendKeys.Send("{TAB}")
Если SendKeys не является действительным статусом, убедитесь, что у вас есть следующий импорт в верхней части файла кода:
Imports System.Windows.Forms
Ответ 6
Я обнаружил, что TabControl получает фокус, когда событие Selected завершено. Чтобы выполнить эту работу, я использовал событие Paint для TabPage, чтобы установить фокус желаемого объекта.
Private Sub TabChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tab1.Paint, Tab2.Paint, Tab3.Paint
Select Case sender.Name
Case "Tab1"
Textbox1.Focus()
Case "Tab2"
T3extbox2.Focus()
Case "Tab3"
Textbox3.Focus()
End Select
End Sub
Ответ 7
Попробуйте событие Activated
формы следующим образом:
Private Sub Form2_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
'SendKeys.Send("{TAB}") this line works too
TextBox1.Focus()
End Sub
Это гарантировано.
Ответ 8
У меня была одна и та же проблема, но я решил ее использовать с помощью функции Me.activate()
.