#vb.net #winforms
#vb.net #winforms
Вопрос:
Кажется, я не могу сфокусировать ввод на текстовом поле при первом появлении страницы вкладки (я использую Windows Forms, VB.NET 3.5).
У меня есть текстовое поле на панели на странице вкладки, и я хочу, чтобы фокус был на текстовом поле при открытии страницы вкладки. Я хочу, чтобы пользователь мог сразу начать печатать в выделенном текстовом поле без необходимости нажимать на текстовое поле. У меня установлены остановки табуляции в нужном мне порядке, и текстовое поле является первой остановкой табуляции. Вкладка перестает работать, за исключением того, что при открытии страницы вкладки фокус не сосредоточен на текстовом поле, то есть на том, которое является первым в порядке табуляции.
В обработчике события ввода страницы вкладки я вызываю метод фокусировки текстового поля, но он возвращает False и ничего не делает, никаких сообщений об ошибках. Я знаю, что могу получить доступ к текстовому полю, потому что в той же точке кода я могу задать текст текстового поля.
Если это имеет значение, макет страницы вкладки немного сложный:
frmFoo/TabControl1/TabPageX/Panel1/Panel2/TextBox1
Я хочу установить фокус на TextBox1.
- Каков наилучший способ сфокусироваться на желаемом текстовом поле?
- Если настройка фокуса — лучший способ, почему текстовое поле.Сбой метода 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()
, форма НЕ будет отображаться до завершения события загрузки.
Для элемента управления tab обработайте _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
Вы все равно захотите установить начальный фокус в событии загрузки, как показано выше, если первым выбранным полем должно быть текстовое поле на элементе управления tab.
Комментарии:
1. Я пытаюсь установить фокус в событии ввода страницы вкладки, думая, что событие ввода относится к странице вкладки, как событие загрузки к форме, т. Е. это то, где вы инициализируете вещи.
2. Вы хотите обработать событие _SelectedIndexChanged:
3. Да, установка фокуса в обработчике событий TabControl1_SelectedIndexChanged решила проблему. Спасибо за вашу помощь.
4. Вы также можете сделать это в обработчике для
Me.Shown
Ответ №2:
Попробуйте либо:
Me.ActiveControl = TextBox1
или
TextBox1.Select()
Комментарии:
1. Когда я делаю первое, я не вижу никакого эффекта на пользовательский интерфейс; когда я запрашиваю Me.ActiveControl в отладчике, он выводит TextBox1, поэтому я предполагаю, что TextBox1 является активным элементом управления, но он не помещает курсор в текстовое поле.
2. Когда я выполняю второе (TextBox1.Select(0,0)), ничего не происходит.
3. Извините, попробуйте
TextBox1.Select()
4. 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
Event можно установить Select TextBox
. Я думаю, что некоторые другие элементы крадут фокус. пожалуйста, измените
Комментарии:
1. Я решил проблему, установив фокус в TabControl1. Выбран обработчик события indexchanged. Спасибо за вашу помощь.
Ответ №5:
Ни одно из решений, которые я нашел в Интернете, не решает проблему, когда элемент управления находится на странице вкладки.
Однако это работает:
(1) установите для TabIndex элемента управления значение 0.
(2) В вашем коде, который обрабатывает событие tabpage, выполните следующее:
SendKeys.Send("{TAB}")
Если SendKeys не кажется допустимым статментом, убедитесь, что у вас есть следующий импорт в верхней части вашего файла кода:
Imports System.Windows.Forms
Ответ №6:
Я обнаружил, что TabControl получает фокус при завершении выбранного события. Чтобы это сработало, я использовал событие 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()
функции.
Ответ №9:
Вы бы попробовали это?
Me.Activate()
TextBox1.Focus()
TextBox1.SelectAll()
Комментарии:
1. дополнительная информация улучшила бы этот ответ